亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

JavaTreeMap源碼解析

2019-11-14 15:18:53
字體:
來源:轉載
供稿:網友

這篇文章開始介紹Map系列另一個比較重要的類TreeMap。 大家也許能感覺到,網絡上介紹HashMap的文章比較多,但是介紹TreeMap反而不那么多,這里面是有原因:一方面HashMap的使用場景比較多;二是相對于HashMap來說,TreeMap所用到的數據結構更為復雜。 廢話不多說,進入正題。

簽名(signature)

可以看到,相比HashMap來說,TreeMap多繼承了一個接口NavigableMap,也就是這個接口,決定了TreeMap與HashMap的不同:

HashMap的key是無序的,TreeMap的key是有序的

接口NavigableMap

首先看下NavigableMap的簽名

1
public interface NavigableMap<K,V> extends SortedMap<K,V>

發現NavigableMap繼承了SortedMap,再看SortedMap的簽名

SortedMap

1
public interface SortedMap<K,V> extends Map<K,V>

SortedMap就像其名字那樣,說明這個Map是有序的。這個順序一般是指由Comparable接口提供的keys的自然序(natural ordering),或者也可以在創建SortedMap實例時,指定一個Comparator來決定。 當我們在用集合視角(collection views,與HashMap一樣,也是由entrySet、keySet與values方法提供)來迭代(iterate)一個SortedMap實例時會體現出key的順序。 這里引申下關于Comparable與Comparator的區別(參考這里):

  • Comparable一般表示類的自然序,比如定義一個Student類,學號為默認排序

  • Comparator一般表示類在某種場合下的特殊分類,需要定制化排序。比如現在想按照Student類的age來排序

插入SortedMap中的key的類類都必須繼承Comparable類(或指定一個comparator),這樣才能確定如何比較(通過k1.compareTo(k2)comparator.compare(k1, k2))兩個key,否則,在插入時,會報ClassCastException的異常。 此為,SortedMap中key的順序性應該與equals方法保持一致。也就是說k1.compareTo(k2)comparator.compare(k1, k2)為true時,k1.equals(k2)也應該為true。 介紹完了SortedMap,再來回到我們的NavigableMap上面來。 NavigableMap是JDK1.6新增的,在SortedMap的基礎上,增加了一些“導航方法”(navigation methods)來返回與搜索目標最近的元素。例如下面這些方法:

  • lowerEntry,返回所有比給定Map.Entry小的元素

  • floorEntry,返回所有比給定Map.Entry小或相等的元素

  • ceilingEntry,返回所有比給定Map.Entry大或相等的元素

  • higherEntry,返回所有比給定Map.Entry大的元素

設計理念(design concept)

紅黑樹(Red–black tree)

TreeMap是用紅黑樹作為基礎實現的,紅黑樹是一種二叉搜索樹,讓我們在一起回憶下二叉搜索樹的一些性質

二叉搜索樹

先看看二叉搜索樹(binary search tree,BST)長什么樣呢?

 

二叉搜索樹

相信大家對這個圖都不陌生,關鍵點是:

 

左子樹的值小于根節點,右子樹的值大于根節點。

二叉搜索樹的優勢在于每進行一次判斷就是能將問題的規模減少一半,所以如果二叉搜索樹是平衡的話,查找元素的時間復雜度為log(n),也就是樹的高度。 我這里想到一個比較嚴肅的問題,如果說二叉搜索樹將問題規模減少了一半,那么三叉搜索樹不就將問題規模減少了三分之二,這不是更好嘛,以此類推,我們還可以有四叉搜索樹,五叉搜索樹&hellip;…對于更一般的情況:

n個元素,K叉樹搜索樹的K為多少時效率是最好的?K=2時嗎?

K 叉搜索樹

如果大家按照我上面分析,很可能也陷入一個誤區,就是

三叉搜索樹在將問題規模減少三分之二時,所需比較操作的次數是兩次(二叉搜索樹再將問題規模減少一半時,只需要一次比較操作)

我們不能把這兩次給忽略了,對于更一般的情況:

n個元素,K叉樹搜索樹需要的平均比較次數為k*log(n/k)。

對于極端情況k=n時,K叉樹就轉化為了線性表了,復雜度也就是O(n)了,如果用數學角度來解這個問題,相當于:

n為固定值時,k取何值時,k*log(n/k)的取值最?。?/p>

k*log(n/k)根據對數的運算規則可以轉化為ln(n)*k/ln(k),ln(n)為常數,所以相當于取k/ln(k)的極小值。這個問題對于大一剛學高數的人來說再簡單不過了,我們這里直接看結果

當k=e時,k/ln(k)取最小值。

自然數e的取值大約為2.718左右,可以看到二叉樹基本上就是這樣最優解了。在Nodejs的REPL中進行下面的操作

貌似k=3時比k=2時得到的結果還要小,那也就是說三叉搜索樹應該比二叉搜索樹更好些呀,但是為什么二叉樹更流行呢?后來在萬能的stackoverflow上找到了答案,主旨如下:

現在的CPU可以針對二重邏輯(binary logic)的代碼做優化,三重邏輯會被分解為多個二重邏輯。

這樣也就大概能理解為什么二叉樹這么流行了,就是因為進行一次比較操作,我們最多可以將問題規模減少一半。 好了這里扯的有點遠了,我們再回到紅黑樹上來。

紅黑樹性質

先看看紅黑樹的樣子:

 

紅黑樹示例

上圖是從wiki截來的,需要說明的一點是:

 

葉子節點為上圖中的NIL節點,國內一些教材中沒有這個NIL節點,我們在畫圖時有時也會省略這些NIL節點,但是我們需要明確,當我們說葉子節點時,指的就是這些NIL節點。

紅黑樹通過下面5條規則,保證了樹是平衡的:

  1. 樹的節點只有紅與黑兩種顏色

  2. 根節點為黑色的

  3. 葉子節點為黑色的

  4. 紅色節點的字節點必定是黑色的

  5. 從任意一節點出發,到其后繼的葉子節點的路徑中,黑色節點的數目相同

滿足了上面5個條件后,就能夠保證:根節點到葉子節點的最長路徑不會大于根節點到葉子最短路徑的2倍。 其實這個很好理解,主要是用了性質4與5,這里簡單說下:

假設根節點到葉子節點最短的路徑中,黑色節點數目為B,那么根據性質5,根節點到葉子節點的最長路徑中,黑色節點數目也是B,最長的情況就是每兩個黑色節點中間有個紅色節點(也就是紅黑相間的情況),所以紅色節點最多為B-1個。這樣就能證明上面的結論了。

紅黑樹操作

 

紅黑樹旋轉示例(沒有畫出NIL節點)

關于紅黑樹的插入、刪除、左旋、右旋這些操作,我覺得最好可以做到可視化,文字表達比較繁瑣,我這里就不在獻丑了,網上能找到的也比較多,像v_July_v的《教你透徹了解紅黑樹》。我這里推薦個swf教學視頻(視頻為英文,大家不要害怕,重點是看圖??),7分鐘左右,大家可以參考。 這里還有個交互式紅黑樹的可視化網頁,大家可以上去自己操作操作,插入幾個節點,刪除幾個節點玩玩,看看左旋右旋是怎么玩的。

 

源碼剖析

由于紅黑樹的操作我這里不說了,所以這里基本上也就沒什么源碼可以講了,因為這里面重要的算法都是From CLR,這里的CLR是指Cormen, Leiserson, Rivest,他們是算法導論的作者,也就是說TreeMap里面算法都是參照算法導論的偽代碼。 因為紅黑樹是平衡的二叉搜索樹,所以其put(包含update操作)、get、remove的時間復雜度都為log(n)。

總結

到目前為止,TreeMap與HashMap的的實現算是都介紹完了,可以看到它們實現的不同,決定了它們應用場景的不同:

  • TreeMap的key是有序的,增刪改查操作的時間復雜度為O(log(n)),為了保證紅黑樹平衡,在必要時會進行旋轉

  • HashMap的key是無序的,增刪改查操作的時間復雜度為O(1),為了做到動態擴容,在必要時會進行resize。

另外,我這里沒有解釋具體代碼,難免有些標題黨了,請大家見諒,后面理解的更深刻了再來填坑。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品福利在线看| 日韩电影第一页| 国产精品激情av电影在线观看| 日韩av色综合| 成人国产精品色哟哟| 在线看欧美日韩| 国产精品国产福利国产秒拍| 亚洲人成亚洲人成在线观看| 亚洲精品资源在线| 国产性色av一区二区| 亚洲一品av免费观看| 欧美性视频网站| 欧美精品少妇videofree| 国产成人中文字幕| 日韩经典中文字幕| 九九精品在线视频| 亚洲自拍偷拍福利| 中文字幕亚洲专区| 久久精品国产2020观看福利| 午夜精品国产精品大乳美女| 亚洲成人久久久| 欧美一区二区三区免费观看| 欧美国产乱视频| 日韩电影免费在线观看中文字幕| 日韩欧美精品中文字幕| 亚洲国产小视频在线观看| 亚洲一区二区三区香蕉| 成人美女av在线直播| 欧美富婆性猛交| 国产视频久久久久| 亚洲欧美精品一区二区| 国产美女主播一区| 欧美性猛交xxxx| 欧美日韩亚洲国产一区| 国产成人精品视频在线观看| 亚洲综合一区二区不卡| 亚洲第一福利在线观看| 久久69精品久久久久久久电影好| 亚洲影视九九影院在线观看| 性欧美长视频免费观看不卡| 91精品在线播放| 亚州av一区二区| 欧美成年人在线观看| 精品亚洲aⅴ在线观看| 国模精品一区二区三区色天香| 国产主播精品在线| 亚洲春色另类小说| 亚洲精品二三区| 国产免费一区二区三区在线能观看| 亚洲欧美三级伦理| 久久久久久久久久久久av| 最近更新的2019中文字幕| 欧美在线日韩在线| 日韩最新免费不卡| 国产精品视频在线观看| 久久久久久欧美| 九九热这里只有精品免费看| 亚洲成人黄色在线| 一区二区在线视频播放| 国内精品一区二区三区四区| 亚洲毛片在线免费观看| 中文字幕成人在线| 一区二区三区黄色| 中文日韩电影网站| 国内精品久久久久影院 日本资源| 日韩欧美国产高清91| 国产成人精品国内自产拍免费看| 欧美精品福利在线| 国产精品久久久久影院日本| 国产精品www| 91在线视频成人| 日韩欧美a级成人黄色| 38少妇精品导航| 欧美性生交xxxxx久久久| 性视频1819p久久| 国产亚洲欧洲高清一区| 成人激情av在线| 国产精品美女在线| 久久精品国产亚洲精品2020| 91网站免费观看| 亚洲美女www午夜| 精品视频一区在线视频| 欧美性猛交xxxx免费看漫画| 日韩欧美一区二区三区| 国产精品久久国产精品99gif| 91精品在线播放| 清纯唯美亚洲激情| 日本一区二区三区四区视频| 日韩美女毛茸茸| 午夜精品理论片| 国产精品狼人色视频一区| 国产精品第七十二页| 亚洲电影免费观看高清完整版| 欧美激情一级二级| 欧美黑人又粗大| 久色乳综合思思在线视频| 91精品国产色综合| 日韩的一区二区| 日韩一区二区三区国产| 国产精品美女主播| 亚洲影影院av| 欧美色视频日本高清在线观看| 在线国产精品视频| 国产亚洲精品一区二区| 欧美综合国产精品久久丁香| 亚洲女同性videos| 亚洲国产高清福利视频| 一区二区在线视频播放| 欧美性猛交丰臀xxxxx网站| 色青青草原桃花久久综合| 国产欧美日韩中文| 欧美黄色小视频| 日韩av片电影专区| 色与欲影视天天看综合网| 欧美影院在线播放| 亚洲 日韩 国产第一| 一区二区三区在线播放欧美| 亚洲欧洲在线视频| 久久亚洲国产成人| 国产精品爱久久久久久久| 欧美韩国理论所午夜片917电影| 中文字幕国产日韩| 欧美噜噜久久久xxx| 欧美老妇交乱视频| 国产乱人伦真实精品视频| 成人免费视频网| 亚洲区中文字幕| 国产成人精品电影久久久| 国产一区二区三区久久精品| 亚洲欧美日韩国产中文专区| 91免费看国产| 在线观看久久久久久| 全亚洲最色的网站在线观看| 亚洲人成电影网站色www| 日韩中文字幕视频在线| 热门国产精品亚洲第一区在线| 欧美日韩国产一区二区三区| 成人国产在线视频| 中文字幕免费精品一区| 久久精视频免费在线久久完整在线看| 欧美日韩成人在线观看| 中文字幕在线视频日韩| 亚洲精品日韩丝袜精品| 国产亚洲精品美女久久久| 97在线视频免费播放| 91精品久久久久久久久久久久久| 最近日韩中文字幕中文| 国产成人极品视频| 亚洲系列中文字幕| 久久久久久网站| 91亚洲精品一区| 亚洲国产天堂久久国产91| 中文字幕欧美视频在线| 亚洲精品视频网上网址在线观看| 欧美成人在线免费| 日韩成人小视频| 国产成人精品一区二区在线| 欧美亚洲第一区| 成人97在线观看视频| 日本久久久久久久久久久| 夜夜嗨av一区二区三区四区| 国产精品91在线观看| 久久精品视频网站| 亚洲最大成人免费视频|