【发布时间】:2012-04-15 09:27:12
【问题描述】:
这不是我学校的家庭作业。这是我自己的家庭作业,我是自学算法。
在Algorithm Design Manual,有这样的消费税
4-25 假设数组 A[1..n] 只有 {1, . . . , n^2} 但最多 log log n 这些数字曾经出现过。设计一种算法,以大大小于 O(n log n) 的方式对 A 进行排序。
我有两种方法:
第一种方法:
基本上我想对这个问题进行计数排序。我可以首先扫描整个数组 (O(N)) 并将所有不同的数字放入 loglogN 大小的数组 (int[] K) 中。
然后应用计数排序。但是,在设置计数数组(int[] C)时,我不需要将其大小设置为 N^2,而是将其大小也设置为 loglogN。
但是这样,当计算每个不同数字的频率时,我必须扫描数组 K 以获取该元素的索引 (O(NloglogN) ,然后更新数组 C。
第二种方法:
再次,我必须扫描整个数组以获得一个不同的数字数组 K,其大小为 loglogN。
然后我只是做一种快速排序,但分区是基于 K 数组的中位数(即,每次枢轴是 K 数组的一个元素),递归。
我认为这种方法最好,O(NlogloglogN)。
我说的对吗?还是有更好的解决方案?
算法设计手册中存在类似的删减,例如
4-22 证明可以在 O(n log k) 时间内对 1 到 k 范围内的 n 个正整数进行排序。有趣的情况是当 k
4-23 我们试图对具有许多重复的 n 个整数的序列 S 进行排序,使得 S 中不同整数的数量为 O(log n)。给出一个 O(n log log n) 最坏情况时间算法来对这些序列进行排序。
但基本上对于所有这些消费税,我的直觉总是考虑计数排序,因为我们可以知道元素的范围,并且与整个数组的长度相比,范围足够短。但是经过更深入的思考,我猜消费税要寻找的是第二种方法,对吧?
谢谢
【问题讨论】:
-
我们可以使用大小为 log log n 个元素的 BST 结构为什么 - 我们想对较小的元素进行排序以获得更短的运行时间(我不考虑计数排序,因为它会占用太多空间比我的原始数组)我们可以在每个节点维护计数器来处理重复项 T(n) =O(元素数 * bst 的高度) = O(n * log log log n) 你是如何计算排序数组的大小 log log n 而不是 n^2
标签: algorithm sorting data-structures