如何反转单词并比较算法



下面两种类型的代码有什么区别? 我自己的代码有没有问题?我的代码运行良好,但它与引导式解决方案代码不同,所以我很好奇。

我的代码:

def reverse(word)
i = 1
l = word.length
letter = word[l-i]
while i <= l-1
letter += word[l-i-1]
i += 1
end
return letter
end
puts reverse("cat")          # => "tac"
puts reverse("programming")  # => "gnimmargorp"
puts reverse("bootcamp")     # => "pmactoob"

引导式解决方案代码:

def reverse(word)
reversed = ""
i = 0
while i < word.length
char = word[i]
reversed = char + reversed
i += 1
end
return reversed
end
puts reverse("cat")          # => "tac"
puts reverse("programming")  # => "gnimmargorp"
puts reverse("bootcamp")     # => "pmactoob"

比较各种做某事的方式的速度总是很有趣的。我添加了一些额外的方法来显示它们的比较方式:

require 'fruity'
def reverse1(word)
i = 1
l = word.length
letter = word[l-i]
while i <= l-1
letter += word[l-i-1]
i += 1
end
return letter
end
def reverse2(word)
reversed = ""
i = 0
while i < word.length
char = word[i]
reversed = char + reversed
i += 1
end
return reversed
end
# ---------------------------------
# my added methods
def reverse3(word)
reversed = ''
word.length.times do |i|
reversed << word[-1 - i]
end
reversed
end
# a short, but naive, attempt
def reverse4(word)
word.split('').reverse.join
end
# how we should do it
def reverse5(word)
word.reverse
end
DA_STRING = 'pneumonoultramicroscopicsilicovolcanoconiosis'
# confirm the methods return the same value
reverse1(DA_STRING) # => "sisoinoconaclovociliscipocsorcimartluonomuenp"
reverse2(DA_STRING) # => "sisoinoconaclovociliscipocsorcimartluonomuenp"
reverse3(DA_STRING) # => "sisoinoconaclovociliscipocsorcimartluonomuenp"
reverse4(DA_STRING) # => "sisoinoconaclovociliscipocsorcimartluonomuenp"
reverse5(DA_STRING) # => "sisoinoconaclovociliscipocsorcimartluonomuenp"
# time them
compare do
reverse_1 { reverse1(DA_STRING) }
reverse_2 { reverse2(DA_STRING) }
reverse_3 { reverse3(DA_STRING) }
reverse_4 { reverse4(DA_STRING) }
reverse_5 { reverse5(DA_STRING) }
end

运行代码会导致:

# >> Running each test 8192 times. Test will take about 7 seconds.
# >> reverse_5 is faster than reverse_3 by 36x ± 1.0
# >> reverse_3 is faster than reverse_1 by 50.0% ± 10.0%
# >> reverse_1 is similar to reverse_2
# >> reverse_2 is faster than reverse_4 by 39.99999999999999% ± 10.0%

看来您的指南主要考虑了以下几件事。

  • 通过尽可能减少变量创建来最小化内存分配

    直接使用word.length而不是创建变量,因为变量l在您的情况下将无法在其他任何地方重用。

  • 通过尽可能减少操作次数来最小化处理时间

    似乎在引导程序中避免了word[l-i]l-1word[l-i-1]的额外操作。

最新更新