寻找第k大的元素Java,java – 支持快速第k个最大元素查找的队列数据结构
我遇到一個需要支持快速第k個最大元素查找的隊列數據結構的問題。
此數據結構的要求如下:
>隊列中的元素不一定是整數,但它們必須彼此可比較,即當我們比較兩個元素(它們也可以相等時),我們可以知道哪一個更大。
>數據結構必須支持enqueue(在尾部添加元素)和dequeue(刪除頭上的元素)。
>它可以快速找到隊列中第k個最大的元素,注意k不是常量。
>您可以假設操作入隊,出隊和第k個最大的元素查找都以相同的頻率出現。
我的想法是使用一個修改的平衡二叉搜索樹。樹與普通平衡二叉搜索樹相同,除了每個nodei用另一個字段ni進行擴充,ni表示包含在具有根節點的子樹中的節點數。上述操作支持如下:
為了簡單起見,假設所有元素是不同的。
入隊(x):x首先插入到樹中,假設對應的節點是nodet,我們將對(x,指向nodet的指針)添加到隊列中。
出隊:假設(e1,node1)是頭部的元素,node1是指向與e1對應的樹中的指針。我們從樹中刪除node1,并從隊列中刪除(e1,node1)。
第K個最大元素發現:假設根節點是noderoot,它的兩個孩子是nodeleft和noderight(假設它們都存在),我們將K與nroot進行比較,可能發生三種情況:
>如果K < nleft我們找到nroot的左子樹中的第K個最大的元素;
>如果K> nroot-nright,我們在nroot的右子樹中找到(K-nroot nright)最大的元素;
>否則nroot是我們想要的節點。
所有三個操作的時間復雜度為O(logN),其中N是隊列中當前的元素數。
如何加快上述操作?有什么數據結構和如何?
總結
以上是生活随笔為你收集整理的寻找第k大的元素Java,java – 支持快速第k个最大元素查找的队列数据结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机隐藏用户设置,Win10电脑怎么设
- 下一篇: 吴恩达 coursera ML 第十一课