如何提高这个小Ruby函数的性能?

如何提高这个小Ruby函数的性能?,ruby,Ruby,我目前正在进行Ruby质询,由于超时,错误被终止 对于某些测试用例,字符串输入非常长,超过10.000个字符 如何改进代码 Ruby挑战描述 您将获得一个仅包含字符a和B的字符串。您的任务是将其更改为字符串,以便没有匹配的相邻字符。为此,允许删除字符串中的零个或多个字符 您的任务是找到所需删除的最小数量 例如,给定字符串s=AABAAB,删除位置0和3处的一个,使s=ABAB在2次删除中 我的职能 谢谢大家! 这可以更快地返回计数: str.size - str.chars.chunk_whil

我目前正在进行Ruby质询,由于超时,错误被终止 对于某些测试用例,字符串输入非常长,超过10.000个字符

如何改进代码

Ruby挑战描述 您将获得一个仅包含字符a和B的字符串。您的任务是将其更改为字符串,以便没有匹配的相邻字符。为此,允许删除字符串中的零个或多个字符

您的任务是找到所需删除的最小数量

例如,给定字符串s=AABAAB,删除位置0和3处的一个,使s=ABAB在2次删除中

我的职能
谢谢大家!

这可以更快地返回计数:

str.size - str.chars.chunk_while{ |a, b| a == b }.to_a.size
第二部分结合实际运用了该方法。 通过这种方式,第二部分在子阵列中分组:

'aababbabbaab'.chars.chunk_while{ |a, b| a == b}.to_a
#=> [["a", "a"], ["b"], ["a"], ["b", "b"], ["a"], ["b", "b"], ["a", "a"], ["b"]]

这样可以更快地返回计数:

str.size - str.chars.chunk_while{ |a, b| a == b }.to_a.size
第二部分结合实际运用了该方法。 通过这种方式,第二部分在子阵列中分组:

'aababbabbaab'.chars.chunk_while{ |a, b| a == b}.to_a
#=> [["a", "a"], ["b"], ["a"], ["b", "b"], ["a"], ["b", "b"], ["a", "a"], ["b"]]
如果您可以使用以下选项,则可以忽略:

否则,您可以尝试使用一个正则表达式,该正则表达式与前面有另一个a或B的a或B相匹配:

使用enum_for可避免创建中间数组。

如果可以使用:

否则,您可以尝试使用一个正则表达式,该正则表达式与前面有另一个a或B的a或B相匹配:

使用enum_可避免创建中间数组。

主要问题是:

事实上,您没有将字符保存到变量中。s、 字符将字符串拆分为一个字符数组。循环外的第一个s.chars调用很好。但是,没有理由对s中的每个字符都这样做。这意味着如果您有一个10.000个字符的字符串,您将实例化大小为10.000的10.001数组

重新使用字符阵列将大大提高性能:

需要“基准” s= 选项=%w[A B] 主要问题是:

事实上,您没有将字符保存到变量中。s.chars会将字符串拆分为一个字符数组。循环外部的第一个s.chars调用是可以的。但是没有理由对s中的每个字符都这样做。这意味着如果您有一个10.000个字符的字符串,您将实例化大小为10.000的10.001数组

重新使用字符阵列将大大提高性能:

需要“基准” s= 选项=%w[A B]
10|000.times{s我没有对它进行基准测试,但我的感觉是为s.chars数组的每个元素调用块会占用很多时间。如果不创建临时数组,只需在字符上循环,即s.size.times{idx | char=s[idx];next|char=s[idx+1];…},我发现它在我的安装中比Ruby,Cygwin快。好吧,我明白了,确实快了。谢谢!我想知道我的建议或iGian给出的anser中的建议是否更快……我没有对它进行基准测试,但我的感觉是为s.chars数组的每个元素调用块会占用很多时间。如果不创建临时数组,但是只需在字符上循环,即s.size.times{| idx | char=s[idx];next_char=s[idx+1];…},我发现它在我的安装中更快了。好的,我知道了,确实更快了。谢谢!我想知道我的建议或iGian给出的答案中的建议是否更快了…你可以选择写str.gsub/?你可以选择写str.gsub/?…或者str.size-str.each_char.chunk&:本身到a.size…或者str.size-str.eachar.chunk&:自身大小。
str.enum_for(:scan, /(?<=A)A|(?<=B)B/).count
s.chars.each_with_index { |char, idx| counter += 1 if s.chars[idx + 1] == char }