天天看點

四種程式設計語言中散清單的周遊順序比較

我們使用ruby, javascript, lua和go這四種程式設計語言分别實作了以下步驟:

建立一個空的散清單h

以26個英文字母為key并按a-z的順序插入h

周遊h并列印周遊的順序,重複兩次

從h删除"r", "p", "t", "k"這四個key

周遊h并列印周遊的順序

将"r", "p", "t", "k"這四個key重新插入h

ruby 2.3 for ruby

node.js 6.9.1 for javascript

lua 5.2.2 for lua

go 1.7.1 for go

反複運作多次,輸出無變化,内容如下:

可見,ruby的散清單是一個有序結構,其周遊順序和插入順序完全一緻。

反複運作多次,輸出無變化,和ruby版本的輸出完全一樣(在此略去)。

這說明javascript的散清單也是一個有序結構,其周遊順序與插入順序相同。

第一次運作輸出:

第二次運作輸出:

不難看出,每次運作的輸出都不一樣,但在單次運作中,對散清單的周遊順序是确定的,且與插入順序無關。

不僅每次運作的輸出都不一樣,甚至每一行的輸出都不一樣。這說明go的散清單周遊操作是完全随機的。

ruby和javascript竟然将散清單這種經典的無序資料結構選擇了一種有序的實作,令人深感意外。兩者的周遊順序都和插入順序一緻。

lua的散清單的周遊順序和插入順序無關,但表的周遊順序在表内元素無變化時是确定的。

go的散清單周遊順序則是完全随機的,非常符合散清單是一種無序資料結構的特點。

但不論程式設計語言采用了哪種具體的散清單實作辦法,除非情況及其特殊,我們在編寫代碼時都應将散清單作為一種無序資料結構來使用,即在内心機器中,總是将散清單的周遊順序當成是完全随機的。

ruby是如何将散清單這種經典的無序資料結構實作為一種有序結構的?

上面lua的測試代碼每次運作的輸出都不一樣,這是為什麼?

go的散清單實作極具個性,并完全展現了散清單作為“無序資料結構”的特點。它是如何做到這一點的?

繼續閱讀