【问题标题】:Top n elements in queue队列中的前 n 个元素
【发布时间】:2014-09-10 15:15:13
【问题描述】:

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

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

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

因此答案应该是 19 和 20

我能想到的方法有两种

  1. 对队列进行排序,计算 N% 的项目数 (X),然后获取前 X 个元素。
  2. Selection algorithm。 (我刚刚遇到这个算法,它基于快速排序的思想。所以我可能不得不将整个队列复制到一个数组中,然后应用该算法)

有没有更好的办法解决这个问题?

【问题讨论】:

  • “我已经使用两个堆栈实现了一个队列”您对纯功能解决方案感兴趣还是只是一个练习?
  • 这只是一个练习。即使是在算法之间进行比较的想法也可以。我上面的两种方法是 O(nlogn) 和 O(n)。平均而言,两者似乎都相当快。但是,我想知道一种更好的方法,或者很简单,如果这是唯一的两种方法,以及我是否应该使用选择算法
  • 您是否正在寻找总能在 O(1) 中提供 MAX 的 MAXQUEUE 的泛化?在这种情况下,对于给定的队列实例,N 是固定值吗?

标签: algorithm stack queue


【解决方案1】:

队列并不是最好的数据结构,因为您不应该访问其中的元素(大多数队列实现甚至不提供访问运算符),因此您不应该对其进行排序。所以,如果你因为一些其他的要求不需要队列,我建议你使用一个普通的数组。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      将元素添加到队列(后面)时,您同时将其添加到集合中。 当从队列(前面)中删除一个元素时,您同时将它从集合中删除。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-09
        • 2014-12-20
        • 2021-06-26
        • 1970-01-01
        • 1970-01-01
        • 2020-03-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多