【发布时间】:2016-05-27 16:40:10
【问题描述】:
我为此提出了分而治之的算法。只是想知道这是否可行?
第一个 mid 是从整数范围即 (0+(1>1 计算出来的,然后应用这个想法:从 start 到 mid 或从 mid 到 end 的数字范围总是小于比我们在考虑十亿数字时要考虑的数字,并且肯定会有一些数字会重复,因为与十亿数字相比,32 位整数的范围要小得多。
def get_duplicate(input, start, end):
while True:
mid = (start >> 1) + end - (end >> 1)
less_to_mid = 0
more_to_mid = 0
equal_to_mid = 0
for data in input:
data = int(data, 16)
if data < mid:
less_to_mid += 1
elif data == mid:
equal_to_mid += 1
else:
more_to_mid += 1
if equal_to_mid > 1:
return mid
elif mid-start < less_to_mid:
end = mid-1
elif end-mid < more_to_mid:
start = mid+1
with open("codes\output.txt", 'r+') as f:
content = f.read().split()
print(get_duplicate(content, 0, 1<<32-1))
我知道我们可以使用位数组,但我只是想了解您对此解决方案的看法,以及实施是否存在问题。
【问题讨论】:
-
你计算过 2^32 吗?
-
对它们进行排序,然后你只需要检查每个人与下一个。
-
@AntiHeadshot:排序需要更多的内存,而内存并不存在。
-
@nomanpouigt 您不必将所有内容加载到 ram 中进行排序。
标签: algorithm numbers numeric numerical-methods divide-and-conquer