日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python实现三叉树_使用python代码实现三叉搜索树高效率”自动输入提示”功能

發布時間:2025/4/5 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python实现三叉树_使用python代码实现三叉搜索树高效率”自动输入提示”功能 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近項目中需要通過全拼音和簡寫拼音實現輸入自動提示結果功能,查了一些資料發現三叉搜索樹無論是在時間還是空間上都比較優秀。

三叉搜索樹是trie樹的演化版,除去了指針,這樣在空間上節省不少,每個節點基本分為三個方向:左、中、右,當字符小于當前節點則存放左邊,大于則存放右邊,等于則存放中間。

具體實現原理可參考:http://igoro.com/archive/efficient-auto-complete-with-a-ternary-search-tree/

假如我們存入”AB”,”ABBA”.”ABCD”.”BCD”,這幾個單詞,那么三叉樹就會出現如下的儲存方式:

虛線表示匹配的箭頭,黃色的表示單詞結尾

下面是python實現代碼:# -*- coding: utf-8 -*-

#Ternary Search Tree

# 小于的left, 大于的right, 等于的mid

#定義狀態屬性

_SENTINEL = ()

class TST(object):

#定義三叉樹位置結構

__slots__ = ('splitchar','l','m','r','v')

#初始化結構

def __init__(self, ch=None):

self.splitchar = ch

self.l = self.m = self.r = None

#返回狀態

def __getstate__(self):

l = [self.splitchar,self.l,self.m,self.r]

if hasattr(self,'v'):

l.append(self.v)

return tuple(l)

#設置狀態,目的支持pickle的持久化對象

def __setstate__(self,l):

self.splitchar = l[0]

self.l = l[1]

self.m = l[2]

self.r = l[3]

if len(l) > 4 :

self.v = l[4]

#定義類方法,遞歸方式插入字母,這樣不用實例

@classmethod

def insert(klass,p,k,v):

#獲取字母

ch = k[0]

#若三叉樹結構為空,則初始化

if p is None:

p = TST(ch)

elif p.splitchar is None:

p.splitchar = ch

#若當前字符小于節點字符,則做插入

if ch < p.splitchar:

p.l = klass.insert(p.l,k,v)

#若當前字符等于節點字符,則

elif ch == p.splitchar:

#獲取剩余字符

k = k[1:]

if k:

p.m = klass.insert(p.m,k,v)

else:

#標記字母位置

p.v = v

#否則右插入

else:

p.r = klass.insert(p.r,k,v)

return p

#添加數據

def add(self,k,v):

return self.insert(self,k,v)

#搜索字符串

def search(self,s,fallback=None):

p = self

while p:

ch = s[0]

if ch < p.splitchar:

p = p.l

elif ch == p.splitchar:

s = s[1:]

if not s:

if hasattr(p,'v') :

return p.v

break

p = p.m

else:

p = p.r

return fallback

#搜索前綴的字符

def prefix_search(self,s):

p = self

while p:

ch = s[0]

if ch < p.splitchar:

p = p.l

elif ch == p.splitchar:

s = s[1:]

if not s:

return list(p)

p = p.m

else:

p = p.r

return []

#批量增加數據

def bulk_add(self,l,start=0,stop=None,sorted=False):

'''

為了取得最佳性能,字符串應該以隨機或者自平衡順序插入到三叉樹中

尤其不能按照字母順序,這樣就和鏈表沒啥區別了

'''

#若是沒有排序的數據則進行排序

if not sorted:

l.sort()

#若沒有結束位置,則以全部長度作為結束

if stop is None:

stop = len(l)

#比較開始到結束距離

diff = stop - start

#若為一個則直接添加

if diff == 1 :

self.add(l[start][0],l[start][1])

#若為兩個同樣直接添加

elif diff == 2 :

self.add(l[start][0],l[start][1])

self.add(l[start+1][0],l[start+1][1])

return

#兩個以上則開始計算中間值

else:

mid_p = start + (diff / 2)

#增加中間值

self.add(l[mid_p][0],l[mid_p][1])

#采用分治法遞歸增加,讓我回憶起快速排序

self.bulk_add(l,mid_p+1,stop,True)

self.bulk_add(l,start,mid_p,True)

def __contains__(self,k):

if self.search(k,_SENTINEL) is _SENTINEL:

return False

return True

def __iter__(self):

stack = []

p = self

if not p:

return

while True:

if p.r:

stack.append(p.r)

if p.m:

stack.append(p.m)

if p.l:

stack.append(p.l)

if hasattr(p,'v') :

yield p.v

if not stack:

break

p = stack.pop()

總結

以上是生活随笔為你收集整理的python实现三叉树_使用python代码实现三叉搜索树高效率”自动输入提示”功能的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 在线看片黄 | 久久精品国产大片免费观看 | 婷婷丁香久久 | 粗大黑人巨茎大战欧美成人免费看 | 国产免费av一区 | 你懂的网站在线观看 | 日韩欧美h | 欧美高清性 | 曰本不卡视频 | 涩涩涩999 | 欧美黑人性受xxxx精品 | 天天躁夜夜躁 | 久久毛片网站 | 中文字幕有码在线 | 日批免费看 | 日批免费网站 | 国产黄色免费 | 色噜噜在线观看 | 99久久久无码国产精品性波多 | 91成人在线免费视频 | av网页在线| 国产裸体永久免费无遮挡 | 日韩欧美国产一区二区三区在线观看 | 久草资源在线播放 | 色欲久久久天天天综合网 | 精品福利在线视频 | 一卡二卡三卡四卡五卡 | 日本伦理一区二区三区 | 午夜激情视频在线观看 | 精品国产九九九 | 在线日韩免费 | 日日夜夜超碰 | 在线永久看片免费的视频 | 九一av| 久久少妇av | 亚洲性事 | 久草手机在线视频 | 看毛片视频 | 欧美人与动性xxxxx杂性 | 高潮一区二区三区 | 日韩性生交大片免费看 | 在线视频观看国产 | 国产精品天天av精麻传媒 | 色交视频 | 免费视频一二三区 | 在线午夜视频 | 色偷偷综合 | 青青草十七色 | 日本黄大片在线观看 | 国产精品乱码一区二区视频 | √8天堂资源地址中文在线 欧美精品在线一区二区 | 波多野结衣一区二区三区四区 | 久久精品亚洲精品 | 国产精品一区二区无码对白 | 麻豆国产网站 | 久久这里 | 中文字幕一区2区3区 | 久久嫩草精品久久久久 | 免费的黄色大片 | 成人免费一区 | 免费色视频 | 国产五十路 | av色先锋| 天天躁日日躁狠狠躁喷水 | 精品一区二区在线观看 | 国产亚洲成av人片在线观看桃 | 日本色www | 国产淫片av片久久久久久 | 一本大道东京热无码aⅴ | 日本精品免费在线观看 | 国产精品久久网站 | 黄色男人的天堂 | 免费网站在线观看视频 | 久久久久久中文 | 26uuu精品一区二区在线观看 | 欧美一页 | 中文字幕人妻熟女在线 | 亚洲天堂网视频 | 久久四虎| 黄在线免费看 | 五月少妇 | 久久精品国产99精品国产亚洲性色 | 各种含道具高h调教1v1男男 | 成品人视频ww入口 | 精品久久在线 | 久久久久久麻豆 | 亚洲天堂2018av | 日韩av一区二区三区 | av在线电影院 | 秋霞一级视频 | 国产女人高潮时对白 | 国产123| 成人性生活免费看 | 91偷拍一区二区三区精品 | 中文字幕一区二区精品 | 色福利在线 | 婷婷亚洲五月色综合 | 久久人人妻人人人人妻性色av | 成年人在线观看 |