这个回文算法的时空复杂度?

Posted

技术标签:

【中文标题】这个回文算法的时空复杂度?【英文标题】:Time and Space Complexity of this Palindrome Algorithm? 【发布时间】:2020-09-25 20:50:53 【问题描述】:

谁能告诉我这个算法的时间和空间复杂度?基本上,该函数接受一个字符串,如果它是回文则该函数必须返回 true(向后与向前相同),否则返回 false。

我认为两者都是 O(n),但如果我错了,请纠正我。

function isPalindrome(string) 
    var reversing = string.split("").reverse().join("")
    return string === reversing

【问题讨论】:

是的,两者都是 O(n)。 好吧,我不确定 O(n) 复杂性在这里是否可见,因为您实际上并没有实现 算法。您宁愿使用 String API,其代码也不会在此处显示。因此,仅从这段代码来看,它是 constant.. 但由于内部调用正在完成 O(n) 的工作,它不是恒定的.. 但这从这个问题中并不明显。通常,当您对时空复杂度感到好奇时,请尝试自己实现算法(或查看实现)。 我的意思是在幕后使用内置的 split、reverse 和 join 方法。 那么最好提供您正在检查的代码。不是每个人都会打开他们的 IDE,下载源代码并查看引擎盖下的实现。无论如何,我的建议仍然有效 - 不要实现这样的算法......因为你实际上并没有在这里实现任何算法。 另外,请始终添加您使用的语言的相应标签。 【参考方案1】:

您的函数具有 O(string.length) 的时间和空间复杂度,因为它构造一个字符数组,然后构造一个新字符串,其中的字符以相反的顺序排列,长度与原始字符串。比较这些字符串具有相同的时间复杂度。

但是请注意,这适用于单个单词,但不适用于完整的短语:可以在两个方向上以相同字母阅读但间距不一定相同的短语也是回文。

这是一个替代版本:

function isPalindrome(string) 
    string = string.replace(/ /g, "");
    var reverse = string.split("").reverse().join("");
    return string === reverse;

这个函数的时间和空间复杂度和O(string.length)一样。

【讨论】:

以上是关于这个回文算法的时空复杂度?的主要内容,如果未能解决你的问题,请参考以下文章

常用算法的时空复杂度比较

Manacher算法最长子回文串

「错位算法时空」,让你彻底学会「时间」与「空间」复杂度

2018/11/29 算法时空 算法导论第三章 函数的增长

马拉车算法详解

java数据结构之排序_排序算法的时空复杂度介绍