搜索未排序数组的高效算法

时间:2016-09-01 15:09:18

标签: ruby iteration

当时发表我的问题,我真的不清楚。需要这个问题的帮助。

给定一个内部有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

2 个答案:

答案 0 :(得分:1)

  

使用for循环本身需要数小时

那不是真的。这将花不到一秒钟。

如果您只需要执行一次:

  1. 使用强力(循环)
  2. 如果您需要更多logN次:

    1. 将数组转换为Set / Hash
    2. 检查您的号码是否存在于哈希
    3. 蛮力将花费你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 }

这将返回truefalse

基准测试结果

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