我不明白splaying如何工作。
我不能遵循的部分是我們如何知道:i)zig
ii)zig-zag
或iii)zig-zig
必須完成。
如果我理解正確,這與路徑中的當前節點有關。
如果它是根的孩子,那麼它是一個zig
,否則(ii)或(iii)取決於當前節點和當前節點的父節點是否都是左(或右)子節點。好吧到目前爲止。
現在我沒有得到的部分:
當我們向下移動並不是將中間節點「移除」到左側和右側子樹中的過程,以便我們有一棵中間樹,最終將成爲項目的根在搜索下?
那麼如果我們從一棵樹開始,我們將不斷地做zig
而沒有別的,因爲我們正在刪除元素,並始終在根。
例如:
如果例如我正在尋找20
我會從根開始並向左走。所以當前節點的根目錄爲父節點,我做了一個zig。現在會發生什麼?我在26
左邊,但不是26
也是根?所以我應該做一個曲折?
但是從我在這個例子中看到的鋸齒形正在完成,我不明白爲什麼。
這裏有什麼幫助嗎?不知道如何splaying工作
1
A
回答
2
通過根,它們表示整個樹的根,而不是你正在撒播的子樹的根。所以,在你的例子中,12是整個樹的根。
...
如果你想一個例子,從工作,我最近編寫了Java中的一個伸展樹。你可以找到代碼here。
splay tree的重要之處在於它們將最近插入/查詢的節點向上(最多)移動到樹中的兩個級別。您必須根據其父級和父級節點的位置執行zig,zig-zig或zig-zag。
當訪問節點x時,對x執行展開操作以將其移動到根。爲了執行展開操作,我們執行一系列的展開步驟,每個步驟將x移近根部。
三種類型的噴射步驟是:(G =隆重父,P =父,並且x =節點到噴射)
- 齊格步驟:該步驟完成時p爲根。樹在x和p之間的邊上旋轉 。
- 之字形步:此步驟完成時,p 不是根,x和p都是正確的孩子或 都離開孩子。樹在連接p的邊上旋轉,其父g爲 ,然後在連接x和p的邊上旋轉。
- 之字形步驟:此步驟在p不是根,x是右孩子 且p是左孩子或反之亦然時完成。該樹在x和p之間的邊 上旋轉,然後在x和其新的父g之間的邊上旋轉。
http://en.wikipedia.org/wiki/Splay_tree
下面是在樹節點3的張開。
樹張開之前:
└── 0
└── (right) 9
└── (left) 7
├── (left) 5
│ ├── (left) 1
│ │ └── (right) 2
│ │ └── (right) 4
│ │ └── (left) 3
│ └── (right) 6
└── (right) 8
一個(右>左)鋸齒形後到節點3。
└── 0
└── (right) 9
└── (left) 7
├── (left) 5
│ ├── (left) 1
│ │ └── (right) 3
│ │ ├── (left) 2
│ │ └── (right) 4
│ └── (right) 6
└── (right) 8
另一個(左>右)鋸齒形後到節點3.
└── 0
└── (right) 9
└── (left) 7
├── (left) 3
│ ├── (left) 1
│ │ └── (right) 2
│ └── (right) 5
│ ├── (left) 4
│ └── (right) 6
└── (right) 8
一個(左>左)鋸齒齊格後到節點3。
└── 0
└── (right) 3
├── (left) 1
│ └── (right) 2
└── (right) 7
├── (left) 5
│ ├── (left) 4
│ └── (right) 6
└── (right) 9
└── (left) 8
經過一個(右)Zig到節點3.現在時間停止,因爲3位於根位置。
└── 3
├── (left) 0
│ └── (right) 1
│ └── (right) 2
└── (right) 7
├── (left) 5
│ ├── (left) 4
│ └── (right) 6
└── (right) 9
└── (left) 8t) 6
└── (right) 9
└── (left) 8
如果您嘗試再次訪問樹中的節點3,則它不必被展開,因爲它已經位於根位置。
相關問題
- 1. 我不知道如何讓__slots__工作
- 2. 不知道Directory.CreateDirectory()是如何工作的
- 3. ReaderWriterLockSlim - 不知道這是如何工作
- 4. 碰撞工作,但我不知道如何知道collsiion方向
- 5. rake中止!不知道如何建立任務'工作':工作'
- 6. 我的leakcanary工作嗎?如何知道?
- 7. 需要知道叉如何工作?
- 8. 如何知道Crontab是否工作?
- 9. 不知道爲什麼`asyncio.Lock`不工作
- 10. bmpFactoryOptions不工作,不知道爲什麼
- 11. 不知道爲什麼js不工作
- 12. 父()不工作...不知道如何選擇該元素!
- 13. 不知道如何讓HTML與該工作JS文件
- 14. 我如何知道我的工作副本是否不同步
- 15. 不知道MATLAB中的hist函數如何工作
- 16. JUnit和TestNG如何工作?我不知道理論
- 17. 使用cin.ignore()?不知道如何使它工作
- 18. jquery ajax autocomplete不知道如何使它工作
- 19. setlistadapter問題我不知道這是如何工作的
- 20. 耙中止,不知道如何建立任務'工作'
- 21. 我不知道如何使我的匹配系統工作
- 22. 使用crypt和驗證 - 不知道它是如何工作的?
- 23. 不知道如何使一行代碼在python中工作
- 24. 耙中止:不知道如何建設任務「的工作:工作」
- 25. 不知道如果javac不工作,或者我只是愚蠢
- 26. 如果陳述奇怪地工作不正常......不知道
- 27. 不知道爲什麼:如預期第一胎不工作
- 28. 如何知道員工已完成Resque中的工作/流程
- 29. 不知道如何同時
- 30. 不知道如何申報
我有一段時間沒有看過[splay trees](http://en.wikipedia.org/wiki/Splay_tree),但我很確定這不是他們的工作方式。 –
@MooingDuck:好的......那麼現在我對這個評論有什麼幫助?如果你有一些你認爲可以幫助我清楚的鏈接,請發佈。 – Cratylus
很難在這個網站上看到,但在我以前的評論中的「splay trees」一詞是一個鏈接:P –