[英]Skip list in java
我在主題Skip list
中瀏覽了java中的數據結構,我發現了以下內容:
在n nodes
的跳過列表中,對於每個k
和i
,使得1 ≤ k ≤lg n
且1 ≤ k ≤lg n
1 ≤ i ≤ n/2k–1⎦ – 1
,位置2k–1
· i
中的節點指向位置中的節點2k–1
·( i + 1
)。 這意味着每個第二個節點指向前面兩個位置的節點,每四個節點指向前面四個位置的節點,依此類推,如圖3.17a所示。 這是通過在列表中的節點中具有不同數量的參考字段來實現的:一半節點僅具有一個參考字段,四分之一的節點具有兩個參考字段,八分之一的節點具有三個參考字段,因此上。 參考字段的數量表示每個節點的級別,級別的數量是maxLevel = ⎣lg n⎦ + 1
。
並且該圖是:跳過列表,其中(a)均勻地和(b)不同級別的不均勻節點; (c)清楚顯示參考節點的跳過列表。
我不明白數學部分和sktip列表究竟是什么甚至是節點?
好吧,讓我試着讓你明白這一點。
跳過列表是一種數據結構,它肯定會使您在給定元素列表中的搜索速度更快。
更好的比喻是任何一個大城市的地鐵網絡。 想象一下,有90個站點可以覆蓋,並且有不同的線路(綠色,黃色和藍色)。
綠線僅連接編號為0,30,60和90的站點。黃線連接0,10,20,30,40,50,60,70,80和90藍線連接所有站點,從0到90。
如果你想在0號站登上火車,想要在75號站下來。最好的策略是什么?
常識會建議從0號車站搭乘綠線上的火車,然后在60號站下車。從60號車站乘坐黃線上的另一列火車,然后在70號站下車。從70號站乘坐另一列藍線火車到達75。
任何其他方式都會耗費更多時間。
現在用具有三個單獨列表的節點和行替換站(這些列表的集合稱為跳過列表)。
只是想要在包含值75的節點上搜索元素的映像。
我希望這能解釋Skip Lists的內容以及它們的效率。
在傳統的搜索方法中,您可以訪問每個節點並在75跳中達到75。 在二進制搜索的情況下,你可以在logN中完成它。在跳過列表中你可以在我的特定情況下在1 + 1 + 15中做同樣的事情。 你可以做數學,雖然似乎很簡單:)
編輯:均勻間隔的節點和不均勻間隔的節點正如您可以看到我的類比,它在每條線上的每個節點之間具有相同數量的站。 這是均勻間隔的節點。 這是一個理想的情況。
為了更好地理解它,我們需要了解Skip Lists的創建。
在其構建的早期階段,只有一個列表(藍線),並且每個新節點首先在適當的位置添加到列表中。 當藍線中的節點數量增加時,需要創建另一個列表(黃線)並將其中一個節點提升為列表2.(PS:列表1的第一個和最后一個元素始終提升為跳過列表集中新添加的列表)。 因此,添加新列表的那一刻將有三個節點。
促銷策略 :如何從最下面的列表(藍線)到上面的列表(黃線和綠線)找出要推廣的節點。
決定的最好方法是隨機:)所以我們假設添加一個新節點后,我們翻轉硬幣以查看是否可以將其提升到第二個列表。 如果是,那么我們將它添加到第二個列表然后再次翻轉硬幣以檢查是否必須在第三個列表中添加它。
所以你看,如果使用這種隨機機制,可能會出現節點間距不均勻的情況。 :)
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.