【发布时间】:2015-11-13 00:34:06
【问题描述】:
过去 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 上查找信息,但是完整的列表对于将来的问题会非常方便。
编辑 2
在总体上对空间和时间复杂度进行了一些研究后,我发现这段代码具有 O(N) 时间复杂度和 O(1) 空间复杂度,因为:
count_chars 将循环 N 次(输入字符串的全长,开始复杂度为 O(N) )。这是生成一个最大字段数有限的数组(准确地说是 26 个,不同字符的数量),然后在这个数组上应用一个过滤器,这意味着过滤器最多循环 26 次。当将输入长度推向无穷大时,这个循环是微不足道的,它被视为一个常数。 Count 也适用于这个生成的常量数组,此外,它并不重要,因为count 函数的复杂度是 O(1)。因此,算法的时间复杂度为O(N)。
空间复杂度也是如此。在计算空间复杂度时,我们不计算输入,只计算过程中生成的对象。这些对象是 26 元素数组和 count 变量,它们都被视为常量,因为它们的大小不能超过这一点,无论输入有多大。所以我们可以说该算法的空间复杂度为 O(1)。
无论如何,该列表仍然很有价值,因此我们不必查看 php 源代码。 :)
【问题讨论】:
-
可能你得看源代码自己搞清楚。这是一个声称为某些功能提供此信息的问题的答案:stackoverflow.com/questions/2473989/…
-
我遇到了这个,很棒的信息,但仅限于
array_filter,count和count_chars上没有任何内容。 -
从技术上讲,有超过 26 个不同的字符。除非保证您的问题只提供英文字母表中的字符,否则 count_chars() 的最坏情况空间复杂度将是 min(N,
)。另外,不要忘记考虑大写/小写... -
@Skatch 我建议您使用有关复杂性的资源来回答您的问题。
标签: php time-complexity space-complexity