1. 程式人生 > >優先佇列和堆的一些知識

優先佇列和堆的一些知識

1.概念

優先佇列:普通的佇列具有先進先出的特性,元素追加在隊尾,如果刪除的話,從隊頭刪除。而在優先佇列中,佇列中的資料被賦予了優先順序。當訪問元素時,優先順序最高的會先被刪除。所以說優先佇列是最高階資料先出。
:堆是指一個可以被看成一棵樹的陣列物件,堆總是滿足下面兩個性質:(1)堆中的某個節點必然小於(堆頂最大)或者大於(堆頂最小)其父節點的值;(2)所謂的堆呢,總是一棵完全二叉樹。
堆有序:當一棵二叉樹的每個節點,都大於等於他的兩個子節點時,它被稱為堆有序。
一棵大小為N的完全二叉樹的高度為log2N+1(以2為底的)

2.堆有序化的兩種方式

(1)由下至上的堆有序化
如果一個堆有序,因為某個節點的變化,這個節點比它的父節點還要大的時候,那麼我們就需要通過交換該節點和父節點的關係來修復堆的順序。交換之後這個節點還有可能比它現在的父節點大,再次交換它和它當前父節點的位置,以此類推,一直到這個節點小於它的父節點為止。因此這個大根堆將被恢復有序。
部分程式碼如下:

private void swim(int k){
    while(k > 1 && K/2 < k){
        int temp = k/2;
        k/2 = k;
        k = temp;       
    }
}

(2)由上至下的堆有序化
這種情況出現在和上面一種情況正好相反的狀況中:在堆有序的狀態下,因為某個節點小於它的兩個子節點其中之一的時候,而順序被打破。那麼我們通過交換他和兩個位元組點中的較大者來將其恢復。這個節點在大根堆中處於一下向下移動的狀態,因此形象的稱之為“下沉”
部分程式碼如下:

private
void sink(){ while(2 * k <= N){ int j = 2*k; if(j < N && j < j + 1) j++; if(!k < j) break; k = j; } }

對於多叉堆的這些情況,同二叉堆。

3.優先佇列的對路歸併問題

4.堆排序

相關推薦

優先佇列一些知識

1.概念 優先佇列:普通的佇列具有先進先出的特性,元素追加在隊尾,如果刪除的話,從隊頭刪除。而在優先佇列中,佇列中的資料被賦予了優先順序。當訪問元素時,優先順序最高的會先被刪除。所以說優先佇列是最高階

玩轉資料結構——第七章:優先佇列

內容概要: 什麼是優先佇列? 堆的基礎結構 向堆中新增元素Sift Up 從堆中取出元素和Sift Down Heapify和Replace 基於堆的優先佇列 LeetCode上優先佇列相關的問題 java中的PriorityQueue 和堆相關的更多話題和

資料結構——優先佇列

優先佇列: 優先佇列也是一個佇列,他和普通佇列的區別是:普通佇列是先進先出,後進先出的;優先佇列是出隊順序和入隊順序無關,和優先順序相關。(如:醫院看病時,病情最嚴重的那個需要先看病)  實現優先佇列同樣底層也可以選擇多種資料結構, 選擇 普通的線性結構實現:出隊O(1),入隊

基於優先佇列排序

          public class MaxPQ<Key extends Comparable<key>>{               private Key[] pq;               private int N = 0;               pulbi

優先佇列 實戰:HDU1242

什麼叫優先佇列呢,能完成以下任務的就叫做優先佇列: ·插入一個數值 ·取出最小的數值(獲取數值,並且刪除) 實現優先佇列,應該使用二叉樹完成,是一種叫二叉堆的資料結構(binary heap) 二叉堆分為兩種,最小堆和最大堆。最小堆是父節點的鍵值總是小於等於子節點的鍵值。最

優先佇列,與priority_queue的學習筆記

今天花了一天的時間把優先佇列和堆,還有priority_queue給學習了學習,現在做下筆記。學完認識到優先佇列就是堆的一種,而priority_queue是為優先佇列準備的STL,定義與使用起來十分方便。堆先說堆,堆是一個二叉樹,以小根堆為例(大根堆就相反了)兒子的值一定不

優先佇列排序

  優先佇列   許多應用程式都需要處理有序的元素,但不一定要求它們全部有序,或是不一定要一次就將它們排序。很多情況下是收集一些元素,處理當前鍵值最大的元素,然後再收集更多的元素,再處理當前鍵值最大的元素。這種情況下,需要的資料結構支援兩種操作:刪除最大的元素和插入元素。這種資料結構型別叫優先佇列。 &nbs

八大排序演算法(六)——優先佇列排序

6.1 API 優先佇列是一種抽象資料型別,它表示了一組值和對這些值的操作。優先佇列最重要的操作就是刪除最大元素和插入元素。 6.2 初級實現 6.2.1 陣列實現(無序) 或許實現優先佇列最簡單方法就是基於下壓棧的程式碼。insert()方法的程式碼和棧的完全一樣。要實現刪除最大元素,

(Java資料結構演算法)---優先佇列排序

堆主要用於實現優先佇列。 利用有序陣列可以實現優先佇列(從小到大或從大到小的陣列),刪除的時間複雜度是O(1),但是插入的時間複雜度是O(N)。用堆實現優先佇列,插入和刪除的時間複雜度都是O(logN)。 簡介 堆是一種完全二叉樹,且每個節點的值都大於等於子節點值(大根堆)。

《常見演算法資料結構》優先佇列(3)——排序

堆排序 本系列文章主要介紹常用的演算法和資料結構的知識,記錄的是《Algorithms I/II》課程的內容,採用的是“演算法(第4版)”這本紅寶書作為學習教材的,語言是java。這本書的名

優先佇列排序介紹

1 堆的基本概念 堆也叫優先佇列,堆是一種特殊的完全二叉樹資料結構,堆分為兩種,最大堆,最小堆。 最大堆:根節點大於左右兩個子節點的完全二叉樹 最小堆:根節點小於左右兩個子節點的完全二叉樹 堆可以用陣列來儲存,a[i]處存根節點,a[2*i] a[2*i + 1]分別存左子樹的

演算法-優先佇列排序

優先佇列 許多應用程式都需要處理有序的元素,但不一定要求他們全部有序,或是不一定要一次就將他們排序。很多情況下我們會收集一些元素,處理當前鍵值最大的元素,然後再收集更多元素,再處理當前鍵值最大的元素,如此這般。 在這種情況下,一個合適的資料結構應該支援兩種操作:刪除最大元素和插入元素。

資料結構——優先佇列

什麼是優先佇列? 普通佇列:先進先出,後進後出 優先佇列:出隊順序和入隊順序無關;和優先順序相關,如醫院中,病重先安排病床 優先佇列的現例項子: ①cpu任務排程,動態選擇優先順序最高的任務執行 ②王者榮耀中,攻擊鍵優先打敵人,無敵人時候優先打最近的小兵 關於

排序演算法(3)—優先佇列排序

本文主要討論基於二叉堆資料結構的優先佇列的實現以及衍生的堆排序 實現優先佇列還可以使用棧,佇列等資料結構,在此略 文章最後附有堆排序完整程式碼 優先佇列 1. 主要解決問題 有時候比不

優先佇列

優先佇列和普通佇列的區別在於,優先佇列(堆)總是先優先處理佇列中最小的元素。 優先佇列(堆)允許至少下列兩種操作:Insert(插入),以及DeleteMin(刪除最小者),他的工作是找出、返回和刪除優先佇列中的最小元素。Insert操作類似於Enqueue(入隊),而DeleteMin則是佇列中Deque

PAT 備考——優先佇列)與排序

一、堆 堆是完全二叉樹型中的一種的資料結構,按照排列順序分為大頂堆和小頂堆。其中大頂堆表示二叉樹中所有根節點比子節點大,小頂堆反之。 因此,以大頂堆為例,堆具有如下兩個性質: 有序性:從根節點到任意子節點的路徑,所經過的節點是有序排列的; 完全性:與完全二叉樹相同,當用陣

優先佇列

優先佇列   佇列是一個操作受限的線性表,資料只能在一端進入,另一端出來,具有先進先出的性質。有時在佇列中需要處理優先順序的情況,即後面進入的資料需要提前出來,這裡就需要優先佇列。優先佇列是至少能夠提供插入和刪除最小值這兩種操作的資料結構。對應於佇列的操作,插

第6章 優先佇列

優先佇列 優先佇列資料結構屬於電腦科學中最精緻的一種 6.1 模型 優先佇列允許至少兩種操作:插入和刪除最小者 6.2 一些簡單的實現 優先佇列的插入和刪除最小者的最壞情形時間均為o(logN),但插入操作實際上將花費平均時間,若無刪除操作的干擾,該結構的實現將以線性時間建

八、優先佇列排序

優先佇列 一種常見的資料結構,需要支援兩種操作:刪除最大(最小)元素和插入元素。這種資料型別叫做優先佇列。 API MaxPQ()//建立一個優先佇列 MaxPQ(int max)//建立一個最大容量為max的優先佇列 MaxPQ(key

It's not a Bug, it's a Feature!-----------優先佇列spfa----做了很長時間!!!(好題!)

可以直接用位運算去操作:     ①判定某些位置是否為1,如判定2、4位置為1,則轉化為判斷x|0101是否等於x。     ②判定某些位置是否為0,如判定2、4位置為0,則轉化為判斷x&1010是否等於x。     ③將某些位置轉化為1,如2、4位置轉化為