Python实现两个有序集合的交集和并集

    本文通过python实现简易的集合交并算法,输入是两个以递增顺序排序的集合,输出它们的有序交集和有序并集。

1、Union算法

def union(s1, s2):
    o = []
    i = j = 0
    s1_n = len(s1)
    s2_n = len(s2)
    while i < s1_n and j < s2_n:
        if s1[i] < s2[j]:
            o.append(s1[i])
            i += 1
        elif s1[i] == s2[j]:
            o.append(s1[i])
            i += 1
            j += 1
        else:
            o.append(s2[j])
            j += 1
    top = None
    if o: top = o[-1]
    if i < s1_n: o.extend(s1[i:] if s1[i] != top else s1[i+1:])
    if j < s2_n: o.extend(s2[j:] if s2[j] != top else s2[j+1:])
    return o

    算法图解:

 

 

2、Intersect算法

def intersect(s1, s2):
     if len(s1) == 0 or len(s2) == 0:
         return None
     o = []
     i = j = 0
     m = min(s1[-1], s2[-1])
     while s1[i] < m and s2[j] < m:
         if s1[i] == s2[j]:
             o.append(s1[i])
             i += 1
             j += 1
         elif s1[i] < s2[j]:
             i += 1 
         else: 
             j += 1
     if (s1[-1] == s2[j] == m) or (s2[-1] == s1[i] == m):
         o.append(m)
     return o

    算法图解 

 

 

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值