手头的问题是标题本身的问题。这是给出一种算法,该算法在O(nloglogn)最坏情况时间内对具有O(logn)不同元素的n元素阵列进行排序。有什么想法吗?
此外,您通常如何处理具有多个非不同元素的数组?
答案 0 :(得分:11)
O(log( n )))时间足以让您在搜索树中使用O(log( n ))元素执行基本操作
因此,为目前为止所见的所有不同元素维护一个平衡的搜索树。树中的每个节点还包含您使用该键看到的所有元素的列表。
逐个浏览输入元素。对于每个元素,尝试将其插入树中(需要O(log log n )时间)。如果您发现已经看到了相同的元素,只需将其插入已存在节点的辅助列表中即可。
遍历整个列表后,按顺序遍历树,连接辅助列表。 (如果你注意插入右端的辅助列表,这甚至是一个稳定的类型。)
答案 1 :(得分:0)
简单日志(N)空间解决方案将是:
使用平衡树(log(n)空间,n + log(n)== n时间)找到不同的元素 你可以使用这个树,总是选择正确的枢轴进行快速排序。
我想知道是否有log(log(N))空间解决方案。
答案 2 :(得分:0)
使用树的一些细节:
您应该能够使用红色黑树(或其他类型的基于树的排序算法),使用同时包含值和计数器的节点:可能是元组(n,count)。
插入新值时,您可以创建新节点,也可以使用要添加的值增加节点的计数(如果已存在具有该值的节点)。如果只是递增计数器,它将带你O(logH),其中H是树的高度(找到节点),如果你需要创建它,它也需要O(logH)来创建和定位节点(常数更大,但它仍然是O(logH)。
这将确保树的值不超过O(logn)(因为您有log n个不同的值)。这意味着插入将采用O(loglogn)并且您有n个插入,因此O(nloglogn)。