两个间隔差异的算法是什么?

时间:2019-06-19 00:17:17

标签: python algorithm intervals

我正在用Python编写一个程序,其中有2个间隔作为输入,然后它必须返回3个操作: -联合(A | B) -交叉路口(A和B) -差异

我尝试为间隔A和B设置集合,然后使用set方法(AB)减去它们,但是它没有意义,因为它必须返回一个间隔而不是一个集合,并且我区分open / closed / open_closed等间隔。

输入: [3,10) (5,16]

输出: 差异A \ B:[3,5] 差异B \ A:[10,16]

3 个答案:

答案 0 :(得分:1)

我们用以下数据代表间隔I

{i, j}  "the limits" with
I.left = I.includes(i)
I.right = I.includes(j)

请注意

I.isEmpty = (i > j) | (i = j) & (I.left.not | I.right.not)

现在采取两个间隔A = {a1, a2}B = {b1, b2}。我们有

A - B = A & (-inf, b1} | A & {b2, +inf)

使用

(-inf, b1}.left = false
(-inf, b1}.right = B.left.not

{b2, +inf).left = B.right.not
{b2, +inf).right = false.

请注意,这可以减少计算两个相交的问题,您可以使用一般性来做。但是,为了完整起见,让我们在此处进行详细操作:

A & (-inf, b1} = {a1, min(a2, b1)} with
(A & (-inf, b1}).left = A.left
(A & (-inf, b1}).right = 
                         if(a2 < b1) A.right
                         elseif(a2 = b1) A.right & B.left.not
                         else B.left.not

A & {b2, +inf) = {max(a1, b2), a2} with
(A & {b2, +inf)).left = 
                        if(a1 < b2) B.right.not
                        elseif(a1 = b2) A.left & B.right.not
                        else A.left
(A & {b2, +inf)).right = A.right

由于可以将差异减少为两个相交的并集,因此一般情况下,在两个间隔A = {a1, a2}B = {b1, b2}之间,值得解决该相交。

A & B = {max(a1, b1), min(a2, b2)} with
(A & B).left = if(a1 < b1) B.left elseif(a1 = b1) A.left & B.left else A.left
(A & B). right = if(a2 < b2) A.right elseif(a2 = b2) A.right & B.right else B.right

答案 1 :(得分:0)

您是否尝试过填充时间间隔的集合表示形式,然后应用集合操作?例如:

间隔[3,10)-> set(3,4,5,6,7,8,9)

时间间隔(5,16]-> set(6,7,8,9,10,11,12,13,14,15,16)

也许range在填补空白方面会很有帮助。

答案 2 :(得分:0)

我没有完全理解您的问题。 但是尝试一下,希望这就是您要寻找的东西:

A = set(range(3,10)) # {3, 4, 5, 6, 7, 8, 9}
B = set(range(6,17)) # {6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}

u = A.union(B) # {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}
v = A.intersection(B) # {6, 7, 8, 9}
x = A.difference(B) # {3, 4, 5}
y = B.difference(A) # {10, 11, 12, 13, 14, 15, 16}
相关问题