队列中的前n个元素

时间:2014-09-10 15:15:14

标签: algorithm stack queue

我使用两个堆栈实现了一个队列,我想找到队列中的前N%元素。

例如:
队列按此顺序获取元素{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}

前10%的元素意味着10%的20 = 2

因此答案应为19和20

我能想到两种方式

  1. 对队列进行排序,确定项目数(X)为N%,然后抓住前X个元素。
  2. Selection algorithm。 (我刚刚遇到了这个算法,它基于quicksort的想法。所以我可能需要将整个Queue复制到一个数组然后应用算法)
  3. 有没有更好的方法来解决这个问题?

3 个答案:

答案 0 :(得分:0)

队列不是最佳的数据结构,因为您不应该访问其中的元素(大多数队列实现甚至不提供访问操作符),因此您不应对其进行排序。因此,如果由于某些其他要求而不需要队列,我建议您使用普通数组。

排序是一个非常耗时的过程。当您读取/插入队列元素时,您可以计算它们的总和。根据已知总和,元素数量和所需百分比,您可以计算阈值。然后,您需要遍历元素(如果使用队列,您可以逐个提取它们)并显示大于计算阈值的那些元素。

答案 1 :(得分:0)

您可以使用其他数据结构来保持元素的排序。例如,您可以使用skip list,有序tiered vector或某些二叉搜索树。

在大多数编程语言中都有一个内置的RB树,但是你将无法使用它。您需要在每个节点中添加有关其左右子树权重的信息。

答案 2 :(得分:0)

您可以将二进制搜索树/“有序集”与队列结合使用。

向队列(队列的后面)添加元素时,同时将其添加到集合中。 从队列的(前面)删除元素时,同时将其从集合中删除。

为了找到队列中前N%的元素,您可以从顶部元素循环遍历该集合,直到下一个元素不符合前N%条件。这是因为该集合维护了队列中元素的有序列表。

此外,由于您的原始队列结构仍然存在,您仍然可以保留队列中元素的相对顺序。

相关问题