Trie樹 提高海量資料的模糊查詢效能

2022-01-29 06:30:16 字數 3049 閱讀 7076

)。

selected_titles =

for 標題 in

for 高校 in

高校名單:

if標題.contains(高校):

selected_titles.add(標題)

break

select

title

from

tbwhere

title rlike

'清華大學|北京大學|...2657個高校

'

abc、abd、bcd、bce、c、cab、cde
假設我們要查詢,「cde」這個字串,在

陣列結構中,我們要遍歷一遍陣列,比較7次才能找到結果,做了比較多的「無用功」。

而在 tire 樹中只需要比較3次就可以找到,它的優勢非常明顯,由於樹型結構我們根本不用考慮左側a、b開頭的兩個分支,這就大大減少了比較的次數,從而減少「無用功」。

colleges = utils.read_file_to_list('

key_words.txt')

titles = utils.read_file_to_list('

titles.txt

')

class

trienode:

def__init__

(self):

self.nodes =dict()

#is_end=true 代表從根節點到當前節點構造trie樹的字串(出現在「高校名單」裡)

self.is_end = false

def

insert_many(self, items: [str]):

"""支援輸入字串陣列,直接構造乙個 trie 樹

:param items: 字串陣列

:return: none

"""for word in

items:

self.insert(word)

​def

insert(self, item: str):

"""向 trie 樹插入乙個短語

:param item: 待插入的字串

:return: none

"""curr =self

for word in

item:

if word not

incurr.nodes:

curr.nodes[word] =trienode()

curr =curr.nodes[word]

curr.is_end = true

def suffix(self, item: str) ->bool:

"""匹配字首,也就是判斷item字串是否是以「高校名單」中某個字串開頭

:param item: 待匹配字串

:return: true or false

"""curr =self

for word in

item:

if word not

incurr.nodes:

return

false

curr = curr.nodes[word] #

取得子節點

if curr.is_end: #

如果is_end=true說明當前字串包含了「高校名單」的某個字串

return

true

return false #

未匹配上

def infix(self, item: str) ->bool:

for i in

range(len(item)):

sub_item = item[i:] #

將待查詢的字串分成不同子串

#如果子串的字首在 trie 樹中能匹配上

#說明待查詢的字串item中包含「高校名單」中的元素,

#即實現了 tile rlike '清華大學|北京大學|...其他大學' 的功能

ifself.suffix(sub_item):

return

true

return false

#

陣列版本

cnt =0

start_time = int(time.time() * 1000)

for title in

titles:

for x in

colleges:

if x in

title:

cnt += 1

break

​end_time = int(time.time() * 1000)

print

(cnt)

print('

spend: %.2fs

' % ((end_time - start_time) / 60.0))​#

trie 樹版本

root =trienode()

root.insert_many(colleges)

cnt =0

start_time = int(time.time() * 1000)

for title in

titles:

ifroot.infix(title):

cnt += 1​

end_time = int(time.time() * 1000)

print

(cnt)

print('

spend: %.2fs

' % ((end_time - start_time) / 60.0))

5314spend: 9.13s

5314spend: 0.23s

trie

獲取完整源**

海量資料處理 trie樹

1.什麼是trie樹 trie樹 又稱單詞查詢樹 字典樹 是一種 樹形結構 是一種雜湊樹的變種,是一種用於快速檢索的多叉樹結構。典型應用是用於統計和排序大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 最大限度地減少無謂的字串比較,查詢效率比雜湊表 高。trie的核心思...

海量資料處理 Trie樹(字典樹)

trie樹,即字典樹,又稱單詞查詢樹或鍵樹,是一種樹形結構。典型應用是用於統計和排序大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是最大限度地減少無謂的字串比較,查詢效率比較高。trie的核心思想是空間換時間,利用字串的公共字首來降低查詢時間的開銷以達到提高效率的目的。...

海量資料的處理 字典樹

trie樹,即字典樹,又稱單詞查詢樹或鍵樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計和排序大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 最大限度地減少無謂的字串比較,查詢效率比雜湊表高。trie的核心思想是空間換時間。利用字串的公共字首來降低查詢時間的...