三叉搜索樹

喜歡這篇文章嗎?喜歡的話去看博主的置頂博客,即可依據分類找到此文章的原版得到更好的體驗,

圖片及代碼顯示的問題,筆者深感抱歉,想要更好的體驗去原博文即可。


title: 三叉搜索樹
mathjax: true
date: 2020-03-16 16:41:00
categories: [myself_library,datastructure,tree,trie]
tags: [myself_library,datastructure,tree,trie]
keywords: [myself_library,datastructure,tree,trie]


ternary search tree

字典樹的缺點

   不難想到,對於那些字符集特別大的字典樹來說,他們的空間消耗特別大,因爲每個節點都要儲存大量的指針,而這些指針往往又是空的。

將BST與trie結合起來

   考慮這樣一種樹,每個節點有三個兒子,左右兒子表示自己的左右兄弟,向下的兒子表示真正的兒子。這樣的樹,將極大的提高了空間利用率。

偷個圖來放着

   這裏插入了as,at,be,by,he…
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-6qOvUsTe-1584453092471)(/images/三叉搜索樹.png)]

三叉搜索樹的插入

   考慮遞歸,假設我們插入到了某個節點,若下兒子與當前字符相等,則遞歸到下兒子並使用下一個字符來遞歸,如果當前字符小於下兒子,則遞歸到左兒子,保持當前字符不變,如果當前節點不存在了,則創建新節點,直接向下兒子走。

三叉搜索樹的刪除

   我們還是用數字來記錄終結節點的終結字符串有多少個,若找到待刪除的節點以後,終止與此的只有一個字符串,則直接刪掉,否則讓終極節點的計數器減1,注意在回溯的時候,如果三個兒子都沒有終結字符了,就刪掉自己。

三叉搜索樹的查找

   遞歸遞歸。

三叉搜索樹的缺點

   樹的平衡是一個很大的問題,這個我也沒辦法

三叉搜索樹的本質

   很多時候,很多數據結構像變戲法一樣,我們從本質看帶三叉搜索樹,我們發現下兒子其實是字典樹的邊,在考慮左右兒子,其實這個就是bst,哈哈哈發現了沒有,
   我們考慮刪掉所有下兒子,你會發現,剩下的是一個bst森林,就像lct刪掉指向父親沒有指向自己的邊以後,就是splay森林一樣,很神奇。我們將這些bst森林轉化爲一個一個普通的數組,讓這些數組從新充當節點,然後將下兒子連回去,
   一切都清晰了,又變成普通字典樹了。
   所以三叉搜索樹的本質是優化後的字典樹,每個節點都是一個bst。即trie套bst,外層樹爲trie,內層樹爲bst。

三叉搜索樹的優化?

   我們讓這裏的bst用avl代替?用rbt代替?用sbt代替?都可以,但是我覺得這樣編碼太難了吧,若實在是真的差這點效率,可以去這樣做,但我認爲,把普通字典樹的節點用avl-map、rbt-map、sbt-map直接範型編程或設爲類中類不香嗎。在這玩樹套樹確實高大上,效率也高,但編碼難度也太高了。

代碼

   先欠着,以後再還。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章