contributed by < robertnthu
>
linux2022
AAA = n->next = first;
BBB = n->pprev = &h->first;
首先,這個程式是要加入一個 hlist_node
到 map_t
裡面,而觀察可以判斷出,這個新的 hlist_node
要被加在最前面
(graphviz參考 jim12312321的圖並作筆記
所以可以看出有四個指標要更動,以下程式
struct hlist_node n
的next
指向 first
,不管 first
是不是空的first
非空,也就是本來那裡有其他hlist_node
,就把本來的first->pprev
指向&n->next
,也就是指向自己的指標(指向指標,所以是指標的指標)h->first
指向新加入的n
n->pprev
指到「指向n
的指標」,也就是&h->first
造一個210個 array,每個 element 都是 hlist_head
,並指向NULL
find_key()
找跟參數key
有一樣key
的hash_key
,找到的話就回傳data
,這個data
就是「所求的index」NULL
hash_table
找,有沒有target-nums[i]
這個值的hlist_node
,有的話就回傳hlist_node
NULL
nums
,查詢 hash table 裡面有沒有值是 target-nums[i]
nums[i]
,相加之後剛好會等於target
,那就是我們所求,於是回傳那個元素在nums
的 index,以及當前元素的 index ,也就是 i如果在 hash table 搜尋的速度視為 constant,那時間複雜度就只跟 for-loop 有關,也就是 O(n)
When first encountering this, most people are confused because they have been taught to implement hashtables differently. So Why do we have a pointer to hlist_node? Why do do we need a list in the first place?
因為上述這句話,我認為 hashtable.h 的實作是:盡可能滿足所有需求的同時,固定每個人的實作方式。
COND1= head->next && head->val == head->next->val
COND2= head->next && head->val == head->next->val
刪除重複節點的方式
概念跟遞迴版本一樣
以下是在 lab0-c 的實作程式
MMM1 = list_for_each_entry_safe
MMM2 = list_for_each_entry
MMM3 = list_for_each_entry
MMM4 = list_last_entry
LRUNode
被讀或寫,那這個 LRUNode
會被找出來,並且放在 linked list 的最前面lRUCacheGet
時,去 hash table 找,如果有找到的話,把它在 dlink 移到第一個,代表它最近被使用到
LLL = –left
RRR = ++right
到 hash table 的 slot 去找有當前 key 值的 seq_node
初始化 hash table,並把 nums[ ] 裡面的元素都加進去 hash table 裡面
迭代 nums[ ] 裡面的數字
如果有找到,while
迴圈會繼續做,直到沒有連續數字才會停止。
這個程式儘管使用 hash table,但因為有兩個迴圈存在,時間複雜度會是O(n2),如果先排序之後,再迭代整個 linked list,時間複雜度就是O(n*log(n))
hash_for_each()