笨辦法學 Python · 續(xù) 練習 23:三叉搜索樹

練習 23:三叉搜索樹

原文:Exercise 23: Ternary Search Trees

譯者:飛龍

協(xié)議:CC BY-NC-SA 4.0

自豪地采用谷歌翻譯

我們將研究的最后一個數(shù)據(jù)結(jié)構(gòu)稱為三叉搜索樹(TSTree)紊撕,它可以在一組字符串中快速查找字符串。它類似于BSTree,但是它有三個子節(jié)點,而不是兩個,每個子節(jié)點只是一個字符而不是整個字符串蔓肯。在BSTree中阀参,左子節(jié)點和右子節(jié)點是樹的“小于”和“大于”的分支鸣皂。在TSTree中摔踱,左子節(jié)點虐先,中子節(jié)點和右子節(jié)點是“小于”,“等于”和“大于”的分支派敷。這可以讓你選取一個字符串蛹批,將其分解成字符,然后遍歷TSTree篮愉,每次一個字符腐芍,直到找到它或者你到達了末尾。

通過將你要搜索的一組鍵拆成單個字符的節(jié)點试躏,TSTree高效地使用空間換取時間猪勇。每一個這些節(jié)點將占用比BSTree更多的空間,但這允許你僅僅通過比較鍵中的字符來搜索鍵颠蕴。使用BSTree泣刹,你必須比較每個節(jié)點的鍵和被搜索鍵中的大多數(shù)字符。使用TSTree裁替,你只需要比較被搜索鍵的每個字母项玛,當你到達末尾,就完成了弱判。

TSTree的另一件不錯的事情是襟沮,它知道一個鍵何時不存在于集合中。想象一下昌腰,你的鍵的長度為 10 個字符开伏,你需要在一組其他的鍵中找到它,但是如果鍵不存在遭商,則需要快速停止固灵。使用TSTree,你可以在一到兩個字符的地方停止劫流,到達樹的末尾巫玻,并且知道這個鍵不存在。你最多只能比較鍵中的 10 個字符來發(fā)現(xiàn)它祠汇,字符比較比BSTree少得多仍秤。

挑戰(zhàn)練習

這個練習中,你打算完成另一個“代碼大師復(fù)制”的一部分可很,之后獨立完成TSTree诗力。你所需的代碼是:

class TSTreeNode(object):

    def __init__(self, key, value, low, eq, high):
        self.key = key
        self.low = low
        self.eq = eq
        self.high = high
        self.value = value


class TSTree(object):

    def __init__(self):
        self.root = None

    def _get(self, node, keys):
        key = keys[0]
        if key < node.key:
            return self._get(node.low, keys)
        elif key == node.key:
            if len(keys) > 1:
                return self._get(node.eq, keys[1:])
            else:
                return node.value
        else:
            return self._get(node.high, keys)

    def get(self, key):
        keys = [x for x in key]
        return self._get(self.root, keys)

    def _set(self, node, keys, value):
        next_key = keys[0]

        if not node:
            # what happens if you add the value here?
            node = TSTreeNode(next_key, None, None, None, None)

        if next_key < node.key:
            node.low = self._set(node.low, keys, value)
        elif next_key == node.key:
            if len(keys) > 1:
                node.eq = self._set(node.eq, keys[1:], value)
            else:
                # what happens if you DO NOT add the value here?
                node.value = value
        else:
            node.high = self._set(node.high, keys, value)

        return node

    def set(self, key, value):
        keys = [x for x in key]
        self.root = self._set(self.root, keys, value)

你需要使用你學到的“代碼大師復(fù)制”方法學習。要特別注意如何處理node.eq路徑以及如何設(shè)置node.value我抠。一旦你了解了getset的工作方式苇本,你將實現(xiàn)剩下的函數(shù)和所有的測試袜茧。要實現(xiàn)的函數(shù)有:

find_shortest

給定一個關(guān)鍵字K,找到以K開頭的最短鍵/值對瓣窄。這意味著如果你的set中有appleapplication 笛厦,那么調(diào)用find_shortest("appl")將返回關(guān)聯(lián)apple的值。

find_longest

給定一個關(guān)鍵字K康栈,找到以K開頭的最長鍵/值對递递。這意味著如果你的set中有appleapplication ,那么調(diào)用find_shortest("appl")將返回關(guān)聯(lián)application的值啥么。

find_all

給定一個關(guān)鍵字K登舞,找到以K開頭的所有鍵/值對。我會先實現(xiàn)它悬荣,然后基于它實現(xiàn)find_shortestfind_longest菠秒。

find_part

給定一個關(guān)鍵字K,找到最短的鍵氯迂,它擁有K的開頭的一部分践叠。研究如何以及在哪里設(shè)置node.value來使其生效。

研究性學習

  • 查看原始代碼的注釋嚼蚀,看看在_set過程中禁灼,在哪里放置value。修改它會修改get的含義嗎轿曙?為什么弄捕?
  • 確保你使用隨機數(shù)據(jù)來測試,并測量一些性能导帝。
  • 你也可以在TSTree中進行模糊匹配守谓。我認為這是一個附加題,所以嘗試實現(xiàn)它們您单,看看你想出了什么斋荞。模糊匹配是,'a.p.e'匹配"apple"虐秦、"anpxe""ajpqe"平酿。
  • 如何搜索字符串的結(jié)尾?提示:不要過度考慮它悦陋。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末染服,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子叨恨,更是在濱河造成了極大的恐慌,老刑警劉巖挖垛,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痒钝,死亡現(xiàn)場離奇詭異秉颗,居然都是意外死亡,警方通過查閱死者的電腦和手機送矩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門蚕甥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人栋荸,你說我怎么就攤上這事菇怀。” “怎么了晌块?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵爱沟,是天一觀的道長。 經(jīng)常有香客問我匆背,道長呼伸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任钝尸,我火速辦了婚禮括享,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘珍促。我一直安慰自己铃辖,他們只是感情好,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布猪叙。 她就那樣靜靜地躺著娇斩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沐悦。 梳的紋絲不亂的頭發(fā)上成洗,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機與錄音藏否,去河邊找鬼瓶殃。 笑死,一個胖子當著我的面吹牛副签,可吹牛的內(nèi)容都是我干的遥椿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼淆储,長吁一口氣:“原來是場噩夢啊……” “哼冠场!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起本砰,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤碴裙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舔株,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡莺琳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了载慈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惭等。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖办铡,靈堂內(nèi)的尸體忽然破棺而出辞做,到底是詐尸還是另有隱情,我是刑警寧澤寡具,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布秤茅,位于F島的核電站,受9級特大地震影響晒杈,放射性物質(zhì)發(fā)生泄漏嫂伞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一拯钻、第九天 我趴在偏房一處隱蔽的房頂上張望帖努。 院中可真熱鬧,春花似錦粪般、人聲如沸拼余。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匙监。三九已至,卻和暖如春小作,著一層夾襖步出監(jiān)牢的瞬間亭姥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工顾稀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留达罗,地道東北人。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓静秆,卻偏偏與公主長得像粮揉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子抚笔,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容