我被要求编写一个程序来查找由字符及其出现组成的数据集的第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个最小元素,但这在时间范围内不起作用。我可以帮助解决这个问题的算法吗?
答案 0 :(得分:1)
假设您可以访问线性时间选择算法,这里有一个简单的分而治之算法来解决问题。我想让k代表总数,m代表你正在寻找的指数。
medFreq
成为其频率。less
。请注意,小于或等于中位数的元素数量为less
+ medFreq
。less
< m< less
+ medFreq
,返回中间元素中的键。less
,则递归搜索数组前半部分的第m个元素。less
+ medFreq
),递归搜索数组后半部分中的(m - less
- medFreq
)元素。 这里的关键见解是,该算法的每次迭代都会抛出一半的对,因此每个递归调用都在一个与原始数组一半大的数组上。这给了我们以下的递归关系:
T(k)= T(k / 2)+ O(k)
使用主定理,这解决了O(k)。