Algorithm 在压缩重复项的序列中查找第k个最小元素?
我被要求写一个程序来寻找由字符及其出现次数组成的数据集的第k阶统计量。例如,我有一个数据集,由Algorithm 在压缩重复项的序列中查找第k个最小元素?,algorithm,sorting,time-complexity,selection,Algorithm,Sorting,Time Complexity,Selection,我被要求写一个程序来寻找由字符及其出现次数组成的数据集的第k阶统计量。例如,我有一个数据集,由 B,A,C,A,B,C,A,D 这里我有一个3次出现的A,B有2次出现的C有2次出现的D有一次出现的D。它们可以成对分组(字符、出现次数),因此,例如,我们可以将上述序列表示为 (A,3), (B,2), (C,2) and (D,1). 假设than k是这些对的数量,我被要求在O(n)中找到数据集的第k个,其中n是对的数量 我认为可以根据元素的出现次数对元素进行排序,并找到第k个最小的元素,但
B,A,C,A,B,C,A,D
这里我有一个3次出现的A,B有2次出现的C有2次出现的D有一次出现的D。它们可以成对分组(字符、出现次数),因此,例如,我们可以将上述序列表示为
(A,3), (B,2), (C,2) and (D,1).
假设than k是这些对的数量,我被要求在O(n)中找到数据集的第k个,其中n是对的数量
我认为可以根据元素的出现次数对元素进行排序,并找到第k个最小的元素,但这在时间范围内不起作用。我可以在这个问题的算法上得到一些帮助吗?假设您可以使用线性时间选择算法,这里有一个简单的分治算法来解决这个问题。我将让k表示对的总数,m是您要查找的索引
- 如果只有一对,则返回该对中的密钥
- 否则:
- 使用线性时间选择算法,找到中值元素。让
作为其频率medFreq
- 将小于中位数的元素频率相加。称之为
。请注意,小于或等于中间值的元素数小于或等于less
+less
medFreq
- 如果
less
less+
,则返回中间元素中的键medFreq
- 否则,如果m≤
,递归搜索数组前半部分中的第m个元素less
- 否则(m>
+less
),递归搜索数组后半部分中的第(m-medFreq
-less
)个元素medFreq
- 使用线性时间选择算法,找到中值元素。让
使用主定理,这解为O(k)。这是最简单的。很多教科书都讨论过这个问题;最好的算法通常是quickselect。@larsmans是的,我同意你的观点,但我正在努力将它应用到这场比赛中,让一个程序以O(k)运行,其中k是由字符组成的一对数字及其出现的次数。再想一想,这个问题比我想象的更有趣+1,但我不知道答案:)@larsmans不会对
(A,3),(B,2),(C,2),(D,1)
(即元组中的数字)中的出现次数运行quickselect等同于对数组运行quickselect,[3,2,2,1]
,因此在这种情况下O(n)将等于O(k),哪个是元组数?我想,对算法所需的修改并不完全是微不足道的。通常对它的解释要求对数组进行随机访问。