利用多叉樹(字典樹)實現簡單的快速搜尋

2021-08-30 11:30:02 字數 2625 閱讀 2563

看到題目第一時間想到樹,而且是多叉樹。為什麼呢?

然後我們換個想法,我們可以先把單詞按照字母為單位分割,然後第1個字母在樹的第一層搜尋,若不存在該字母則新增該字母為本層的兄弟節點,存在該字母就選擇第2個字母,跳到下一層的首節點,再逐個搜尋,若不存在該字母則新增該字母為本層的兄弟節點,存在該字母就選擇第3個字母,跳到下一層的首節點,再逐個搜尋……,如此類推,直到搜尋或新增最後乙個字母時,把該節點標記為「單詞最後字母」,即完成新增乙個單詞的任務。然後每個單詞均進行一次這個行為,就完成了單詞樹,不僅不需要儲存單詞中同樣的部分,而且在搜尋時,最差情況僅 =(該語言字母數 * 單詞長度),例如搜尋乙個10個字母構成的英文單詞,最差只需要搜尋26*10=260次,無論增加多少個單詞也只需要這麼多次,效率比搜尋乙個亂序表高好幾個數量級了,也使得單詞表的排序變得十分簡單。

具體c語言實現**如下:

字母單元定義:

typedef struct vocalunit vocalunit;

struct vocalunit ;

全部實現**:

插入乙個單詞的大概流程:把單詞劃分成以字母為單位的陣列,第乙個字母進入第一層結點進行遍歷,沒有該字母就增加為該層兄弟,有就選擇陣列第二個字母,跳到對應字母的子結點頭(也就是下一層已存字母),進行剛才的對比操作,直到陣列最後乙個字母在對應層遍歷時,找到該字母的結點或建立了該字母的結點後,標記isword為1。

前序搜尋:提前通過迴圈找到對應開頭的n個字母對應結點,並把這n個字母提前輸入到棧,再layer += n,然後把該結點當成乙個根結點輸入之前說的單詞遍歷遞迴函式即可輸出該字母序列開頭的所有單詞。

#include "stdio.h"

#include "stdlib.h"

#include < sys / types.h >

#include < sys / stat.h >

#include < fcntl.h >

/**************chenjiezhu created at 20181030 18:00***********************/

typedef struct vocalunit vocalunit;

struct vocalunit ;

/**初始化節點**/

void initdicttrees(vocalunit * unit)

/**新增單詞到多叉樹**/

void addword(vocalunit * vhead, char * word) else

break;

} else else if (cursor - >nextlayerhead == null)

cursor = cursor->nextlayerhead; //預備遍歷下乙個字母,對應就是多叉樹的下一層

break;

} else

cursor = cursor->nextbrother;}}

}}}int layer = 0;

char content[100];

/**讀取樹中所有的單詞**/

void readvolcalproc(vocalunit * cursor)

readvolcalproc(cursor ->nextlayerhead);

content[layer - 1] = 0;

layer--;

readvolcalproc(cursor ->nextbrother);

}}void readvolcal(vocalunit * cursor)

/**搜尋某開頭的所有內容**/

void searchproc(vocalunit * cursor, char * key, int keylen) else

}cursor = cursor->nextlayerhead;

if (layer == keylen) }}

readvolcalproc(cursor);

}/**搜尋某關鍵字開頭的條目**/

void search(vocalunit * cursor, char * key, int keylen)

int main() else

}/**sometest:**/

addword(vhead, "a");

addword(vhead, "banana");

addword(vhead, "ash");

addword(vhead, "123456789");

printf("loading finished.\n");

//readvolcal(vhead);

do while ( strcmp ( input , "!") > 0);

return 0;

}

具體執行效果:

字典樹(多叉樹)

實現乙個 trie 字首樹 包含 insert,search,和 startswith 這三個操作。示例 trie trie new trie 你可以假設所有的輸入都是由小寫字母 a z 構成的。保證所有輸入均為非空字串。總結 這道題是字典樹的應用,在做這道題時花了不少時間,但是確實這個不是什麼難題...

字典樹的簡單實現

trie樹,又稱為字典樹,是一種樹形結構,是一種雜湊樹的變種,是一種用於快速檢索的多叉樹資料結構。用於儲存大量的字串。它的優點是 利用字串的公共字首來節約儲存空間。trie的核心思想是空間換時間。利用字串的公共字首來降低查詢時間的開銷以達到提高效率的目的。它有3個基本性質 1 根節點不包含字元,除根...

字典樹原理 利用map實現

字典樹用於統計次數 在一堆字串中查詢特定字串等環境中,效率較高。通常從根節點開始,每個節點存入字元,該字元的下層節點仍然有乙個map,用於存放第二個節點的字元,以此類推。如圖的字典樹,有兩個字串,abd和ac。當然,可以在每個節點上增加結束標識,用於標識他也是乙個完整的字串。比如,在b節點的表示欄位...