如何更快地制作这个Ruby拼图解决方案?

时间:2011-12-20 07:54:37

标签: ruby optimization puzzle

我讨厌拼图网站的一个原因是因为他们告诉你什么时候你失败但你无法学习如何改进。我通常不喜欢发布这类问题,但我浪费了太多时间试图弄清楚为什么会失败我必须知道答案!

这是我的代码:

ARGF.each do |line|
  if ARGF.lineno > 1
    string_a = line.strip
    string_b = line.strip
    sum = string_a.size
    (0...string_a.size).each do |i|
      string_b[0] = '' 
      (0...string_b.size).each do |j|
        break if string_a[j] != string_b[j]
        sum = sum + 1 
      end 
    end
    puts sum
  end
end

这是问题(如果你好奇的话):http://pastie.org/3044657

它通过了大多数测试,但由于优化原因后来失败了。我很想知道如何优化它。我不知道如何“识别和学习”如何优化。

PS。这是最入门级的谜题,所以我非常怀疑它是通过走过这个来伤害任何人的。

1 个答案:

答案 0 :(得分:1)

您的算法是O(n²)。通过优化代码,您无能为力。

稍微改善给定算法性能的一些想法:

  • 将字符串拆分为数组。
  • 找到j string_a[j] != string_b[j] sum后,j增加ary = line.strip.chars.to_a n = ary.count sum = (1...n).inject(n) do | sum, i | sum + (n-i).times { | j | break j if ary[j] != ary[j + i] } end 而不是计算每个相等的对。

对于我的测试用例,此代码的速度大约是我的机器的两倍:

{{1}}