Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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中,什么';str.length的时间成本是多少?_Ruby_String_Time Complexity - Fatal编程技术网

在ruby中,什么';str.length的时间成本是多少?

在ruby中,什么';str.length的时间成本是多少?,ruby,string,time-complexity,Ruby,String,Time Complexity,我以前错误地要求str.count,而我真正的意思是str.length。感谢回复者回复我 这是恒定时间操作还是线性时间?我知道Java中的时间是常数,C中的时间是线性时间,这取决于Ruby中的情况,但不确定Ruby中的情况。统计字符串中(一组)子字符串的出现次数。为了做到这一点,它必须将每个字符与谓词集进行比较,没有其他方法 它不可能比O(n)快。琐碎的实现是O(n),因此为了使它比O(n)慢,您必须格外愚蠢并做额外的工作。因此,由于它不能比O(n)快,我们可以假设没有人会愚蠢或恶意地故意使它

我以前错误地要求str.count,而我真正的意思是str.length。感谢回复者回复我

这是恒定时间操作还是线性时间?我知道Java中的时间是常数,C中的时间是线性时间,这取决于Ruby中的情况,但不确定Ruby中的情况。

统计字符串中(一组)子字符串的出现次数。为了做到这一点,它必须将每个字符与谓词集进行比较,没有其他方法

它不可能比O(n)快。琐碎的实现是O(n),因此为了使它比O(n)慢,您必须格外愚蠢并做额外的工作。因此,由于它不能比O(n)快,我们可以假设没有人会愚蠢或恶意地故意使它比O(n)慢,我们可以安全地得出结论,它是O(n)

然而,这只是一个结论。这不是保证。Ruby语言规范不提供性能保证。但是你可以非常肯定的是,如果Ruby实现不是O(n),它会被嘲笑,不会被使用,就会消亡。

统计字符串中(一组)子字符串的出现次数。为了做到这一点,它必须将每个字符与谓词集进行比较,没有其他方法

它不可能比O(n)快。琐碎的实现是O(n),因此为了使它比O(n)慢,您必须格外愚蠢并做额外的工作。因此,由于它不能比O(n)快,我们可以假设没有人会愚蠢或恶意地故意使它比O(n)慢,我们可以安全地得出结论,它是O(n)

然而,这只是一个结论。这不是保证。Ruby语言规范不提供性能保证。但是你可以非常肯定的是,如果Ruby实现不是O(n)的话,它会被嘲笑,不会被使用,就会消亡。

复杂性是
O(n+m)

其中,
n
是字符串的大小,
m
是字符集参数的数量

  • O(m)
    用于从参数创建查找表/哈希
  • O(n)*O(1)
    用于将输入字符串与查找表/哈希进行比较
  • 根据接收者和参数,
    n
    m
    可能是主要因素

然而,如果你的意思是
String#length
那么它就是
O(1)
复杂度是
O(n+m)

其中,
n
是字符串的大小,
m
是字符集参数的数量

  • O(m)
    用于从参数创建查找表/哈希
  • O(n)*O(1)
    用于将输入字符串与查找表/哈希进行比较
  • 根据接收者和参数,
    n
    m
    可能是主要因素


然而,如果你的意思是
String#length
,那么它就是
O(1)

为什么不检查它们的源代码呢?源代码只告诉你一个特定实现的特定版本的功能。它没有告诉您任何关于语言规范所做保证的信息。我相信目前大约有5种Ruby实现。(当然,还有很多,但有5个是工业实力、生产就绪、仍在维护和开发中以及在实际使用中)你真的是指
String#count
,正如你的标题所要求的那样,还是指
String#length
,正如链接的问题所暗示的那样?对于您自己的特定用例来说,对答案感到自信的一个非常好的方法是使用Ruby的基准测试工具,如下所述:为什么不检查它们的源代码?源代码只告诉您一个特定实现的特定版本的功能。它没有告诉您任何关于语言规范所做保证的信息。我相信目前大约有5种Ruby实现。(当然,还有很多,但有5个是工业实力、生产就绪、仍在维护和开发中以及在实际使用中)你真的是指
String#count
,正如你的标题所要求的那样,还是指
String#length
,正如链接的问题所暗示的那样?对于您自己的特定用例来说,对这个问题的答案感到自信的一个非常好的方法是使用Ruby的基准测试工具,这里概述了:不完全是这样,它不计算子字符串,而是计算所有参数交叉处出现的字符。奇怪,我知道。@akuhn这与Perl启发的符号非常相似。它实际上在内部使用
tr\u find
tr\u setup\u table
。不完全是,它不计算子字符串,而是计算所有参数交叉处出现的字符。奇怪,我知道。@akuhn这与Perl启发的符号非常相似。它实际上在内部使用
tr\u find
tr\u setup\u table