什么是Ruby在这种文件中搜索单词的最有效方法

时间:2017-07-06 06:10:09

标签: ruby algorithm

我有一个类似的文件:

Fruit.Store={
    #blabla
    "customer-id:12345,item:store/apple" = 10;   #blabla
    "customer-id:23456,item:store/banana" = 10;   #blabla
    "customer-id:23456,item:store/watermelon" = 10;
    #blabla
    "customer-id:67890,item:store/watermelon" = 10;
}

除了评论之外,每一行都具有相同的格式:customer-id和item:store /是固定的,customer-id是一个5位数字。文件中大约有1000个唯一行。输入“12345”和“apple”时,应返回第一行。 Ruby解决这个问题的最有效方法是什么?谢谢!

2 个答案:

答案 0 :(得分:1)

def lookup(input, id, fruit)
  IO.foreach(input).detect do |line|
    line =~ %r|^\p{Space}*customer-id:#{id},item:store/#{fruit}|
  end
end
lookup("/path/to/file", 12345, 'apple')
#⇒ "    \"customer-id:12345,item:store/apple\" = 10;   #blabla\n"

答案 1 :(得分:1)

  

Ruby解决这个问题的最有效方法是什么?

假设您可以立即将整个数据集加载到内存中并保留在那里。

在加载时,将文件转换为此形状的哈希值。

data = {
  [12345, 'apple'] => 10,
  [23456, 'banana'] => 10,
  ...
}

然后你就这样做了:

data[[12345, 'apple']] # => 10 or nil (if not found)

这为您提供了O(1)查找。你不可能比这更有效率。

如果你想直接处理文件,那么你可以逐行阅读文件并尝试检测匹配行,如@ mudasobwa的回答所示。在这种情况下查找的效率要低得多,但另一方面,它不需要预处理。因此,如果您只想进行一次查找,那么整体效率可能更高。