【问题标题】:How to improve time complexity of this code?如何提高这段代码的时间复杂度?
【发布时间】:2014-10-28 18:46:02
【问题描述】:

如何提高这段代码的时间复杂度??

 $s = "Name";
    for($i=0; $i<strlen($s); $i++) {

    //some code

    }

【问题讨论】:

  • 这并不复杂,你为什么这么认为?
  • 你知道这个 for 循环是所有迭代循环中最快的吗?
  • 抱歉,我在想javascript。尽管如此,基本的 for 循环仍然非常快。此时您正在执行微优化
  • 除非你在循环中修改$s的长度,否则使用$lenS = strlen($s); for($i=0; $i&lt;$lenS; $i++) { //some code };并作为进一步的微优化使用++$i 而不是$i++
  • 不知道问题就不可能猜出算法。

标签: php algorithm time-complexity


【解决方案1】:

这取决于 PHP 对字符串和strlen() 的实现。如果它是 O(n)(它在 GNU 的 C strlen() 中),则 OP 代码的复杂性将是 O(n²)。在这种情况下,将 strlen() 移出循环将提高到 O(n):

$length = strlen($s);
for($i=0; $i<$length; $i++) {

//some code

}

但是如果strlen()的复杂度是O(1) (e.g. C++),代码在O(n)中,你不能再改进了。

我不得不承认,我并不精通 C/C++,但我猜长度是 zend_string 的一个简单属性,即 PHP's strlen() 是 O(1):

ZEND_FUNCTION(strlen)
{
    zend_string *s;
    // [..]
    RETVAL_LONG(s->len);
}

【讨论】:

  • 你是对的,在核心 PHP 中 strlen() 是 O(1)。将对 strlen() 的调用移出循环不会改变时间复杂度,只是将 n 个函数调用的开销减少到单个函数调用是一个实现细节
猜你喜欢
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 2019-09-27
  • 2016-11-08
  • 1970-01-01
  • 2020-07-24
  • 2021-06-23
相关资源
最近更新 更多