堆 codestorm 新浪部落格

2021-09-24 11:23:55 字數 1935 閱讀 4622

堆常用來實現優先佇列,在這種佇列中,待刪除的元素為優先順序最高(最低)的那個。在任何時候,任意優先元素都是可以插入到佇列中去的,是電腦科學中一類特殊的資料結構的統稱

最大(最小)堆是一棵每乙個節點的鍵值都不小於(大於)其孩子(如果存在)的鍵值的樹。大頂堆是一棵完全二叉樹,同時也是一棵最大樹。小頂堆是一棵完全完全二叉樹,同時也是一棵最小樹。

注意:

下圖分別給出幾個最大堆和最小堆的例子:

堆支援以下的基本操作:

某些堆實現還支援其他的一些操作,如斐波那契堆支援檢查乙個堆中是否存在某個元素。

堆排序(heapsort)是一樹形選擇排序。

堆排序的特點是:在排序過程中,將r[l..n]看成是一棵完全二叉樹的順序儲存結構,利用完全二叉樹中雙親結點和孩子結點之間的內在關係【參見二叉樹的順序儲存結構】,在當前無序區中選擇關鍵字最大(或最小)的記錄。

優點直接選擇排序中,為了從r[1..n]中選出關鍵字最小的記錄,必須進行n-1次比較,然後在r[2..n]中選出關鍵字最小的記錄,又需要做n-2次比較。事實上,後面的n-2次比較中,有許多比較可能在前面的n-1次比較中已經做過,但由於前一趟排序時未保留這些比較結果,所以後一趟排序時又重複執行了這些比較操作。

堆排序可通過樹形結構儲存部分比較結果,可減少比較次數。

堆排序利用了大根堆(或小根堆)堆頂記錄的關鍵字最大(或最小)這一特徵,使得在當前無序區中選取最大(或最小)關鍵字的記錄變得簡單。

(1)、用大根堆排序的基本思想

(2)、大根堆排序演算法的基本操作:

注意:(3)、演算法實現

[cpp]view plain

copy

print

?//堆排序

template

<

class

t>  

void

sort::heapsort(t arr, 

intlen)  

for(i = len - 1; i >= 1; i--)  

}   

//建立堆 

template

<

class

t>  

void

sort::createheap(t arr, 

introot, 

intlen)     

}  if

(temp 

}   

arr[j / 2]  = temp;   

}   

思想:在乙個很大的無序陣列裡面選擇前k個最大(最小)的資料,最直觀的做法是把陣列裡面的資料全部排好序,然後輸出前面最大(最小)的k個資料。但是,排序最好需要o(nlogn)的時間,而且我們不需要前k個最大(最小)的元素是有序的。這個時候我們可以建立k個元素的最小堆(得出前k個最大值)或者最大堆(得到前k個最小值),我們只需要遍歷一遍陣列,在把元素插入到堆中去只需要logk的時間,這個速度是很樂觀的。利用堆得出前k個最大(最小)元素特別適合海量資料的處理。o(nlogk)

**:

[cpp]view plain

copy

print

?typedef

multiset<

int, greater<

int> >            intset;  

typedef

multiset<

int, greater<

int> >::iterator  setiterator;  

void

getleastnumbers(

const

vector<

int>& data, intset& leastnumbers, 

intk)  

}  }  }  

MySQL安裝指南 codestorm 新浪部落格

安裝mysql sudo apt get install mysql server 這個應該很簡單了,而且我覺得大家在安裝方面也沒什麼太大問題,所以也就不多說了,下面我們來講講配置。配置mysql 注意,在ubuntu下mysql預設是只允許本地訪問的,如果你要其他機器也能夠訪問的話,那麼需要改變 ...

gcc和g 的區別 codestorm 新浪部落格

gcc和g 都是gnu 組織 的乙個編譯器。誤區一 gcc只能編譯c g 只能編譯c 兩者都可以,但是請注意 1.字尾為.c的,gcc把它當作是c程式,而g 當作是c 程式 字尾為.cpp的,兩者都會認為是c 程式,注意,雖然c 是c的超集,但是兩者對語法的要求是有區別的。c 的語法規則更加嚴謹一些...

新浪部落格搬家

2013.08.01 曼妮說 你怎麼什麼都想買啊 我細想了想 最近的自己 好像是這樣的 什麼都想買 什麼都想要 慾望太多 是不是 在想要買東西之前 我需要想一想 這件東西是不是我需要的 我是不是真的必須買不可呢 ps 太浮躁 需要靜心 2013.08.02 好想讓你知道 不是因為無聊 只是因為是你 ...