Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在压缩重复项的序列中查找第k个最小元素?_Algorithm_Sorting_Time Complexity_Selection - Fatal编程技术网

Algorithm 在压缩重复项的序列中查找第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个最小的元素,但

我被要求写一个程序来寻找由字符及其出现次数组成的数据集的第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≤
      less
      ,递归搜索数组前半部分中的第m个元素
    • 否则(m>
      less
      +
      medFreq
      ),递归搜索数组后半部分中的第(m-
      less
      -
      medFreq
      )个元素
这里的关键洞察是,该算法的每次迭代都会抛出一半对,因此每次递归调用都在一个数组上,该数组的大小为原始数组的一半。这为我们提供了以下递归关系:

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


使用主定理,这解为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),哪个是元组数?我想,对算法所需的修改并不完全是微不足道的。通常对它的解释要求对数组进行随机访问。