cedar trie樹的基本使用

安裝:
> wget http://www.tkl.iis.u-tokyo.ac.jp/~ynaga/cedar/cedar-latest.tar.gz
> tar zxvf cedar-latest.tar.gz
> cd cedar-YYYY-MM-DD
> configure
> make install

使用:
#include <cedar.h>
cedar::da<int> trie;

示例數據:
std::vector<std::tuple<const char*, int>> data = {
std::make_tuple("a", 1),
std::make_tuple("ab", 2),
std::make_tuple("abc", 21),
std::make_tuple("abe", 22),
std::make_tuple("abzd", 23),
std::make_tuple("ac", 3),
std::make_tuple("ac1", 31),
std::make_tuple("aczfdas", 32),
std::make_tuple("b", 100),
std::make_tuple("bab", 101),
std::make_tuple("babafdasf", 102),
std::make_tuple("bzzz", 103),
};

(1)插入元素
//如果這個key已經存在,則會把它原有的value再加上value;而不是重新賦值
trie.update(key, strlen(key), value);

(2)前綴查詢
①獲取所有匹配葉子節點的信息(id、length、value)
//第二個參數存放查詢結果,類型爲cedar::da<int>::result_triple_type*,可以傳入一個數組名,在該數組中存放多個結果
//第三個參數表示將匹配到的前多少個結果存放在result指向的空間裏
//第四個參數表示取第一個參數的前4個字符作爲前綴來匹配,默認爲0,就是取第一個參數整個字符串匹配
cedar::da<int>::result_triple_type result;
auto count = trie.commonPrefixPredict("aczf", &result, 1, 4);
std::cout << count << std::endl;
std::cout << result.value << std::endl; //匹配到的第一個葉子節點的value值
std::cout << result.length << std::endl; //匹配到的第一個葉子節點代表的字符串,在"aczf"後面的剩餘長度

②獲取所有匹配葉子結點的value
//前綴匹配2【commonPrefixPredict()】
int result2[4] = { 0 };
count = trie.commonPrefixPredict("ab", result2, 4);
std::cout << result2[0] << std::endl;
std::cout << result2[1] << std::endl;
std::cout << result2[2] << std::endl;
std::cout << result2[3] << std::endl;

(3)精確匹配
//精確匹配exactMatchSearch()
//這個函數是模板函數,並且無法通過參數推算模版,所以必須顯式的指定類
std::cout << "exactMatchSearch()" << std::endl;
auto value = trie.exactMatchSearch<int>("ab");
std::cout << value << std::endl;

(4)suffix查詢
//尋找result.id這個節點("aczfdas"),長度爲result.length(3)的後綴(“das”)
//要保證key_suffix有足夠的空間保存這個suffix
cedar::da<int>::result_triple_type result;
auto count = trie.commonPrefixPredict("aczf", &result, 1);
char* key_suffix = new char[result.length + 1]; //存放後綴“das”
trie.suffix(key_suffix, result.length, result.id);
std::cout << "suffix() key_suffix:" << key_suffix << std::endl;

(5)查找下一個葉子結點
count = trie.commonPrefixPredict("ab", &result, 1);
for(size_t i = 1; i < count ; i++){
//從result.id這個節點開始,查找下一個葉子節點
//上面count保存的是以ab爲前綴的這棵子樹一共有多少個葉子結點,result2保存的是其中的第一個葉子結點的信息
//所以調用count - 1次next()正好可以找出剩餘葉子結點的信息
//result.length爲result這個葉子結點的深度
auto value = trie.next(result.id, result.length);
//成功執行完一次next後,result會更新爲查找到的下一個葉子結點的信息
//返回值爲下一個葉子結點的value值;如果沒有下一個節點,返回的是CEDAR_NO_PATH
}

(6)查找是str前綴的key
//返回是str前綴的key的集合
//"abcd" -> ["a", "abc", "abcd"]
std::cout << "commonPrefixSearch" << std::endl;
count = trie.commonPrefixSearch("abcd", result2, 4);
std::cout << count << std::endl; //輸出3
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章