lua重新學習筆記2(table表)

2021-09-28 11:15:22 字數 1572 閱讀 9304

commonheader:存放所有資料型別都通用的字段

lu_byte flags:這是乙個byte型別的資料,用於表示這個表中提供了哪些元方法。最開始這個flags是空的,也就是0,當查詢一次後,如果該表中存在某個元方法,那麼將該元方法對應的flag bit置為1,這樣下一次查詢時只需要比較這個bit就行了。每個元方法對應的bit定義在ltm.**件中。

lu_byte lsizenode:該表中以2為底的雜湊表大小的對數值。同時由此可知,雜湊表部位的大小一定是2的冪,即如果雜湊桶陣列要擴充套件的話,也是以每次在原大小基礎上乘以2的形式擴充套件。

struct table *metatable:存放該錶的原表。

tvalue *array:指向陣列部分的指標。

node *node:指向該錶的雜湊桶陣列起始位置的指標。

node *lastfree:指向該錶雜湊桶陣列的最後位置的指標。

int sizearray:陣列部分的大小。

table查詢過程:

因為table包括雜湊表和陣列兩部分

if key為整數值,它的值》0且<=陣列大小

嘗試在陣列部分檢視

else 嘗試在雜湊表中查詢

計算出key的雜湊表,訪問雜湊node得到雜湊桶位置

遍歷雜湊桶下所有鍊錶元素,直到找到key

resh過程:

1.分配乙個點陣圖nums,將其中所有位置設0,意義在於:nums陣列中第i個元素存放的是key在2的(i-1)次冪和2的i次冪之間的元素數量。

2.遍歷lua表中的陣列部分,計算其中的元素數量,更新對應的nums陣列中的元素數量。

3.遍歷lua表中的雜湊桶部分,其中可能存放正整數。

4.此時nums陣列已經有了當前這個table中所有正整數的分配統計。逐個遍歷nums陣列,獲得其範圍區間內所有包含的整數數量大於50%的最大索引,作為重新雜湊之後的陣列大小,超過部分的正整數,分配到雜湊桶部分。

5.根據上面計算得到的調整後的陣列和雜湊桶大小調整表。

注意:1.盡量不要將乙個表混用陣列和雜湊表部分。

2.盡量避免重新雜湊操作,代價重。

採用預填充技術會更好。當需要建立非常多的小表時,應預先填好表的大小,減少直譯器被動地進行重新雜湊操作過程。

避免lua的rehash:(如何高效的用lua)

1)建立的時候先複製,初始化(避免rehash)

2)盡量多使用local

3)用table.concat()代替字串concat是concatenate(連鎖, 連線)的縮寫. table.concat()函式列出引數中指定table的陣列部分從start位置到end位置的所有元素, 元素間以指定的分隔符(sep)隔開。除了table外, 其他的引數都不是必須的, 分隔符的預設值是空字元, start的預設值是1, end的預設值是陣列部分的總長。

mysql重新學習筆記

mysql命令複習 desc table 列式展示 alter add 增加列 delete和 truncate table的區別 1.delete dml語言 資料還可以找回來,恢復回來 逐條刪除 刪除速度要慢一些 可以有條件的刪除。delete from 表名 where 條件 2.trunca...

重新學習makefile

今天回顧了一下makefile,做下筆記 首先準備幾個簡單的檔案 add.c head.h main.c mul.c sub.c 然後第一版 makefile 然後第二版 gcc c main.c o main.o 然後第三版 makefile 的語法跟shell 很像 第四版 目標 依賴 tab ...

重新學習struts

這就是所謂的一邊工作一邊學習。今天準備把給公司寫個管理頁面,按照之前的路數,寫起來應該挺快,但是不太規範。也就沉下心來學習一下了。第二個學習的是,異常處理。也是在學校的時候,聽老師說過,struts2有提供乙個異常處理機制。平常我們有些異常處理,會在 中寫try catch。public strin...