数组中不同整数的数量为O(log n)。如何获得O(n log log n)最坏情况时间算法来对这些序列进行排序?

时间:2014-10-06 03:34:43

标签: arrays algorithm sorting

问题来自The Algorithm Design Manual。我一直在努力,但没有找到一种方法来得出正确的答案。

问题: 我们寻求对具有许多重复的n个整数的序列S进行排序,使得S中的不同整数的数量是O(log n)。给出一个O(n log log n)最坏情况时间算法来对这些序列进行排序。

我想也许可以先选择所有这些不同的元素并形成一个logn长度数组,然后记录频率并对其进行排序。然而,我的第一步似乎是浪费了太多的运行时间...是否有任何优越的选择方法或我的方法是完全错误的?感谢

2 个答案:

答案 0 :(得分:4)

使用平衡二叉树来计算每个数字的出现次数。由于只有log N个不同的数字,因此树的大小为log N,因此所有操作都在log log N中执行。(这正是map<>实现的方式是C ++)

然后,只需在预先遍历遍历中迭代树的节点,并按此顺序打印每个整数所需的次数。

答案 1 :(得分:1)

创建一个包含(唯一数字,计数)对的数组。该数组最初是空的并保持排序。

对于原始数组中的每个数字,使用二进制搜索查看已排序数组中的数字。由于数组的大小为O(log N),每次二进制搜索需要O(log log N),你做N次,总O(N log log N)。找到后,您会增加计数。

如果未找到,则插入计数为1的新数字。此操作仅发生O(log N)次,并且在O(log N)步骤中完成,总计为O(log ^ 2 N),远小于O(N log log N)。

完成后,使用所需的数字填充原始数组。这需要O(N)。

确实没有必要创建一个平衡的排序树来使插入更快,因为唯一数字的集合非常小。

如果整数集全部包含在X≤number≤Y的范围内,则可以使用X - Y + 1计数器数组在O(max(N,Y - X + 1))中解决问题甚至没有找到唯一的数字。据报道,该技术在Iain Banks'预订"游戏玩家"。