印表機列印作業一般是放在佇列中的。如果按照先來先列印的順序,有乙個100頁的列印任務,那麼會讓後面短小的任務等待很長時間。更合理的做法也許是最後處理最耗時的列印任務,不管它是不是最後提交上來的。
在多使用者作業系統中,作業系統讓哪個程式使用cpu,是需要決定從佇列裡面選擇的。一般做法是從隊頭獲得程式,分配一定時間的時間片。如果執行完,從佇列刪除;如果沒有執行完,插入隊尾。這樣處理的缺點是:一些很短小的程式需要花很長的時間才能執行完;有些比較重要的程式,不一定短小需要提前執行。
因此如果佇列中的每個任務都有乙個優先順序,先執行優先順序高的,就可以解決問題了。這樣的佇列稱為優先佇列(priority queue)。
優先佇列是要很小的代價完成插入和刪除最小元素,兩個操作的資料結構。
通常情況下的堆是指二叉堆。思路是每次插入都將最小元素(如果業務要求是找最小元素),放置在根節點,用o(logn)時間完成。可以用o(1)的時間獲得最小元素。刪除最小元素的時候除了返回最小元素的值,還將選取新的最小元素,用o(logn)的時間。
對最小堆而言:每乙個節點x>父節點的值。最大堆相反。
操作的時間複雜度小於o(logn)
輸入n個元素,查詢第k小元素。解決思路1:將n個元素build一棵最小二叉堆,刪除k次,得到第k小元素。解決思路2:前k個元素build一棵最大二叉堆,後面的每個元素讀入的時候,與這裡的最大元素比較,如果比最大元素小,則替換。
堆的分叉是d個,不僅僅是2個。有效降低堆的高度。實際中多用4-堆。
二叉堆不能很方便的合併,所以提出了左式堆。左式堆是乙個二叉堆。不同點是堆中每隔一節點x,左兒子的零路徑長》=右兒子的零路徑長,記為:nlp(left)>=nlp(right)。整棵樹向左偏。
時間複雜度 o(logn)
每次操作的最壞情形是o(logn),而插入操作平均花費常數時間。
乙個二項佇列是堆序的樹的集合(簡單的說就是樹的集合)。二項佇列中每乙個高度的樹只有一顆。
這裡有b0,
b1,b
2,b3
,b4 。bk
=bk−
1附加到
另外乙個
bk−1
。 高度為k的二項樹恰好有2k
個節點。我們就可以用二項佇列表示任意乙個優先佇列。這與二進位制表示乙個數相同。例如6,的二進位制是1101,b0
,b2,
b3三棵樹可以表示容量為6的優先佇列。
1 二叉堆的實現
2 左勢堆的合併
3 二項佇列的實現
優先佇列《堆》
1.模型 兩個基本操作 insert等價enqueue deletemin刪除最小者 dequeue 2.簡單的實現 1 簡單鍊錶 遍歷刪除min或者排序刪除min 2 使用二叉查詢樹。反覆除去min會使得樹不平衡,並且bst還支援許多不需要的操作。3.二叉堆 優先佇列的實現普遍使用二叉堆,堆有兩個...
優先佇列 堆
優先佇列 佇列是乙個操作受限的線性表,資料只能在一端進入,另一端出來,具有先進先出的性質。有時在佇列中需要處理優先順序的情況,即後面進入的資料需要提前出來,這裡就需要優先佇列。優先佇列是至少能夠提供插入和刪除最小值這兩種操作的資料結構。對應於佇列的操作,插入相當於入隊,刪除最小相當於出隊。鍊錶,二叉...
堆 優先佇列
面試的時候被問到了heapsort,發現自己對資料結構這塊的理解實在不夠,最近打算推翻重新來學一遍。這裡先簡單地說一下自己對堆的理解。堆的特質 1.平衡二叉樹 保證了操作時間複雜度為logn 2.以最小堆為例,對任意結點,其父節點均小於子節點。這樣幾乎各種操作都是在縱向上 深度 進行的。由於在堆這個...