《 常見演算法與資料結構》符號表ST(2)——初等實現分析和有序符號表
阿新 • • 發佈:2019-01-21
符號表(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() | 刪除最大值 |
我們看看如果使用上面兩種初等實現有序符號表的功能,效能怎麼樣。可以看出二分查詢效率還是高很多,現在我們想想如何提高插入和刪除效率?這就是下面我們要提出的 二叉查詢樹