Day19

優先級隊列

尋優先級訪問:根據數據對象間相對優先級對其進行訪問的方式。
優先級隊列:按照約定好的優先級,可以始終高效查找並訪問優先級最高數據項的數據結構。

Huffman編碼 Wikipedia

  1. 把n個終端結點加入優先隊列,則n個結點都有一個優先權Pi (1<= i < n)
  2. 如果隊列內的節點數大於1,則
    (1)從隊列中移除權重最小的兩個結點
    (2)由(1)中的兩個結點產生一個新節點,作爲(1)中兩個結點的父結點,權值爲(1)中兩個結點權值的和
    (3)把(2)中產生的新節點加入到優先隊列中
  3. 最後在優先隊列中的點爲樹的根節點。
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)。

二叉堆 WikiPedia

串(string)
結構簡單,規模龐大,元素重複率高。
字串:字符串中任意連續的片段
空串和字符串自身是該字符串的平凡子串、平凡前綴和平凡後綴,除此之外的字串爲該字符串的真子串、真前綴和真後綴。

KMP算法 WikiPedia

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算法 WikiPedia

(BM的好後綴沒太想明白,眼皮已經打仗了,先存檔。。。)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章