1. 程式人生 > >《 常見演算法與資料結構》符號表ST(2)——初等實現分析和有序符號表

《 常見演算法與資料結構》符號表ST(2)——初等實現分析和有序符號表

符號表(Symbol Table) (2)

本系列文章主要介紹常用的演算法和資料結構的知識,記錄的是《Algorithms I/II》課程的內容,採用的是“演算法(第4版)”這本紅寶書作為學習教材的,語言是java。這本書的名氣我不用多說吧?豆瓣評分9.4,我自己也認為是極好的學習演算法的書籍。

通過這系列文章,可以加深對資料結構和基本演算法的理解(個人認為比學校講的清晰多了),並加深對java的理解。

之前,我們介紹了符號表的概念這裡主要介紹一下符號表可能的初等實現,並分析他們的不足,然後引出有序符號表的概念,為下篇二叉查詢樹做鋪墊。

無序連結串列

這應該是最簡單的實現方案了,我們只用一個無序連結串列就可以實現符號表了

我們可以分析出這個演算法的效能:

可以看出,效能很差。

有序陣列

我們還可以用兩個有序陣列來實現ST(一個Key陣列,一個Value陣列,相互對應),如果陣列有序,那麼我們可以考慮用二分查詢提高查詢效率。這樣查詢複雜度可以提高到logN

但是有序陣列帶來一個問題,插入比較麻煩,插入的時候需要移動交換多次到正確的地方。

我們可以看出,用有序陣列的話,插入效率並沒提升很多,但是查詢效率可以提高到logN。

有序符號表

上面提到了可以用有序陣列實現符號表提高查詢效率,以後會有演算法能提高插入效率。這裡我們先引入一個新的概念:有序符號表。

其實也很好理解,就是符號表有序。那有序的符號表有什麼特殊的呢?最大的不一樣就是實現了一些有序操作。

除了之前說的那些API外,還實現了很多有序操作:

函式 功能
Key floor(Key key) 小於key的最大鍵
Key ceiling(Key key) 大於key的最小鍵
int rank(Key key) key的排名(小於key的個數)
Key select(int k) 返回rank為k的鍵
Key min() 返回最小的鍵
Key max() 返回最大的鍵
void deleteMin() 刪除最小值
void deleteMax() 刪除最大值

我們看看如果使用上面兩種初等實現有序符號表的功能,效能怎麼樣。可以看出二分查詢效率還是高很多,現在我們想想如何提高插入和刪除效率?這就是下面我們要提出的

二叉查詢樹