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

2024-05-13

我在过去的两个小时里一直在谷歌搜索,但找不到 php 内置函数时间和空间复杂度的列表。我有回文字谜 https://stackoverflow.com/questions/4628386/what-is-the-best-algorithm-to-find-whether-an-anagram-is-of-a-palindrome要解决的问题具有以下允许的最大复杂度:

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']);

有人知道在哪里可以找到此类信息吗?

EDIT

我发现array_filter具有 O(N) 复杂度,并且count复杂度为 O(1)。现在我需要找到有关的信息count_chars,但是完整的列表对于将来的问题会非常方便。

EDIT 2

经过对空间和时间复杂度的一些研究后,我发现这段代码具有 O(N) 时间复杂度和 O(1) 空间复杂度,因为:

The count_chars将循环 N 次(输入字符串的全长,起始复杂度为 O(N) )。这会生成一个最大字段数有限的数组(准确地说是 26 个不同字符的数量),然后对该数组应用过滤器,这意味着过滤器最多会循环 26 次。当将输入长度推向无穷大时,这个循环是微不足道的,它被视为一个常数。计数也适用于这个生成的常量数组,而且它是微不足道的,因为count函数复杂度为 O(1)。因此,该算法的时间复杂度为O(N)。

空间复杂度也是如此。在计算空间复杂度时,我们不计算输入,只计算过程中生成的对象。这些对象是 26 元素数组和 count 变量,两者都被视为常量,因为无论输入有多大,它们的大小都不能增加超过此点。所以我们可以说该算法的空间复杂度为O(1)。

无论如何,该列表仍然很有价值,因此我们不必查看 php 源代码。 :)


不包含此信息的一个可能原因是每个版本可能会发生变化,因为针对一般情况进行了改进/优化。

PHP 是基于 C 构建的,一些函数只是 C 对应函数的包装器,例如hypot谷歌搜索,看一下man hypot,在数学库的文档中http://www.gnu.org/software/libc/manual/html_node/Exponents-and-Logarithms.html#Exponents-and-Logarithms 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 https://github.com/lattera/glibc/blob/a2f34833b1042d5d8eeb263b4cf4caaea138c4ad/math/w_hypot.c(不是官方的,只是很容易链接到)

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

另一个原因可能是因为这会让大多数开发人员感到困惑。 我认识的大多数开发人员都会简单地选择具有“最佳”大 O 的函数

最大值并不总是意味着速度较慢

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

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

这里有一个部分列表(我想你已经看过了)

PHP 函数的 Big-O 列表 https://stackoverflow.com/questions/2473989/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 个这一事实,您可以从数组中提前返回。

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

Test

$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

Your way

Took 112.96145009995 seconds, 262144 memory

我相当确定我的方法也不是最快的方法。

实际上,除了 PHP(例如 Java)之外,我看不到太多其他语言的信息。

我知道这篇文章的很多内容都在猜测为什么它不存在,并且没有太多来自可靠来源的绘图,我希望它部分解释了为什么大 O 没有在文档页面中列出

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP 内置函数复杂性(isAnagramOfPalindrome 函数) 的相关文章

  • 获取结果到文本字段

    我有两个可以应用更改的表 但我需要回应基于特定标准所做的更改 现在 对于第一个表 所做的任何更改都会被回显 但是我不确定如果对第二个表 其他 进行更改 如何回显这些更改 if isset POST submit if isset POST
  • 如何替换每隔一个的空白?

    我想用 替换每个第二个空格 using preg replace 并输入这样的字符串 string a b c d e f g h i 应该会产生如下输出 a b c d e f g h i thanks 您可以组合使用explode ht
  • PHP 类似数组的对象

    我需要能够像这样设置我的对象 obj gt foo bar 然后我需要将它用作数组 如下所示 if obj foo bar more code here 只需添加implements ArrayAccess到您的类并添加所需的方法 公共函数
  • 电子邮件文件使用php邮件功能发送电子邮件两次

    我的三个问题 尝试了不同的组合 但没有结果 用谷歌搜索 但几乎没有帮助 我收到了两次电子邮件 更改 email protected cdn cgi l email protection到电子邮件 ID 以查看结果 在执行此文件时 我正在获取
  • 如何使用用户代理标头以不同方式检测 Android 手机和 Android 平板电脑?

    对于我的网站 我需要能够区分 Android 平板电脑访问和 Android 手机访问的区别 在将页面发送给用户之前需要对其进行检测 因此不能使用 JavaScript 检查屏幕分辨率 目前我用它来检测 Android 设备 stripos
  • symfony 2.0足够稳定可以使用吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我怀疑是否交响乐2 0够稳定可以使用吗 因为我从来没有用过Symfony before 看起来交响乐2比以前的版本好得多 我不想在几个月后重新学
  • PHP如何计算时差? [复制]

    这个问题在这里已经有答案了 我必须计算日期时间差 如何在 PHP 中做到这一点 我需要准确的小时 分钟和秒 有人有这方面的脚本吗 Use the diff 方法 http www php net manual en datetime dif
  • 如何在 php 和 mongodb 中使用 findAndModify

    我想将 id 加 1 但运行 php 页面时出现问题 错误是 Fatal error Call to undefined method MongoCollection findAndModify in C wamp www 我的代码是
  • 如何在javascript中显示目录中的所有图像?

    我想在 javascript 的帮助下动态显示目录中的所有图像 我怎样才能做到这一点 我不认为这是可能的 但如果您向 ASP NET 或 PHP 或类似 页面发出 AJAX 请求 它们可以列出文件夹中的文件并将其返回以供 Javascrip
  • yii2:抛出新异常的正确方法

    只是为了测试 我在模型中添加了这段代码 同时设置 debug true 和 false if packagedays lt 1 throw new yii base Exception package days cannot be less
  • 有什么办法可以打破 PHP 中的 if 语句吗?

    PHP中是否有任何命令可以停止执行当前或父进程if声明 与break or break 1 for switch loop 例如 arr array a b foreach arr as val break echo test echo f
  • 如何在 phpstorm 中自动生成类的属性?

    如果我实现一个类 它注入一些服务 我必须编写大量代码
  • JWT 中的注销不起作用

    我是 Laravel 的新手 我安装了 JWT 并登录 所以它工作并生成了一个令牌 当我在邮递员中注销时它返回 true 但一次又一次它返回 true 和 auth gt 用户 注销后始终返回用户 这是我的代码 public functio
  • PHP 中的 JS charCodeAt 等效项(具有完整的 unicode 和 emoji 兼容性)

    我在 JS 中有一个简单的代码 如果涉及特殊字符 我无法在 PHP 中复制它 这是 JS 代码 参见JSFiddle https jsfiddle net h8oca3qg 5 用于输出 var str t char t and speci
  • Mathematica 圆柱分解的计算复杂度是多少

    数学 圆柱分解 http reference wolfram com mathematica ref CylindricalDecomposition html实现一种称为圆柱代数分解的算法 Wolfram MathWorld 的文章圆柱代
  • SELECT COUNT() 与 mysql_num_rows();

    我有一个大表 60 数百万条记录 我正在使用 PHP 脚本来浏览该表 PHP 脚本 带分页 加载速度非常快 因为 表引擎是InnoDB因此SELECT COUNT 非常慢并且mysql num rows 不是一个选项 所以我将总行数 我用来
  • 为什么 array_merge_recursive 不是递归的?

    我最近在我的应用程序中发现了一个由意外行为引起的错误array merge recursive 让我们看一下这个简单的例子 array1 1 gt 1 gt 100 2 gt 200 2 gt 3 gt 1000 3 gt 1 gt 500
  • 从其他域发送电子邮件而不是垃圾邮件

    这个问题问了一遍又一遍 仍然没有好的解决方案 当有人使用 php 发送电子邮件并将另一个域放在 from 中时 它最终会成为垃圾邮件 解决方案通常是 使用您的 发件人 并将您想要的域名放入 回复 中 将您的域列入主要邮件服务的白名单 第一个
  • 每 n 个字符后插入连字符,末尾不添加连字符

    我在用着chunk split 每第四个字母后添加一个 但它也会在字符串末尾添加一个 这是我不想要的 代码如下 function GenerateKey input generated strtoupper md5 input uniqid
  • 如何将十进制转换为二进制并将其位值恢复到数组中?

    例如 result func 14 The result应该 array 1 1 1 0 如何实施func decbin http docs php net decbin会产生一个字符串二进制字符串 echo decbin 14 outpu

随机推荐

  • 点集子集的最小周长凸包

    给定平面上的 n 个点 没有 3 个共线 给定数字 k 找到 k 个点的子集 使得 k 个点的凸包在 k 个点的子集的任何凸包中具有最小周长 我可以想到一个简单的方法 运行时间为 O n k k log k 找到大小为 k 的每个子集的凸包
  • 隐藏 JTable 临时列

    我正在使用 JTable 显示数据库中的数据 现在我想通过 Jcombobox 过滤我的 jtable 我正在使用 Jcombo 框 其中包含 030 024 045 等值 这些值已在 jtable 中设置为列标题 当我单击组合时 选定的列
  • 我可以在C中直接比较int和size_t吗?

    我可以比较一个int and a size t像这样的变量 int i 1 size t y 2 if i y Do something 或者我必须输入其中之一 只要满足以下条件 它就是安全的int为零或正数 如果它是负数 并且size t
  • 选择要重写哪个基类的方法

    鉴于以下情况 class Observer public virtual void Observe Parameter p 0 template
  • 具有上限的联合类型

    我正在遵循这个问题的公认答案中提出的技术如何定义 类型析取 联合类型 https stackoverflow com questions 3508077 does scala have type disjunction union type
  • PHP 启动:运行单元测试时无法加载动态库

    当我尝试运行单元测试时 出现此错误 PHP 警告 PHP 启动 无法加载动态库 bz2 尝试过 xampp php ext bz2 找不到指定的模块 xampp php ext php bz2 dll 找不到指定的模块 在未知的第 0 行
  • 黑色左/右三角形大小不同

    我使用黑色左指三角形 右左指三角形几何形状作为网站上的链接 并使用它们的 HTML 代码 和 9664 9654 由于某种原因 即使我在没有其他元素的空白页面上使用三角形 它们也不会以相同的大小显示 在 Chrome 上 向左指向的位置比向
  • 将参数从 Web 表单传递到 Crystal 报表

    我有一份报告 我想将其显示在网络表单上 没有参数的报告运行良好 带参数的报告让我很头疼 这是我在 BindReport 方法中编写的代码 该代码在表单的页面加载事件上调用 ReportDocument rpt new ReportDocum
  • 如何在 Ruby on Rails 中不使用 eval 将字符串转换为哈希值? [复制]

    这个问题在这里已经有答案了 这里是string需要转换成hash status gt label gt Status collection gt return misc definitions project status 我们不能使用ev
  • Excel 2007:删除单元格中的文本限制

    我想至少输入500 个字符在 Excel 工作表单元格中 但是当我这样做时 它只允许我添加 1 段 例如196 个字符 当我添加另一段时 它会给我一条消息 超出文字限制 我该如何解决这个问题 以便我可以在单元格中添加大量文本 我用谷歌搜索并
  • gcc 中的“假设”子句

    gcc 最新版本 4 8 4 9 是否有类似于以下的 假设 子句 assume 内置icc支持吗 例如 assume n 8 0 从 gcc 4 8 2 开始 gcc 中没有 assume 的等效项 我不知道为什么 这会非常有用 马夫索建议
  • 启动使用 Simperium 的应用程序时 objectFromJSONString 崩溃

    我得到了一个JSON当我尝试启动使用 Simperium 框架的应用程序时崩溃 NSCFString objectFromJSONString unrecognized selector sent to instance 0x6c561a0
  • 基于 ID 的 UiLocalNotifications

    是否有关于根据那里的 Id 存储 UIlocalNotifications 并根据那里的 Id 取消通知的教程 在本地通知中 您有此词典的用户词典 您可以取消通知 http www picksourcecode com ps ct 1612
  • 为什么 OOP 中静态类的最佳实践有所不同?

    我目前正在阅读有关 Java 最佳实践的内容 我发现根据这本书 https rads stackoverflow com amzn click com 0321356683我们必须优先选择静态类而不是非静态类 我记得在 C 最佳实践中 我们
  • 标准 ML 展开列表

    路线 功能expand接收任意类型的列表和整数 数字n 并返回一个列表 其中输入列表的每个项目是 复制的n次 例如 展开 1 2 3 3 必须是 计算结果为 1 1 1 2 2 2 3 3 3 函数的类型必须是 a 列表 int 列表 这是
  • 新的 Android 项目未创建布局或 Java 文件

    这两天我一直在尝试简单地阅读 Big Nerd Ranch Android 编程书 第一章的前几页 我的问题的要点是 当我创建新的 Android 应用程序时 不会创建布局或 java 文件 我已经从 Android 开发站点安装了 ADT
  • 如何使用uWSGI内部路由将HTTP重定向到HTTPS?

    我已经使用 uWSGI 部署了 WSGI 应用程序 但是我没有使用 NGINX https serverfault com a 590833 96915 我该如何使用uWSGI的内部路由 http uwsgi docs readthedoc
  • MacOS High Sierra KEXT 加载 - 有什么方法可以取消用户批准吗?

    正如某些 MacOS 开发人员所知 Apple 实施了安全内核扩展加载 https developer apple com library content technotes tn2459 index html 用户可以通过单击批准第三方
  • 如何使用正则表达式解析 OCC 选项符号?

    OCC 选项符号由 4 部分组成 标的股票或 ETF 的根代码 用空格填充至 6 个字符 到期日期 6 位数字 格式为 yymmdd 期权类型 P 或 C 用于看跌或看涨期权 执行价格 为价格 x 1000 前面填充 0 至 8 位数字 举
  • PHP 内置函数复杂性(isAnagramOfPalindrome 函数)

    我在过去的两个小时里一直在谷歌搜索 但找不到 php 内置函数时间和空间复杂度的列表 我有回文字谜 https stackoverflow com questions 4628386 what is the best algorithm t