我正在用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]
答案 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}