当时发表我的问题,我真的不清楚。需要这个问题的帮助。
给定一个内部有100万个值和整数N的csv文件,我必须提出一个算法来检查文件中是否存在N,如果是,则返回true,如果不是则返回false。这些值被放入一个数组中。
使用for循环本身需要几个小时,我需要在5分钟内完成此迭代。
编辑:我想出了二进制搜索的代码。不幸的是,这花了超过5分钟。如何加快搜索过程?def exist?(id)
employee_list = $employee_list
mid = employee_list.length / 2
while mid != 0 and mid+1 != employee_list.length
a = employee_list[mid]
if a != id
if a > id
if mid<=employee_list.length/2
mid = mid / 2
elsif mid>employee_list.length/2
mid = ((mid-(employee_list.length/2))/2) + ((employee_list.length)/2)
end
elsif a < id
if mid>=employee_list.length/2
mid = mid + ((employee_list.length-mid)/2)
elsif mid<employee_list.length/2
mid = (((employee_list.length/2) - mid)/2) + mid
end
end
else
return true
end
end
return false
end
答案 0 :(得分:1)
使用for循环本身需要数小时
那不是真的。这将花不到一秒钟。
如果您只需要执行一次:
如果您需要更多logN
次:
蛮力将花费你O(n)
二进制搜索会花费O(n*log(n))
进行排序(一般情况下)+ O(log(n))
进行搜索。
使用哈希会花费O(n)
来构建Hash
并分摊O(1)
进行查找。
答案 1 :(得分:-1)
这里我使用随机整数初始化一个包含100万个值的数组。测试值为4.
array = Array.new(1_000_000) { rand(1_000_000_000_000) }
test_val = 494_930_039
要检查数组中是否有任何值等于测试值,您只需要在数组上使用any?
方法。像这样,
array.any? {|x| x == test_val }
这将返回true
或false
。
基准测试结果
user CPU time 0.050000s
system CPU time 0.000000s
the sum of the user and system CPU times 0.050000s
the elapsed real time 0.050704s