JavaScript中JSON.parse()的复杂性是什么?

JavaScript中JSON.parse()的复杂性是什么?,javascript,json,time-complexity,Javascript,Json,Time Complexity,标题说明了一切。我将要解析一个非常大的JSON字符串,我很好奇这个内置方法的复杂性 我希望它是θ(n),其中n是字符串中的字符数,因为它可以确定是否存在语法错误 我试着搜索,但什么也找不到 我不知道浏览器中的实现,但您的假设在某种程度上是正确的。如果JSON主要包括字符串,那么它将是直接的、非常线性的。如果你有很多浮点,转换数字需要一点时间,但同样是线性的(数字多的数字需要稍长一点,但与长字符串相比…非常相似) 因为在大多数情况下,数组和对象被声明为映射,所以内存分配会根据需要增长,并且通常是线

标题说明了一切。我将要解析一个非常大的JSON字符串,我很好奇这个内置方法的复杂性

我希望它是θ(n),其中n是字符串中的字符数,因为它可以确定是否存在语法错误


我试着搜索,但什么也找不到

我不知道浏览器中的实现,但您的假设在某种程度上是正确的。如果JSON主要包括字符串,那么它将是直接的、非常线性的。如果你有很多浮点,转换数字需要一点时间,但同样是线性的(数字多的数字需要稍长一点,但与长字符串相比…非常相似)


因为在大多数情况下,数组和对象被声明为映射,所以内存分配会根据需要增长,并且通常是线性的。许多(如果不是大多数的话)实现将使用Java作为后端。这意味着垃圾收集,因此不可能确定转换所有数据需要多少时间,因为这在很大程度上取决于目标计算机上使用的内存模型的大小以及垃圾收集运行的频率。然而,它通常只会随着项目添加到地图中而增长,因此它看起来也大多是线性的。我不希望实现使用realloc(),这意味着复制数据,从而随着数组/对象越来越大而变得越来越慢。

JSON是非常简单的语法,甚至不需要lookahead。只要GC不参与,那么它就是纯粹的
O(n)

有点好奇,所以添加更多的信息我相信这是最重要的。我试着找出铬是否有自己的来源,但不确定是否有?这是Github的源代码

注意事项:

  • 最坏的情况可能是需要O(N)时间的场景,其中N是字符数
  • 在传递a的情况下,它必须在创建整个对象后重新访问它,但这只发生一次,因此它可以忽略不计。还取决于reviver函数在做什么,您必须考虑它自身的时间复杂性

请注意,这可能是计算机科学委员会的一个好问题。。。我认为在解析JSON时不存在真正的歧义;在使用每个字符后,我们确切地知道当前结构是什么(启动数组或对象、启动或继续原语、冒号后是属性名称或对象属性值等),或者我们完全确定存在解析错误,我看不出时间复杂度怎么会高于
n
。不过,我不是解析理论或复杂性理论方面的专家。(可以说内存复杂性取决于结构的深度,也许?同样,不是复杂性专家。)o(n)其中n是?作为一个新手,我猜n是节点数?n是字符数,JSON是LL(1)可解析的,需要一个单独的令牌前瞻。但这确实意味着解析器对每个字符的下一步是“确定的”,并且不需要回溯,因此一次可以解析一个字符(和一个向前看),因此O(n)为字母数。