JavaScript-big-O性能算法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript-big-O性能算法相关的知识,希望对你有一定的参考价值。
这里是一个简单的算法练习。我的回答是正确的。我对大O性能有疑问。因为在问题陈述中它是这样写的:写一个只在字符串上迭代一次并使用O(1)额外内存的解决方案。
问题的目的只是返回第一个非重复字符。例如,我有以下字符串:'abbbcdd'
的答案是'a'
,因为'a'
出现在'c'
之前。如果找不到重复的字符,它将返回'_'
这是我的代码:
console.log(solution('abbbcdd'))
function solution(str) {
let chars = buildCharMap(str)
for (let i in chars) {
if (chars[i] === 1) {
return i
}
}
return '_'
}
function buildCharMap(str) {
const charMap = {}
for (let i = 0; i < str.length; i++) {
!charMap[str[i]] ? charMap[str[i]] = 1 : charMap[str[i]]++
}
return charMap
}
我的答案符合要求吗?关于big-o?
答案
时间复杂度很简单:您在一个长度为n的字符串上循环,而在另一个对象上严格使用n键进行另一个循环。循环内的操作花费O(1)时间,并且循环是连续的(非嵌套),因此运行时间为O(n)。
空间复杂性稍微微妙一些。例如,如果输入是数字列表而不是字符串,那么我们可以直截了当地说charMap
在最坏的情况下占用O(n)空间,因为列表中的所有数字可能都是不同。但是,对于字符串上的问题,我们必须意识到,可以由这些字符串组成的字符的字母有限。如果该字母的大小为[[a,则您的charMap
对象最多可以具有a键,因此,空间复杂度为O(min(a,n)) 。
a
= 26或62。在后一种情况下,a = 65,536或1,112,064,这取决于我们是在计算代码点还是符号,因为Java脚本字符串被编码为[C0 ]。无论哪种方式,a都是一个常数,所以O(a)的空间就是O(1)的空间-尽管它可能是一个很大的常数。这意味着您的算法实际上确实使用O(1)辅助空间,因此它是对该问题的正确解决方案。
[这引起了一个问题,为什么在分析数字列表上的算法时,我们同样不会说javascript数字具有由UTF-16定义的浮点数字的有限“字母”。答案有点哲理。我们使用抽象的计算模型来分析运行时间和辅助空间,这些模型通常假定数字可以任意大,列表可以无限长,依此类推。但是,即使在那些模型中,我们也假定字符串是由固定的字母组成的,如果问题中的字母不是固定的,则我们将字母大小设为变量a
,我们认为该变量独立于n 。这是一种分析字符串算法的明智方法,因为字母大小和字符串长度与我们通常感兴趣的问题无关。以上是关于JavaScript-big-O性能算法的主要内容,如果未能解决你的问题,请参考以下文章
有人可以解释啥是 SVN 平分算法吗?理论上和通过代码片段[重复]