Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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 队列中的前n个元素_Algorithm_Stack_Queue - Fatal编程技术网

Algorithm 队列中的前n个元素

Algorithm 队列中的前n个元素,algorithm,stack,queue,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%的元素表示20个元素中的10%=2 因此答案应该是19和20 我可以想到两种方法 对队列进行排序,计算出N%的项目数(X),然后获取前X个元素 。(我刚刚遇到了这个算法,它基于快速排序的思想。因此,我可能需要将整个队列复制到一个数组中,然后应用该算法) 有没有更好的方法来解决这个问题?队列不

我已经实现了一个使用两个堆栈的队列,我想找到队列中前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

我可以想到两种方法

  • 对队列进行排序,计算出N%的项目数(X),然后获取前X个元素
  • 。(我刚刚遇到了这个算法,它基于快速排序的思想。因此,我可能需要将整个队列复制到一个数组中,然后应用该算法)

  • 有没有更好的方法来解决这个问题?

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


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

    您可以使用其他数据结构来保持元素的有序性。例如,您可以使用、排序或某种二进制搜索树


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

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

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

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


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

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