談運算式樹狀架構的緩衝(3):使用首碼樹

來源:互聯網
上載者:User

在上一篇文章裡我們設法將首碼樹構造為一個唯一的字串,然後使用字串作為key緩衝在字典中。 這個想法非常直接,做法也不困難(在遍曆時記錄詳細資料便可)。不過事實上,老趙在思考運算式樹狀架構的 緩衝問題時,這種字串拼接的方式只存在於腦海當中,而上文的實現是為了這一系列文章的完整性而特 地編寫的。這是因為它的缺點較為明顯,正如上文所述,字串拼接操作較為耗時耗資源,且很容易產生 一個長度可觀的字串(並非不能最佳化,不過實現就複雜了)。於是我們現在設法選擇另一個解決方案來 處理這個問題。

不過現在,我們先來考慮另一個問題:比較兩個字串是否相同(例如實現一個String.Equals方法) 。此時,我們往往會分幾步進行:

判斷字串長度是否相等,如果不等,則兩個字串肯定不同。

從頭遍曆兩個字串,如果找到某一位不相同,則兩個字串相同。

如果完整遍曆完整個字串,則兩者相同。

以上演算法基本上是我們可以寫出的最高效的比較演算法。為什麼這麼說呢?原因主要有以下兩點:

我們在比較時,首先使用最容易獲得的資訊(長度)進行判斷,並且在合適的時候(發現某一位不同 )及時返回,節省了時間。

比較時不需要儲存完整資訊(比較字串的第n位時,從0到n-1位字元無需保留),這樣在空間上也節 省了下來。

那麼我們來思考一下,為什麼前一篇文章中談到的字串會效能差呢?其實他正是由於違反了上面的 “特點”:

需要對整個樹進行完整編碼,這樣無法通過部分編碼上排除各種狀況,時間上耗費較大。

必須保留完整路徑,造成字串很長,導致空間上耗費也大。

與字串比較略有不同,既然我們最終是要匹配完全相同的運算式樹狀架構,那麼一次完整的樹遍曆是不可 避免的,因此第一點可能很難有所改變。那麼第二點呢?我們是否可以在進行匹配時,不用儲存之前已經 遍曆的節點,遍曆到某個“衝突”則表明匹配失敗,而經過一個完整遍曆,則表明匹配成功。為了進一步 看清需求,我們再說的清楚一點:

對一顆運算式樹狀架構進行完整遍曆,可以看作是構造一個由各節點(或節點的“特性”)構成的序列。

在遍曆序列時,無需儲存之前遍曆的結果。遍曆結束時,則表示匹配成功。

“序列”、“遍曆”、“匹配”……在心中反覆默念幾遍,您是否想到了些什嗎?沒錯,上述需求似 乎符合我們常用的資料結構:首碼樹。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.