trie,字典樹,又稱單詞查詢樹、字首樹,是一種雜湊樹的變種。應用於字串的統計與排序,經常被搜尋引擎系統用於文字詞頻統計。
(後續再補充)
參見:
#include
using
namespace
std;
#define max 26
typedef
struct node
node;
node *createnew()//建立結點!
p->num = 0;
return p;
}void insert_str(char str, node *head)
else
}}int search_str(char str, node *head)
else
}return count;
}int main()
int c = search_str("ab", head);
cout
<< c << endl;
system("pause");
return
0;}
注意對上述**的理解:
根節點是乙個沒有實際意義的節點,根節點的子節點才是單詞開始的節點。
對節點的描述:乙個節點包含經歷該節點的單詞個數以及它的孩子節點。
typedef
struct node
node;
建立乙個節點時,把該節點的孩子節點都指向null,另外,經歷該節點的次數初始化為0。
node *createnew()
p->num = 0;
return p;
}
插入乙個節點,其實就是插入乙個單詞,乙個乙個字母插入,訪問根節點是用該字母在字母表中的位置來訪問的。
void insert_str(char
str, node *head)
else
//如果有相應的節點,就對節點的遍歷次數++。
}}
如果輸入:abcd abc abcc dac ab
那麼和ab匹配的字串有4個。輸出結果是4。
需要對節點新增乙個變數endflag。
如果endflag=0,表明該節點不是單詞的結尾,如果endflag=1,表明該節點是單詞的結尾。
插入單詞程式也需要修改:
針對:
已經有abcd插入abc時,我們只需要在插入abc時,當要插入到最後乙個字元時,判斷字典樹中是否已經有最後乙個字元,如果有,就說明存在字首。
if (i == len - 1&&p->next[c]!=null)//插入最後乙個字串,且它是前面某個單詞的字尾(已經有abcd,在插入abc時出現)
已經有abc插入abcd時,我們在插入c的過程中,判斷該節點是否是字典樹中某個單詞節點的結尾,如果是,就表明存在字首。
整體**如下 :
#include
using
namespace
std;
#define max 26
typedef
struct node
node;
node *createnew()
p->num = 0;
p->endflag = 0;
return p;
}void insert_str(char str, node *head,bool &isprefix)//插入功能,並在插入的時候判斷當前要插入的單詞
//是否是已經插入的單詞的字首或者已經插入的單詞是否是該單詞的字首
if (p->next[c] == null)
else
}p->endflag = 1;//單詞插入完以後,就把當前的節點作為終結節點,endflag=1。
}int main()
/*int c = search_str("ab", head);
cout << c << endl;*/
system("pause");
return
0;}
Google Hacking 的實現以及應用 轉
前言 google hacking其實並算不上什麼新東西,在早幾年我在一些國外站點上就看見過相關的介紹,但是由於當時並沒有重視這種技術,認為最多就只是用來找找未改名的mdb或者別人留下的webshell什麼的,並無太大實際用途.但是前段時間仔細啃了些資料才猛然發覺google hacking其實並非...
google hacking的實現以及應用
google hacking其實並算不上什麼新東西,在早幾年我在一些國外站點上就看見過相關的介紹,但是由於當時並沒有重視這種技術,認為最多就只是用來找找未改名 的mdb或者別人留下的webshell什麼的,並無太大實際用途.但是前段時間仔細啃了些資料才猛然發覺google hacking其實並非如此...
Google Hacking的實現以及應用
google hacking其實並算不上什麼新東西,在早幾年我在一些國外站點上就看見過相關的介紹,但是由於當時並沒有重視這種技術,認為最多就只是用來找找未改名的mdb或者別人留下的webshell什麼的,並無太大實際用途.但是前段時間仔細啃了些資料才猛然發覺google hacking其實並非如此簡...