且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

PHP 内置函数复杂度(isAnagramOfPalindrome 函数)

更新时间:1970-01-01 07:57:00

不包含此信息的一个可能原因是每个版本可能会更改,因为针对一般情况.

A probable reason for not including this information is that is is likely to change per release, as improvements are made / optimizations for a general case.

PHP 是建立在 C 之上的,有些函数只是对 C 对应物的包装,例如 hypot google 搜索,看看 man hypot,在他数学库的文档http://www.gnu.org/software/libc/manual/html_node/Exponents-and-Logarithms.html#Exponents-and-Logarithms

PHP is built on C, Some of the functions are simply wrappers around the c counterparts, for example hypot a google search, a look at man hypot, in the docs for he math lib http://www.gnu.org/software/libc/manual/html_node/Exponents-and-Logarithms.html#Exponents-and-Logarithms

来源实际上没有提供更好的信息https://github.com/lattera/glibc/blob/b1042d5d8eeb263b4cf4caaea138c4ad/math/w_hypot.c"math/w_hypot.c(非官方,只是易于链接)

The source actually provides no better info https://github.com/lattera/glibc/blob/a2f34833b1042d5d8eeb263b4cf4caaea138c4ad/math/w_hypot.c (Not official, Just easy to link to)

更不用说,这只是glibc,Windows会有不同的实现.所以每个编译 PHP 的操作系统甚至可能有一个不同的大 O

Not to mention, This is only glibc, Windows will have a different implementation. So there MAY even be a different big O per OS that PHP is compiled on

另一个原因可能是因为它会使大多数开发人员感到困惑.我认识的大多数开发人员只会选择一个具有***"大 O 的函数

Another reason could be because it would confuse most developers. Most developers I know would simply choose a function with the "best" big O

最大值并不总是意味着它更慢

http://www.sorting-algorithms.com/

对某些函数发生的事情有一个很好的视觉支持,即冒泡排序是一种慢"排序,但对于几乎排序的数据来说,它是最快的排序之一.快速排序是许多人会使用的,这对于几乎排序的数据实际上非常慢.大 O 是最坏的情况 - PHP 可能会在发布它们应该针对特定条件进行优化的版本和这将改变函数的大 O 之间做出决定,并且没有简单的方法来记录这一点.

Has a good visual prop of whats happening with some functions, ie bubble sort is a "slow" sort, Yet its one of the fastest for nearly sorted data. Quick sort is what many will use, which is actually very slow for nearly sorted data. Big O is worst case - PHP may decide between a release that they should optimize for a certain condition and that will change the big O of the function and theres no easy way to document that.

这里有部分列表(我猜你已经看到了)

PHP 函数的 Big-O 列表

其中列出了一些更常见的 PHP 函数.

Which does list some of the more common PHP functions.

对于这个特定的例子......

无需使用内置函数即可轻松解决.

Its fairly easy to solve without using the built in functions.

示例代码

function isPalAnagram($string) {
  $string = str_replace(" ", "", $string);
  $len = strlen($string);
  $oddCount = $len & 1;
  $string = str_split($string);
  while ($len > 0 && $oddCount >= 0) {
    $current = reset($string);
    $replace_count = 0;
    foreach($string as $key => &$char) {
      if ($char === $current){
        unset($string[$key]);
        $len--;
        $replace_count++;
        continue;
      }
    }
    $oddCount -= ($replace_count & 1);
  }

  return ($len - $oddCount) === 0;

}

利用不能超过 1 个奇数的事实,您可以从数组中提前返回.

Using the fact that there can not be more than 1 odd count, you can return early from the array.

认为我的也是 O(N) 时间,因为据我所知,最坏的情况是 O(N).

I think mine is also O(N) time because its worst case is O(N) as far as I can tell.

测试

$a = microtime(true);
for($i=1; $i<100000; $i++) {
  testMethod("the quick brown fox jumped over the lazy dog");
  testMethod("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
  testMethod("testest");
}
 printf("Took %s seconds, %s memory", microtime(true) - $a, memory_get_peak_usage(true));

使用非常旧的硬件运行测试我的方式

Tests run using really old hardware My way

Took 64.125452041626 seconds, 262144 memory

你的方式

Took 112.96145009995 seconds, 262144 memory

我很确定我的方法也不是最快的方法.

I'm fairly sure that my way is not the quickest way either.

对于 PHP 以外的语言(例如 Java),我实际上看不到太多信息.

I actually cant see much info either for languages other than PHP (Java for example).

我知道这篇文章的很多内容都在猜测为什么它不在那里,并且从可靠来源中提取的内容不多,我希望它可以部分解释为什么文档页面中没有列出大 O

I know a lot of this post is speculating about why its not there and theres not a lot drawing from credible sources, I hope its an partially explained why big O isnt listed in the documentation page though