补充含零的数列二分法方法: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集合差值法效率。
声明:仅仅做了简单的测试,只能就本机环境和客观条件说明结论,不能证明其适用所有环境及条件。