lua中table的實現


table 在lua中是一個非常常用的數據結構,可以用來存放各種類型的元素,那么就會讓人好奇,它這么強大,它是用什么數據結構實現的呢

首先,考慮 table = {1, 2, 3, 4, 5, 6, 7, 8} 這樣的結構, 為了獲得最快的訪問速度,它是用數組實現的

那么如果執行table[10000] = 10; 莫非要創建10000個元素的數組,沒有值的都存為nil,這樣的空間利用效率太低無法接受,所有除了數組段之外,table還有一個哈希段,10000這個key會存在哈希段中,當太大的key值導致存儲空間利用率低於50%時,這個值會被放進哈希段中。

此外,使用string或者0和負數做key時,key都是保存在哈希段。當table表滿時,哈希段會擴大,所有段內的數據重新哈希。

lua的table使用數組和哈希表結合的方式,在空間效率和訪問效率上都很好。

具體的代碼示例:

 1 -- 創建一個以string作為key的table, 存儲在哈希表中
 2 tbTable = {["Monday"] = 1, ["Tuesday"] = 2, ["Wednesday"] = 3, ["Tursday"] = 4, ["Friday"] = 5, ["Saturday"] =  6, ["Sunday"] = 7};
 3 
 4 -- 只能使用pairs遍歷, 因為是用哈希算出存儲位置,並非按照定義順序存儲
 5 for k, v in pairs(tbTable) do
 6     print(k, v)
 7 end
 8 
 9 --[[ 一組輸出結果
10 Tursday    4
11 Tuesday    2
12 Wednesday    3
13 Friday    5
14 Sunday    7
15 Saturday    6
16 Monday    1
17 ]]--
18 
19 -- 在表中插入一組數字, 這些數字會存入數組區域中
20 for i = 1, 10, 1 do
21     table.insert(tbTable, i)
22 end
23 
24 -- 可以使用ipairs將數組中的值遍歷出來,不會訪問到存在哈希表中的內容
25 for k, v in ipairs(tbTable) do 
26     print(k, v);
27 end
28 
29 --[[輸出結果
30 1    1
31 2    2
32 3    3
33 4    4
34 5    5
35 6    6
36 7    7
37 8    8
38 9    9
39 10    10
40 ]]--

 


免責聲明!

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



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