1. 程式人生 > >第十至十二章 算法分析--高階數據結構

第十至十二章 算法分析--高階數據結構

需要 while 目的 pub 特殊 lar pan 編碼 void

1.貪婪算法的第二個應用為 哈夫曼編碼 來進行文件壓縮。 文件壓縮的主要問題是給文件中的所有字符分配能唯一識別的編碼(n個比特),如果我們事先知道所有字符出現的頻率,把頻率最高的放在最上層,頻率低的放在左側最下層,這就是最優編碼。

2.編碼樹,所有字符都放在葉節點上,往左走的每條路徑代表0,往右走的每條路徑代表1,這種數據結構有時候叫做trie樹,節點的深度既是需要的比特位數。這種樹是滿樹:所有的節點要麽是樹葉,要麽有兩個兒子。一種最優的編碼將總是具有這個性質。並且這樣的編碼既是前綴碼。

3.紅黑樹

(1)紅黑樹是AVL樹(自平衡二叉搜索樹)的變種,其各種操作在最壞情形下花費O(logN)時間;

(2)紅黑樹性質:1.根是黑色的 2. 紅色節點的子節點必須是黑色的 3.一個節點到一個null 引用的每條路徑必須包含相同數目的黑色節點。

(3)自底向上的插入:1.新插入的項的父節點是黑色的,則插入完成

          2.如果插入節點的父節點是紅色的:

          2.1父節點的兄弟節點是黑色的,可以通過單旋轉或者雙旋轉。

          2.2父節點的兄弟也是紅色的,需要通過上慮操作解決。

(4)自頂向下紅黑樹:可以提前對紅黑樹進行自頂向下的過程,從而保證父節點的兄弟不為紅色。

4.後綴數組與後綴樹

(1)數據處理中最基礎的問題之一是從文本T中找到一段模式P所在的位置,並回答下列問題:a.存在能匹配P的T的子串嗎 b.P在T中出現了多少次,及位置。c.一般的問題,T是固定,針對不同的P有頻繁的請求。為了達到這些目的,我們一般會將T預處理成一種特殊的數據結構即後綴數組或後綴樹。

(2)後綴數組:文本T的後綴數組實際上就是T的所有後綴進行有序排列所組成的一個數組。 模式P如果在文本中,則P一定是某個後綴的前綴,那麽可以通過折半查找,以O(logT)

的時間找到。同時計算相鄰後綴的最大公共前綴的話,則每次找P出現的次數為O(P+ logT)

(3)後綴數組的Java實現

//compute the longest share string prefix
public static int computaLCP(String s1,String s2){
int i=0;
while(i<s1.length()&&i<s2.length()&&s1.charAt(i)==s2.charAt(i)){
i++;
}
return i;
}

public static void createSuffixArray(String str,int[] SA,int[] LCP){
if(SA.length!=str.length()||LCP.length!=str.length())
throw new IllegalArgumentException();

int N = str.length();

String[] suffiesx = new String[N];
for (int i = 0; i < N; i++) {
suffiesx[i] = str.substring(i);
}
Arrays.sort(suffiesx);

for (int i = 0; i < N; i++) {
SA[i] = N-suffiesx[i].length();
}

LCP[0] = 0;
for (int i = 1; i < N; i++) {
LCP[i] = computaLCP(suffiesx[i],suffiesx[i-1]);
}

}

第十至十二章 算法分析--高階數據結構