1. 程式人生 > >資料結構與演算法(二)向量結構

資料結構與演算法(二)向量結構

陣列:起始於地址A、物理位置連續的一段儲存空間。A[ ]。A[ i]=A+i x s.int *p=A +3,則可以認為P[0]=A[3]。

向量的構造:向量的ADT介面,向量的模板類。

向量裡面內建了元素型別為T的私有陣列,由new申請而成。向量的構造:預設構造,基於複製的構造。

向量的析構:釋放用於存放元素的內部陣列。向量的動態空間管理:要求向量的實際規模與內部陣列容量的比值也稱裝填因子,不超過一,也不接近於0。可擴充策略:若未滿時不擴容,否則加倍,並複製原內容到新陣列,釋放原來的。在插入時均會調入該演算法。在刪除操作遠多餘插入操作,則會減小裝填因子。所以,需要在每次刪除操作後,進行縮容演算法,保證裝填因子大於25%。在對單次操作的執行速度及其敏感的應用場合以上策略並不適用。

隨機向量的生成:置亂器,自後向前,將V[i-1]與V[0,i]中的某一元素進行交換。

向量的唯一化處理:o(n*n),若假如向量是有序的,再進行唯一化,可用o(n)的時間。依次用while迴圈找到不同元素,將其移植到緊鄰於前者右側。發現在唯一化時,向量的大小變了,但是後面的還是有元素存在。若果經過縮容,則不存在。

向量的查詢:無序查詢,有序查詢,二分查詢演算法。

向量的排序:排序演算法的總結,分類:內部排序(記憶體足夠容納),外部排序(藉助外部儲存,記憶體只能容納一小部分資料。)

離線演算法和線上演算法,前一情況,待排序的資料以批處理形式整體給出;後一情況,待排序的資料需要實時生成。根據所依賴的體系結構不同有序列和並行兩大排序演算法。還有根據排序演算法是否採用隨機策略,來分確定式和隨機式之分。

CBA式演算法,即比較樹演算法。

穩定性:考察演算法對重複元素的處理。即重複元素的相對次序在排序前後保持一致。

氣泡排序:自左向右,逐一檢查各對相鄰元素,若逆序,則交換區域性有序。穩定演算法。

歸併排序:兩個有序向量,各取出其首元素作比較,小的取出追加至輸出向量末尾,該元素的後繼成為新的首元素。只需載入兩個向量的首元素。主體結構是典型的分治策略。先分治再合併。關鍵是合併程式。如何寫?

merge(Rank lo,Rank mi,Rank hi,T *){
    T* A =elem+lo;
    int lb = mi -lo; T*B =new T[lb];
    for (Rank i =0;i<lb;B[i]=A[i++]);
    int lc = hi-mi;T*c=elem+mi;
    for(Rank i =0,j=0,k=0;(j<lb)||(k<lc);){
        if(j<lb && (!(k<lc) || (B(j)<=c(k))) A[i++]=B[j++];
        if(k<lc && (!(j<lb) || (B(j)<=c(k))) A[i++]=B[j++];
}
delete [] B;
}

時間複雜度:o(nlogn)。穩定演算法。