Встроенная функция PHP (функция isAnagramOfPalindrome)

Я занимаюсь поиском в Интернете за последние 2 часа, и я не могу найти список встроенных функций php, связанных с временем и пространством. У меня проблема isAnagramOfPalindrome, чтобы решить следующую максимально допустимую сложность:

expected worst-case time complexity is O(N) expected worst-case space complexity is O(1) (not counting the storage required for input arguments). 

где N – длина входной строки. Вот мое самое простое решение, но я не знаю, находится ли он в пределах сложности.

 class Solution { // Function to determine if the input string can make a palindrome by rearranging it static public function isAnagramOfPalindrome($S) { // here I am counting how many characters have odd number of occurrences $odds = count(array_filter(count_chars($S, 1), function($var) { return($var & 1); })); // If the string length is odd, then a palindrome would have 1 character with odd number occurrences // If the string length is even, all characters should have even number of occurrences return (int)($odds == (strlen($S) & 1)); } } echo Solution :: isAnagramOfPalindrome($_POST['input']); 

У кого-нибудь есть идея, где найти такую ​​информацию?

РЕДАКТИРОВАТЬ

Я обнаружил, что array_filter имеет сложность O (N), а count имеет сложность O (1). Теперь мне нужно найти информацию о count_chars , но полный список будет очень удобен для будущих проблем.

EDIT 2

После некоторых исследований по пространственной и временной сложности в целом я обнаружил, что этот код имеет сложность O (N) и сложность пространства O (1), потому что:

count_chars будет цикл N раз (полная длина входной строки, что дает ей начальную сложность O (N)). Это генерирует массив с ограниченным максимальным количеством полей (26 точно, количество разных символов), а затем он применяет фильтр к этому массиву, что означает, что фильтр будет петлиться не более 26 раз. При нажатии на входную длину до бесконечности этот цикл незначителен и рассматривается как константа. Count также применяется к этому сгенерированному постоянному массиву, и, кроме того, он незначителен, поскольку сложность функции count – O (1). Следовательно, временная сложность алгоритма O (N).

То же самое происходит с пространственной сложностью. При вычислении сложности пространства мы не учитываем входные данные, а только объекты, сгенерированные в процессе. Эти объекты представляют собой массив из 26 элементов и переменную count, и оба они рассматриваются как константы, потому что их размер не может увеличиться по сравнению с этой точкой, независимо от того, насколько велик вход. Таким образом, мы можем сказать, что алгоритм имеет пространственную сложность O (1).

В любом случае, этот список будет по-прежнему ценным, поэтому нам не нужно заглядывать в исходный код php. 🙂

Вероятная причина не включать эту информацию заключается в том, что она, вероятно, будет изменена в расчете на выпуск , поскольку улучшения сделаны / оптимизированы для общего случая.

PHP построен на C. Некоторые из функций – это просто обертки вокруг c-аналогов, например, hypot google search, посмотрите на man hypot , в документах для него math lib http://www.gnu.org/software/ Libc / ручной / html_node / Экспоненты-и-Logarithms.html # Экспоненты и-Логарифмы

Источник фактически не дает никакой информации https://github.com/lattera/glibc/blob/a2f34833b1042d5d8eeb263b4cf4caaea138c4ad/math/w_hypot.c (не является официальным, просто с ним можно связаться)

Не говоря уже о том, что это только glibc, Windows будет иметь другую реализацию. Таким образом, МОЖНО даже быть другим большим O для ОС, который PHP компилируется на

Другая причина может заключаться в том, что это смущает большинство разработчиков . Большинство разработчиков, которых я знаю, просто выбирают функцию с «лучшим» большим O

максимум не всегда означает, что он медленнее

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

Имеет хорошую визуальную подсказку о том, что происходит с некоторыми функциями, т. Е. Сортировка пузыря – это «медленный» вид, но одна из самых быстрых для почти отсортированных данных. Быстрая сортировка – это то, что многие будут использовать, что на самом деле очень медленно для почти отсортированных данных. Big O – худший случай – PHP может решить между выпуском, который они должны оптимизировать для определенного условия, и это изменит большую функцию O, и нет простого способа документировать это.

Здесь есть частичный список (который, я думаю, вы видели)

Список функций Big-O для PHP

Который перечисляет некоторые из наиболее распространенных функций PHP.

Для этого конкретного примера ….

Его довольно легко решить без использования встроенных функций.

Пример кода

 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; } с 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 нечетного счета, вы можете вернуться раньше из массива.

Я думаю, что мое также O (N), потому что его худший случай – O (N), насколько я могу судить.

Контрольная работа

 $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)); 

Тесты выполняются с использованием действительно старого оборудования. Мой путь

 Took 64.125452041626 seconds, 262144 memory 

Твой путь

 Took 112.96145009995 seconds, 262144 memory 

Я совершенно уверен, что мой путь не самый быстрый путь.

Я на самом деле не вижу много информации ни для языков, кроме PHP (например, Java).

Я знаю, что многие из этих сообщений размышляют о том, почему его не существует, и theres не много рисуют из достоверных источников, я надеюсь, что его частично объяснил, почему большой O не указан на странице документации, хотя