優先級隊列
尋優先級訪問:根據數據對象間相對優先級對其進行訪問的方式。
優先級隊列:按照約定好的優先級,可以始終高效查找並訪問優先級最高數據項的數據結構。
- 把n個終端結點加入優先隊列,則n個結點都有一個優先權Pi (1<= i < n)
- 如果隊列內的節點數大於1,則
(1)從隊列中移除權重最小的兩個結點
(2)由(1)中的兩個結點產生一個新節點,作爲(1)中兩個結點的父結點,權值爲(1)中兩個結點權值的和
(3)把(2)中產生的新節點加入到優先隊列中 - 最後在優先隊列中的點爲樹的根節點。
HuffmanTree GenerateTree(HuffmanForest forest)
{
while(forest.size > 1)
{
HuffmanTree t1 = forest.DeletMin();
HuffmanTree t2 = forent.DeletMin();
HuffmanTree t3 = new HuffmanTree();
t3.weight = t1.weight + t2.weight;
t3.left = t1;
t3.right = t2;
}
HuffmanTree root = forest.DeletMin();
return root;
}
完全二叉堆:
1. 邏輯結構等同於完全二叉樹
2. 堆頂以外的每個結點都不高/低(大/小)於其父結點
大(小)頂堆:優先級最高(底)的結點處於堆頂。
二叉堆一般用數組表示,如果堆頂元素的秩爲0,則第i個元素的左右孩子的秩爲 2i+1 和 2i+2,其父結點爲 floor((i-1)/2)。
串(string)
結構簡單,規模龐大,元素重複率高。
字串:字符串中任意連續的片段
空串和字符串自身是該字符串的平凡子串、平凡前綴和平凡後綴,除此之外的字串爲該字符串的真子串、真前綴和真後綴。
int[] BuildNext(char[] W)
{
int i = 0;
int j = -1;
int[] T = new int[W.Length];
T[0] = -1;
while(i < W.Length)
{
if(j < 0 || T[i] == T[j])
{
i++;
j++;
if(W[i] != W[j])
{
T[i] = j;
}
else
{
T[i] = T[j];
}
}
else
{
j = T[j];
}
}
return T;
}
int KMPMatch(char[] str, char[] subStr)
{
if(sbuStr == null || subStr.Length > str.Length)
{
return -1;
}
int i = 0;
int j = 0;
int[] next = BuildNext(subStr);
while(i < str.Length && j < subStr.Length)
{
if(j<0 || str[i] == subStr[j])
{
i++;
j++;
}
else
{
j = next[j];
}
}
return i - j;
}
(BM的好後綴沒太想明白,眼皮已經打仗了,先存檔。。。)