2022q1 Homework1 (quiz1)
contributed by < Destiny0504
>
題目連結
測驗 1
- AAA = n->next = first;
- BBB = n->pprev = &h->first;
宣告用來建立 list 需要用到的 structure
決定 hash map 的大小並初始化
宣告 hash table node 的 structure
container_of
此巨集能透過指向 structure 中的 member 的 pointer 回推整個 sturcture 的開頭記憶體位置
- 回傳值為指向 structure 記憶體位置的 pointer
Hash function
此函式能將傳入的 val 計算完 hash 後的值並回傳
- 選用一個夠大的數字( 0x61C88647 )來 hash ,這麼做可以確保 hash 過後的值並不會太小,導致我們在取前幾個 bits 所得到的值太過接近,進而失去 hash 的效果。
- 變數 bits 可以幫助我們決定要取前面多少個 bit 當作 hash 完的結果。
- e.g. bits = 10 ,我們得到的 hash 值的範圍就會在 0 ~ 1023 之間
find key
確認 key 所代表的值是否在 map 之中
- 如果在 map 中函式會回傳指向 key 的 pointer ,否則回傳 NULL
- 透過移動 p 所指向的位置來確認 list 是否含有我們要的值。
map get
與 find key 的功能相同,差別只在於回傳的資料型別為 void pointer
map add
將新的值加入 map 中
- 先檢查要加入的值是否已在 map 中,如果已經加入過的話,就不做任何更動。
- 如果確認 key 不在 map 之中,則在 key 應該被加入的 list 中新增一個值為 key 的 node
map deinit
將分配給整個 map 的記憶體釋放,相當於把整個 map 刪除。
- 遍歷整個 map 來將每個 allocated 的 node 的 memory 都釋放。
解決 TwoSum 問題
Two Sum 問題連結
Reference
測驗 2
- COND1 = head->next != NULL && head->val == head->next->val
- COND2 = head != NULL && head->next != NULL && head->val == head->next->val
Singly-linked list 迭代版本
因為原本的題目就是 singly-linked list ,所以不額外實作 listnode
- 如果傳入的 list 為空或是只有一個 node 就直接回傳 head
- 將開頭所有重複的點全部移除,確保現在的 head 是需要被保留的點。這一步做完,如果整個 list 只剩下一個 node 以下,就直接回傳答案。
Doubly-linked list 迭代版本
Listnode 節點
List 所需要的函式
從 list 中移除含有重複 val 的 node
- 因為原本的題目是單向的 linked list ,所以我們要將原本的 linked list 中的所有的值全部加入自己實作的雙向 linked list。
- 將開頭所有重複的點全部移除。這一步做完,如果整個 list 如果沒有任何 node ,就直接回傳 NULL 。
- 利用雙向的 linked list 幫助判斷原本的 node 需不需要被刪除
- 因為雙向的 linked list 可以直接看前一個 node 的值,所以可以直接判斷現在的 node 需不需要被刪除。
測驗 3
宣告用來建立 list 需要用到的 structure
初始化 cache
分配一塊指定大小 (capacity
)的 memory ,用來模擬 cache 的運作。obj 中的每一個 index 皆指向一個獨立的 node。每一個 node 皆為一個用來儲存 data 的 cache block。
- 因為 cache 的大小有限,所以儲存資料的 key 會先經過 hash function 在存入對應的 block 。當我們需要拿取資料的時候,也是經過同樣的方式查看對應的 block 是否已有我們要找的資料。
釋放 cache
用 list.h 中實作的 list_for_each_entry_safe(entry, safe, head, member) 來一一釋放分配到的記憶體,達成清空 cache 的效果。
從 cache 中拿出指定的 object
計算出 key % obj->capacity
後,到對應的 block 檢查我們需要的資料是否在 cache 中。如果有則回傳 block 中的值,
將指定的 object 放入 cache
測驗 4
加上可以讀取測試資料的 main funtion 之後的正確答案
在同樣的 hash 值的 list 中找尋是否含有要指定的值
用 num % size
求出的 hash 值,再透過函式傳入的 head
,可以拿到整個可能包含 num
的 list ,接著從 list 中一一檢查是否有要查找的值( num
)。
解決 longest consecutive sequece 的 function
- 第一個 for 迴圈
- 這個 for 迴圈是為了初始化整個 hash table
- 第二個 for 迴圈
- 這個迴圈能夠將傳入此函式的
nums
所含有的數字一一加入 hash table
- 第三個 for 迴圈
- 先指定一個值
num
再去整個 hash table 尋找是否有跟 num
相連的數字,最後得出 longest consecutive sequece 的長度。
讀取 test data
Reference
- 測驗三 obj 的 malloc 問題
- structure pointer 在宣告結束的時候就擁有 4 bytes 的空間來儲存記憶體位置了,所以 sizeof(obj) 不會是一個不確定的數字。
- 參考 :Scopes of identifier