dancing links - 舞蹈的鏈表

 

 

  看了Donald E. Knuth關於dancing links的原文後,不得不說文章中處處透漏着藝術氣息,Knuth不虧是一代大師。

  本文不能算是深入的總結,或者說連翻譯也算不上,權當是學習dancing links的筆記。

  首先解釋一下什麼是dancing links

  對於雙向鏈表,假設x是雙向鏈表的一個元素,L(X)指向x元素的前一個元素,R(X)指向x元素的後一個元素,那麼刪除元素X操作爲:L(R(X)) = L(X) R(L(X)) = R(X) ,大部分情況下刪除元素後都會將所涉及的所有指針置空。那麼我們再看看如果恢復X在鏈表中的位置: L(R(X)) =  X R(L(X)) = X.(如下圖回溯,X元素的只是被間接隱藏起來,降低了回溯的成本) 這兩個操作看起來是不是簡單明瞭易於理解,但如作者所說,很多時候是不需要這麼做的,這樣做有可能會導致野指針氾濫,會有不可預知的錯誤。但是這個簡單的操作卻可以很容易的帶來程序設計中的便利,比如很多時候需要處理回溯這個操作的時候,這個結構卻非常的高效,回溯的過程中,只需要知道x就就可以進行撤銷這個操作了。引用作者的原話:“這個過程就像是全局結構下的指針變量做着精心設計的舞蹈,所以我稱這個技術爲dancing links"

  dlx主要用於完整覆蓋問題,回溯過程中的undo操作,返回前一個狀態有很多種實現方式,但dlx的優勢在於只需要記錄被刪除的結構元素就可以輕易的回覆的前一個狀態。對於下圖矩陣

可使用下圖的鏈表進行表示

回溯過程如下圖(回溯的精髓主要在減枝,如果dlx主要應用在特殊領域的優化)

DLX可以解決的覆蓋問題如下圖

 

如果想深入瞭解,參見knuth關於Dancing links的論文

 

 

發佈了44 篇原創文章 · 獲贊 3 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章