我只是在JavaScript上排序O(n)吗?

时间:2014-05-11 13:58:28

标签: javascript sorting underscore.js complexity-theory

使用underscorejs库,我试图滥用JavaScript对象的索引,以便对整数或字符串的数组a进行排序:

_(a).chain().indexBy(_.identity).values().value()

我意识到它有点像“黑客”,但它实际上在O(n)时间产生了一个排序数组......

我在做梦吗?

4 个答案:

答案 0 :(得分:6)

你实际上并没有对任何东西进行排序。

相反,您正在构建哈希表并以哈希顺序遍历它,这可能与某些集的排序顺序相同。

答案 1 :(得分:2)

可以使用Bucket Sort http://en.wikipedia.org/wiki/Bucket_sort按O(n)排序,我相信你在这里写的是什么,但如上所述,你不能依赖于一个值的顺序。对象

如果您的数量有限,可以在O(n)中按此方式排序。

答案 2 :(得分:1)

您的算法 a comparison sort

  

比较排序是一种只读取的排序算法   通过单个抽象比较操作列出元素(通常是一个   “小于或等于”操作员或三方比较)   决定在决赛中首先出现两个元素中的哪一个   排序清单。

您正在使用这些整数/字符串作为索引,在算法中使用有关值结构的知识(即知道它们是整数或字符串)。您没有遵守对比较排序的限制,因此您不仅限于O(n log n)时间复杂度的边界。

答案 3 :(得分:0)

是的,你 在做梦: - )

乞丐相信你会偶然发现这样的圣杯。如果该操作序列是基于比较的排序,那么知道这些东西的人实际上已经证明它在O(n)时间内无法完成。

我强烈建议您运行数据集大小为10,100,1000等的代码,然后您的假设不正确。

然后检查是否实际对数组进行排序,或者这是否只是其组织的工件。似乎indexBy很可能只是创建一个索引结构,其中顺序恰好是您想要的排序顺序,而不是所有输入都能保证的顺序。