Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby gsub的时间复杂度_Ruby_Regex_Big O_Time Complexity - Fatal编程技术网

Ruby gsub的时间复杂度

Ruby gsub的时间复杂度,ruby,regex,big-o,time-complexity,Ruby,Regex,Big O,Time Complexity,长字符串s仅包含0和1。此Ruby代码统计有多少个1: s.gsub(/1/).count 大O表示法的时间复杂度是多少?是否有一个工具来进行计算?据我所知,没有一个通用工具来计算任意代码的大O符号-这将是一项艰巨的任务-首先,并不总是清楚要测量哪个缩放问题。即使是非常简单的逻辑,a=b+c也不能像您所想的那样扩展-如果您需要允许任意大的数字,那么这不是O(1) 最简单的方法是基准测试和绘制结果。您应该知道,对于高效的代码,例如方法调用开销,可以“淹没”缩放度量。所以这需要一点努力——你需要找

长字符串
s
仅包含
0
1
。此Ruby代码统计有多少个
1

s.gsub(/1/).count

大O表示法的时间复杂度是多少?是否有一个工具来进行计算?

据我所知,没有一个通用工具来计算任意代码的大O符号-这将是一项艰巨的任务-首先,并不总是清楚要测量哪个缩放问题。即使是非常简单的逻辑,
a=b+c
也不能像您所想的那样扩展-如果您需要允许任意大的数字,那么这不是
O(1)

最简单的方法是基准测试和绘制结果。您应该知道,对于高效的代码,例如方法调用开销,可以“淹没”缩放度量。所以这需要一点努力——你需要找到足够大的N值,使它加倍,产生显著的差异

为了验证您的命令在字符串长度上是否为
O(N)
,我运行了以下基准测试:

require 'benchmark'

def times_for length
  str = '012123132132121321313232132313232132' * length
  Benchmark.bm do |x|
    x.report( :gsub ) { 1000.times { str.gsub(/1/).count } }
  end
end

times_for 250
       user     system      total        real
gsub  1.510000   0.000000   1.510000 (  1.519658)


times_for 500
       user     system      total        real
gsub  2.960000   0.000000   2.960000 (  2.962822)


times_for 1000
       user     system      total        real
gsub  5.880000   0.010000   5.890000 (  5.879543)
通过检查,您可以看到这是一个简单的线性关系-每次我将字符串长度加倍,所用的时间(大致)就会加倍

顺便说一句,
s.count('1')
要快得多,但也是
O(N)


您可以从基准测试中获取返回值,并使用它们自动猜测大O。这可能是CoDibility之类的服务所做的。

可能是
O(N)
其中N是字符串的长度。由于其他原因,通过正则表达式引擎可能效率低下,但不会改变时间复杂度,例如,如果它比其他方法花费的时间长3倍。e、 g.
s.count('1')
+1获取详细答案。我也不知道用那种方式使用count。酷!
times_for 250
       user     system      total        real
count  0.010000   0.000000   0.010000 (  0.008791)

times_for 500
       user     system      total        real
count  0.010000   0.000000   0.010000 (  0.016489)

times_for 1000
       user     system      total        real
count  0.020000   0.000000   0.020000 (  0.029052)