contributed by < linjohnss
>
Leetcode 1. Two Sum
變數節有 4 種:
map_t
為 hash table 的結構,包含一個紀錄 hash index 數量的 bit
以及指向一個 hlist_head
陣列的指標。hlist_node
與 hlist_head
為 Linux 核心中專門為了 hash table 而設計的資料結構,由一個 hlist_head
連接多個 hlist_node
組成非環狀 doubly linked list。hash_key
為儲存陣列值作為 key
以及其 index 作為 data
。可以藉由 container_of
讀取。graphviz 參考 cy023 quiz1 開發筆記
malloc
配置 map_t
空間。hlist_head
指標陣列,共 MAP_HASH_SIZE(map->bits)
個 bucket,全指向 NULL。MAP_HASH_SIZE
是用於取得 bucket 數量(2^bit)。走訪相同 index 的 list,並找出 key
相同的 hash_key
,若沒找到則回傳 NULL。
find_key
進行搜尋,如果有找到相同的 key
表示已經找到答案,故 return
。hash_key
空間,AAA:n->next = first
BBB:n->pprev = &h->first
n
放在 first
的前面。first
不為 NULL,則需將 first->pprev
指向 &n-<next
。h
與 n
連接,即可完成 node 的插入。走訪整個 hash table 並將記憶體空間釋放掉。
map->ht
的每一個元素,用 head
指向該元素。kn
指向 hash_key
、n
指向該 node。n
從 list remove。kn
的記憶體空間。map
的記憶體空間。num
、陣列大小 numSize
、目標總和 target
與回傳結果的陣列大小 returnSize
。map_init
),並配置結果陣列的記憶體空間 ret
。target
差值的 index 存在。ret
)。根據 include/linux/types.h 中定義,hlist_head
以及 hlist_node
的結構如下:
宣告一個有 2^bits 個元素的 hash table,並初始化每一個元素。
根據 hash.h
的註解,提到將輸入乘以一個大的奇數並取高位,可以有效分散數列。其中 GOLDEN_RATIO phi = (sqrt(5)-1)/2
或其負數具有特別好的特性,而取負數 (1 - phi) = phi**2 = (3 - sqrt(5))/2
更方便實做乘法,且對成果不影響,故選擇以下數字作為 GOLDEN_RATIO。
判斷 head->val
與 head->neat->val
是否相等。
COND1:head->neat && head->val == head->next->val
COND2:head->next && head->val == head->next->val
Leetcode 146. LRU Cache
malloc
配置一個 LRUCache
空間,capacity
為 cache 的容量。obj->dhead
與 obj->hheads
list_for_each_entry_safe
走訪 obj->dhead
,釋放 list 節點的記憶體。MM1:list_for_each_entry_safe
key
的 hash
。list_for_each_entry_safe
走訪 obj->hheads[hash]
的 list。key
的節點,並將其移動至最前端,然後回傳 lru->value
。MM2:list_for_each_entry
key
的 hash
。list_for_each_entry
走訪 obj->hheads[hash]
的 list,找到是否已經存在,若存在則用 list_move
把 lru->dlink
移到最前端。lru
的空間,並計算 count++
。MM3:list_for_each_entry
MM4:list_last_entry
在 linux/mm/swap.c
中有一個函式 folio_add_lru
,其運用到 LRU 相關的實做。
參考資料
https://www.kernel.org/doc/gorman/html/understand/understand013.html
https://elixir.bootlin.com/linux/latest/source/mm/swap.c#L458
Leetcode 128. Longest Consecutive Sequence
hash
,需取絕對值。heads[hash]
找到是否有相同的值。node
; 否則回傳 NULL。head
的記憶體空間(指標陣列),並初始化每個元素。LLL: –left
RRR:++right
linux kernel
linux2022