介紹幾個可視化數據結構和算法的網站


大二開始學習數據結構,老師的講課方式就是PPT照本宣科,講解算法就是把代碼的部分貼出來一行一行細講......基本每節課除了只知道老師講了什么內容,內容的思想我可以說是0%吸收,於是我便打算自學。

自學的路上我走了不少坑,比如通過看自學書的代碼來弄懂算法思想,結果發現是本末倒置。學到現在,我感覺數據結構大體分為兩個部分:概念闡述和算法實現,相比概念,算法實現的學習最后必須依靠線上,所花的時間成本也遠大於概念學習,我覺得像老師那樣把代碼放在幻燈片上細講的做法純粹在浪費時間。因為放映的都是某部分功能而不是整套算法,學的時候很難把眼前算法里的一些變量跟最上面的typedef的各種屬性聯系起來,再聯系到結構圖例以弄清楚是講了什么,課上先講的ADT在腦子里記不住,老師就就跳轉到算法上去了,最后導致盡管看懂了概念,看代碼卻依然如天書一般,看不到最后的輸出(既背后的數據結構整個操作的過程)。

 

基於“所想的事物肯定都有人實踐過了”的想法,我便搜索了一番。目前找到了四個網頁:

前三個已經被各路大佬介紹了無數遍了,但基本都是對網站的簡單介紹,我想把自己的實踐也記錄下來:

(一)Visualgo  https://visualgo.net/en

這估計是最為知名可視化網站了,也是我第一個找到的網站,可以自己繪制圖結構,但是右邊的代碼執行過程,我這個只會C和Javascript的菜鳥看的一臉懵逼。

此外這個網站有部分算法並未收錄,比如Floyd的最短路徑算法(Floyd-Warshall's Shortest Path)和拓補排序(topological sort)算法就沒有。

 

 

  

(二)Algorithm Visualizer https://algorithm-visualizer.org/

  一個Github項目,算法演示代碼為Javascript,可以修改代碼來改圖結構(話說這存儲圖結構用的都是領接矩陣),但似乎有bug,記得我有一次改prim算法的圖運行時動畫就不動了,只好改回默認圖。

  圖的點可以拖動,但是運行的時候一把步驟往回拖圖又會變成默認的樣子,很煩。

  另外可視化的效果也不怎么樣,比如這個Dijkstra的算法和Visualgo的一對比。。。一個什么都沒有,一個還能把點的占有關系顯示出來

 

 

 

 

 

 

 

(三) Data Structure Visualizations https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

舊金山大學開發的,從名字就知道主要是講數據結構,對現在還在學數據結構的我是最適合不過了,不過算法操作過程是用矢量圖演示的,圖結構隨機生成,沒法自己設定,也沒有實例代碼,但是看算法的操作過程夠用了。

(話說它這Dijkstra的算法是從開始點到所有點的,而我學習的是單點對單點)

 

 

 

 

(四)pythontutor http://pythontutor.com/

《算法圖解》作者實例代碼庫(https://github.com/egonschiele/grokking_algorithms)的附加推薦!,支持把C,Java,Python,Ruby等代碼的調試過程可視化,對我這個常苦於代碼調試看不到直觀的鏈表或者數組圖的小白可是很大的幫助。

運行模式分兩種,靜態編譯(Visualize Execution)和動態編譯(Live Programming Mode),區別在於能不能在演示途中修改代碼和改變圖形顯示設置。

不過各種代碼有自身的運行限制,詳細見文檔講述。。

 

 

 

工具介紹就是這些,至於使用和優點比較大家看各自的情況選取發揮。對我來講最好不過就是能看到自己寫的代碼背后數據的操作過程了,今年還有名為hedis的大佬發布了一個名為data visualizer的vscode插件(https://github.com/hediet/vscode-debug-visualizer),可是涉及的知識要求並不是我能夠掌握的。。。。

 

 

另外附Dijkstra算法的python實現如下:

from json import dumps
graph = {'start': {'a': 6, 'b': 2}, 'a': {
    'fin': 1}, 'b': {'a': 3, 'fin': 5}, 'fin': {}}
# graph["start"] = {}
# graph["start"]["a"] = 6
# graph["start"]["b"] = 2
# print (graph["start"])

# graph["a"] = {}
# graph["a"]["fin"]=1

# graph["b"] = {}
# graph["b"]["a"]=3
# graph["b"]["fin"]=5

# graph["fin"] = {}

# print(graph)
infinity = float("inf")
costs = {}
costs = {"a": 6, "b": 2, "fin": infinity}

print(costs)

parents = {"a": "start", "b": "start", "fin": None}


processed = []
json_graph = dumps(graph)


def find_lowest_cost_node(costs):
    lowest_cost = float("inf")
    lowest_cost_node = None
    for node in costs:
        cost = costs[node]
        if cost < lowest_cost and node not in processed:
            lowest_cost = cost
            lowest_cost_node = node
    return lowest_cost_node


node = find_lowest_cost_node(costs)
while node is not None:
    cost = costs[node]
    neighbors = graph[node]

    for n in neighbors.keys():
        new_cost = cost + neighbors[n]

        if costs[n] > new_cost:
            costs[n] = new_cost
            parents[n] = node

    processed.append(node)
    node = find_lowest_cost_node(costs)
print("Cost from the start to each node:")
print(costs)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM