Python中查找有序数列(整数数列)中缺失的最小数方法之set与二分法比较

2 篇文章 0 订阅
1 篇文章 0 订阅

补充含零的数列二分法方法:Python中查找有序数列(含0整数数列)中缺失的最小数方法之二分法

Python中查找有序数列(整数数列)中缺失的最小数的方法很多,这里对set集合差值法与二分法(递归)进行简单的对比。
pthon版本为3.9.8
代码如下:

# 二分法函数
def missingNumber(nums):
    begin = 1
    end = len(nums)
    while begin < end:
        mid = (begin + end) // 2
        if nums[mid - 1] == mid:
            begin = mid + 1
        else:
            end = mid
    return begin if nums[begin - 1] != begin else begin + 1


# 生成数列
array = list(range(1, 1000001))
array.remove(1)
print(f"有序数列列表长度:{len(array)},缺失数据为:1")
# set集合差值法:
time_1 = time.time()
d_value = list(set(range(1, max(array) + 2)) - set(array))
d_value.sort()
print(f"有序数列中缺失最小值为(集合查找法):{d_value[0]}")
time_2 = time.time()
# 二分法:
time_3 = time.time()
print(f"有序数列中缺失最小值为(二分法查找缺失):{solution.missingNumber(array)}")
time.sleep(1)  # 暂停1秒是为了避免除数为0
time_4 = time.time()
print(f"集合查找法用时:{time_2-time_1}")
print(f"二分法查找用时:{time_4-time_3-1}")
print(f"差异(倍数):{(time_2-time_1)/(time_4-time_3-1)}")

结果:
有序数列列表长度:99999,缺失数据为:1
有序数列中缺失最小值为(集合查找法):1
有序数列中缺失最小值为(二分法查找缺失):1
集合查找法用时:0.015648603439331055
二分法查找用时:0.004353761672973633
差异(倍数):3.5942719456765784

有序数列列表长度:99999,缺失数据为:50000
有序数列中缺失最小值为(集合查找法):50000
有序数列中缺失最小值为(二分法查找缺失):50000
集合查找法用时:0.015617132186889648
二分法查找用时:0.0073888301849365234
差异(倍数):2.1136136297634796

有序数列列表长度:999999,缺失数据为:1
有序数列中缺失最小值为(集合查找法):1
有序数列中缺失最小值为(二分法查找缺失):1
集合查找法用时:0.12983965873718262
二分法查找用时:0.001104116439819336
差异(倍数):117.59598358885769

有序数列列表长度:999999,缺失数据为:1
有序数列中缺失最小值为(集合查找法):50000
有序数列中缺失最小值为(二分法查找缺失):50000
集合查找法用时:0.11074686050415039
二分法查找用时:0.01434016227722168
差异(倍数):7.722845694714616

注:不同的测试,时间会又差异,因此比例会高低不同。
结论:对于大数据(超过10万次的长度)有序数列,二分法的执行效率会高于set集合差值法效率。

声明:仅仅做了简单的测试,只能就本机环境和客观条件说明结论,不能证明其适用所有环境及条件。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值