使用underscorejs库,我试图滥用JavaScript对象的索引,以便对整数或字符串的数组a
进行排序:
_(a).chain().indexBy(_.identity).values().value()
我意识到它有点像“黑客”,但它实际上在O(n)时间产生了一个排序数组......
我在做梦吗?
答案 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
很可能只是创建一个索引结构,其中顺序恰好是您想要的排序顺序,而不是所有输入都能保证的顺序。