字典樹 : 見名知意(在樹上進行查詢)。
跟字典相關的必定與查詢有密切的關係,
查詢就需要一定的媒介作為支撐,樹就為這種查詢提供支撐。
實現字串快速檢索的多叉樹結構。
常見的字串轉化:小寫字母或者大寫字母組成的字串,數字組成的字串,01編碼組成的字串。
trie 的每個節點都擁有若干個字元指標,就是說每個節點有多個子節點,通俗一點就是相當於古代
的大少爺可以有多個妻子。
1、插入(將乙個字串插入到字典樹上)
2、檢索(檢索乙個字串 s 在trie 上是否存在)
假設有單詞 : cab , cef , da 這樣三個單詞,那麼這樣三個單詞組成的圖是什麼樣的呢 ?
看下圖 : (通常還要在末尾進行標記一下,表示到字串的末尾)
插入 :
像每個單詞拼寫一樣,單詞的開頭就相當於是我們的根,從根節點出發,向兒子節點前進。
在向下走的過程中,看有沒有當前這個字元的節點,如果有這個節點,就順著這個節點繼續
往下走,如果沒有這個節點,就在這個節點之下再建立乙個節點。
拿乙個例子來說:
比如上圖的 cab 和 cef, 先插入第乙個字串,從根節點出發,第乙個字元是 c,我們發
現沒有這個字元的節點,所以建立乙個節點,將指標節點進行指向,然後一直向下移動,知道
字串結尾。再插入第二個字串,先檢測第乙個字元是否存在,我們發現存在,所以不用
建立,直接向下移動指標節點即可。
可以發現:
乙個節點最多可以有26個孩子。
檢索:只需要將字串遍歷一遍,順著根節點下來看這條路徑上是否有不存在的值,即 0,如果
沒有到末尾就發現有 0 ,說明這個字串不存在,反之即存在。
插入:
void insert(char str)
end[p] = true; // 在末尾進行標記
return ;
}
檢索:
bool query(char str) else
} return true;
}
題目描述:給定n個字串s1,s2…sn,接下來進行m次詢問,每次詢問給定乙個字串t,求s1~sn中有多少個字串是t的字首。
輸入字串的總長度不超過106,僅包含小寫字母。
輸入格式
第一行輸入兩個整數n,m。
接下來n行每行輸入乙個字串si。
接下來m行每行乙個字串t用以詢問。
輸出格式
對於每個詢問,輸出乙個整數表示答案。
每個答案佔一行。
輸入樣例:
3 2ab
bcabc
abcefg
輸出樣例:20
析題得說: 統計每個字串出現的個數即可,用乙個cnt陣列記錄每個字串出現的個數,然後進行檢索要處理的字串,累加結果(模板題)
ac**:
#include #include #include #include #include using namespace std;
const int size = 1e6 + 10;
int trie[size][26],cnt[size];
char str[size];
int n,m,idx = 0;
int main(void)
while(m --)
return 0;
} void insert()
cnt[p] ++; // 統計該字串的個數
return ;
}int query() else
} return res;
}
Trie樹(字典樹)
trie樹的核心思想是用空間換時間,通過在樹中儲存字串的公共字首,來達到加速檢索的目的。例如,對於一棵儲存由英文本母組成的字串的trie樹,如下圖 trie樹在實現的時候,可以用左兒子右兄弟的表示方法,也可以在每個節點處開設乙個陣列,如上圖的方法。trie樹的主要操作是插入 查詢,也可以進行刪除。插...
字典樹 Trie樹
字典樹 trie樹 顧名思義是一種樹形結構,屬於雜湊樹的一種。應用於統計 排序 查詢單詞 統計單詞出現的頻率等。它的優點是 利用字串的公共字首來節約儲存空間,最大限度地減少無謂的字串比較,查詢效率比雜湊表高。字典樹的結構特點 根節點不代表任何字元。其他節點從當前節點回溯到根節點可以得到它代表的字串。...
字典樹 trie樹
amy 56 ann 15 emma 30 rob 27 roger 52首先存入amy,level 0表示根,不持有資料。其餘每個節點持有乙個字元 葉子節點持有資料,且持有的字元為 0 level 0 root a level 1 m level 2 y level 3 0 56 level 4新...