- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
过去 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 元素数组和计数变量,它们都被视为常量,因为无论输入有多大,它们的大小都不能超过这一点。因此我们可以说该算法的空间复杂度为 O(1)。
无论如何,该列表仍然很有值(value),因此我们不必查看 php 源代码。 :)
最佳答案
不包含此信息的一个可能原因是可能会在每个版本中发生变化,因为已针对一般情况进行了改进/优化。
PHP 是基于 C 构建的,其中一些函数只是对 c 对应物的包装,例如 hypot
谷歌搜索,查看 man hypot
,在他数学库的文档 http://www.gnu.org/software/libc/manual/html_node/Exponents-and-Logarithms.html#Exponents-and-Logarithms
来源实际上没有提供更好的信息 https://github.com/lattera/glibc/blob/a2f34833b1042d5d8eeb263b4cf4caaea138c4ad/math/w_hypot.c (非官方,只是容易链接)
别说,这只是glibc,Windows会有不同的实现。所以每个操作系统甚至可能有一个不同的大 O 编译 PHP
另一个原因可能是因为这会让大多数开发人员感到困惑。我认识的大多数开发人员只会选择具有“最佳”大 O 的函数
最大值并不总是意味着它更慢
http://www.sorting-algorithms.com/
对某些函数发生的事情有很好的视觉支持,即冒泡排序是一种“慢”排序,但对于几乎排序的数据来说,它是最快的排序之一。快速排序是许多人会使用的,这对于几乎排序的数据实际上非常慢。大 O 是最坏的情况 - PHP 可能会在一个版本之间做出决定,他们应该针对特定条件进行优化,而这会改变函数的大 O,并且没有简单的方法来记录它。
这里有一个部分列表(我猜你已经看到了)
List of Big-O for PHP functions
其中列出了一些更常见的 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;
}
利用奇数不能超过 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),我实际上看不到太多信息。
我知道这篇文章的很多内容都在猜测为什么它不存在并且没有很多来自可靠来源的资料,我希望它可以部分解释为什么大 O 没有列在文档页面中
关于PHP 内置函数复杂性(isAnagramOfPalindrome 函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32100086/
我在 JavaScript 文件中运行 PHP,例如...... var = '';). 我需要使用 JavaScript 来扫描字符串中的 PHP 定界符(打开和关闭 PHP 的 )。 我已经知道使
我希望能够做这样的事情: php --determine-oldest-supported-php-version test.php 并得到这个输出: 7.2 也就是说,php 二进制检查 test.
我正在开发一个目前不使用任何框架的大型 php 站点。我的大问题是,随着时间的推移慢慢尝试将框架融入应用程序是否可取,例如在创建的新部件和更新的旧部件中? 比如所有的页面都是直接通过url服务的,有几
下面是我的源代码,我想在同一页面顶部的另一个 php 脚本中使用位于底部 php 脚本的变量 $r1。我需要一个简单的解决方案来解决这个问题。我想在代码中存在的更新查询中使用该变量。 $name)
我正在制作一个网站,根据不同的情况进行大量 PHP 重定向。就像这样...... header("Location: somesite.com/redirectedpage.php"); 为了安全起见
我有一个旧网站,我的 php 标签从 因为短标签已经显示出安全问题,并且在未来的版本中将不被支持。 关于php - 如何避免在 php 文件中写入
我有一个用 PHP 编写的配置文件,如下所示, 所以我想用PHP开发一个接口(interface),它可以编辑文件值,如$WEBPATH , $ACCOUNTPATH和 const值(value)观
我试图制作一个登录页面来学习基本的PHP,首先我希望我的独立PHP文件存储HTML文件的输入(带有表单),但是当我按下按钮时(触发POST到PHP脚本) )我一直收到令人不愉快的错误。 我已经搜索了S
我正在寻找一种让 PHP 以一种形式打印任意数组的方法,我可以将该数组作为赋值包含在我的(测试)代码中。 print_r 产生例如: Array ( [0] => qsr-part:1285 [1]
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: What is the max key size for an array in PHP? 正如标题所说,我想知道
我正在寻找一种让 PHP 以一种形式打印任意数组的方法,我可以将该数组作为赋值包含在我的(测试)代码中。 print_r 产生例如: Array ( [0] => qsr-part:1285 [1]
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我在 MySQL 数据库中有一个表,其中存储餐厅在每个工作日和时段提供的菜单。 表结构如下: i_type i_name i_cost i_day i_start i_
我有两页。 test1.php 和 test2.php。 我想做的就是在 test1.php 上点击提交,并将 test2.php 显示在 div 中。这实际上工作正常,但我需要向 test2.php
我得到了这个代码。我想通过textarea更新mysql。我在textarea中回显我的MySQL,但我不知道如何更新它,我应该把所有东西都放进去吗,因为_GET模式没有给我任何东西,我也尝试_GET
首先,我是 php 的新手,所以我仍在努力学习。我在 Wordpress 上创建了一个表单,我想将值插入一个表(data_test 表,我已经管理了),然后从 data_test 表中获取所有列(id
我有以下函数可以清理用户或网址的输入: function SanitizeString($var) { $var=stripslashes($var); $va
我有一个 html 页面,它使用 php 文件查询数据库,然后让用户登录,否则拒绝访问。我遇到的问题是它只是重定向到 php 文件的 url,并且从不对发生的事情提供反馈。这是我第一次使用 html、
我有一个页面充满了指向 pdf 的链接,我想跟踪哪些链接被单击。我以为我可以做如下的事情,但遇到了问题: query($sql); if($result){
我正在使用 从外部文本文件加载 HTML/PHP 代码 $f = fopen($filename, "r"); while ($line = fgets($f, 4096)) { print $l
我是一名优秀的程序员,十分优秀!