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(an)) 。

该字母通常在问题中是明确的-例如,如果保证输入中仅包含小写字母或仅包含字母和数字。否则,这可能是隐含的,因为字符串是由Unicode字符(或在较旧的语言中为ASCII字符)形成的。在前一种情况下,

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 平分算法吗?理论上和通过代码片段[重复]

片段(Java) | 机试题+算法思路+考点+代码解析 2023

性能有瓶颈?3 个实时可视化 Python 工具包来帮你!

是否可以动态编译和执行 C# 代码片段?

关于React中的虚拟DOM与Diff算法

你可能不知道的JavaScript代码片段和技巧(下)