加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – gsub的时间复杂度

发布时间:2020-12-17 03:40:47 所属栏目:百科 来源:网络整理
导读:一个长字符串s只包含0和1.这个 Ruby代码计算有多少1: s.gsub(/1/).count Big O表示法的时间复杂度是多少?有没有工具可以进行计算? 解决方法 据我所知,没有一个通用的工具来计算任意代码的Big O表示法 – 这将是一项艰巨的任务 – 一开始并不总是清楚要测
一个长字符串s只包含0和1.这个 Ruby代码计算有多少1:

s.gsub(/1/).count

Big O表示法的时间复杂度是多少?有没有工具可以进行计算?

解决方法

据我所知,没有一个通用的工具来计算任意代码的Big 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):

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)

您可以从基准测试中获取返回值,并使用它们自动猜测Big O.这可能是像codility这样的服务.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读