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)