【问题标题】:Ruby code qn. How to decrease iterationRuby 代码 qn。如何减少迭代
【发布时间】:2017-01-09 05:11:19
【问题描述】:

我是 ruby​​ 新手,我想知道为什么会出现这个错误。 (抱歉格式错误)

错误:

rb37: in '%': nil can't be coerced into Fixnum (TypeError)

而且我的问题也需要帮助。我想想出一种方法来遍历 100 万个 ID 号码的列表,以使用最有效的方式(不到 5 分钟)找到特定的 ID。我整个下午都在这:(

def exist?(id)
    dump = []
    employee_list = $employee_list.sort    #employee_list is an array of 1 million lines of data, I have to look for a specific "id"

    while dump.length < id
        dump << employee_list.first 

        if dump.last != id 
            if id%dump.last != 0 && dump.last != 1
                 employee_list.delete_if { |n| n%dump.last == 0 }
 #what im doing here is to delete ID from employee_list that are multiples of n 
            elsif id%dump.last == 0 
                employee_list.delete_if { |m| m%dump.last == 0 && m!=id }
 #deleting multiples of m (excluding id itself) 
            end
        elsif dump.last == id 
            return true
        end
    end
    return false 
end

【问题讨论】:

  • 你真的想要一个包含一百万个项目的数组存储在内存中吗?并像这样排序?
  • 这是一个学校问题练习,它要求我提供一种更好的算法,而不是仅仅使用 for 循环来逐一检查,这需要花费数小时。
  • 在这种情况下,既然你有一个排序数组,为什么不实现二进制搜索,这比一般情况下的 1 比 1 比较快得多:en.wikipedia.org/wiki/Binary_search_algorithm
  • 循环浏览 100 万个项目需要好几个小时!?

标签: ruby iteration


【解决方案1】:

老实说,我完全不知道你的代码要做什么,但问题是:你循环直到你的 dump 数组的长度大于你正在搜索的 id 。在循环中,将employee_list 数组的第一个元素附加到dump 的末尾。您还删除了 employee_list 中的内容。

现在,根据id 的大小,您将经常循环。例如。假设id1234567890,您将循环超过十亿 次,并且将超过十亿个元素附加到dump 数组中。同时,您还不断地从employee_list 中删除内容。很有可能,在某个时间点,employee_list 将变为空,这意味着employee_list.first 将变为nil,您将附加nil 作为dump 的最后一个元素,因此您将尝试在第 9、10、12 或 13 行取 idnil 的模数。

就像我说的,我根本不明白你在做什么,所以我不能告诉你如何解决这个问题。

这是我解决问题的方法:

def exist?(id)
  $employee_list.find(id)
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多