查找压缩重复项的序列中的第k个最小元素?

时间:2014-10-02 12:11:37

标签: algorithm sorting time-complexity selection

我被要求编写一个程序来查找由字符及其出现组成的数据集的第k顺序统计量。例如,我有一个由

组成的数据集
B,A,C,A,B,C,A,D

这里我有A有3次出现,B有2次出现C有2次出现而D有出现。它们可以成对分组(字符,出现次数),因此,例如,我们可以将上述序列表示为

(A,3), (B,2), (C,2) and (D,1).

假设k是这些对的数量,我被要求在O(n)中找到数据集的第k个,其中n是对的数量。

我认为可以根据它们的出现次数对元素进行排序并找到它们的第k个最小元素,但这在时间范围内不起作用。我可以帮助解决这个问题的算法吗?

1 个答案:

答案 0 :(得分:1)

假设您可以访问线性时间选择算法,这里有一个简单的分而治之算法来解决问题。我想让k代表总数,m代表你正在寻找的指数。

  • 如果只有一对,请返回该对中的密钥。
  • 否则:
    • 使用线性时间选择算法,找到中值元素。让medFreq成为其频率。
    • 总结小于中位数的元素的频率。请拨打此less。请注意,小于或等于中位数的元素数量为less + medFreq
    • 如果less< m< less + medFreq,返回中间元素中的键。
    • 否则,如果m≤less,则递归搜索数组前半部分的第m个元素。
    • 否则(m> less + medFreq),递归搜索数组后半部分中的(m - less - medFreq)元素。

这里的关键见解是,该算法的每次迭代都会抛出一半的对,因此每个递归调用都在一个与原始数组一半大的数组上。这给了我们以下的递归关系:

  

T(k)= T(k / 2)+ O(k)

使用主定理,这解决了O(k)。