# 2024q1 Homework2 (quiz1+2)
contributed by < `marsh-fish` >
### 第一週測驗題
[測驗 1](https://hackmd.io/@sysprog/linux2024-quiz1#%E6%B8%AC%E9%A9%97-1)
利用左右指標(左指標從頭部開始,右指標從尾部)紀錄所有大於和小於 `pivot` 的數之量,藉此得出 `pivot` 應插入之位置。
[測驗 2](https://hackmd.io/@sysprog/linux2024-quiz1#%E6%B8%AC%E9%A9%97-2)
原理和 merge sort 類似,藉由分成數個 runs 來合併,由於在分成 runs 的過程中會轉成遞增的序列,所以能夠有效的減少合併的次數。
### 第二週測驗題
[測驗 1](https://hackmd.io/@sysprog/linux2024-quiz2#%E6%B8%AC%E9%A9%97-1)
在 preorder 可以知道哪個節點是 root ,接著在 inorder 可以找到對應的節點,反覆尋找便可以建出整顆數。
[測驗 2](https://hackmd.io/@sysprog/linux2024-quiz2#%E6%B8%AC%E9%A9%97-2)
將使用到的節點移動到最前面,由於每次使用過的節點都會被移至 `head` ,所以 `tail` 的節點會是最長時間沒被使用的節點,所以在有新的節點加入時刪除此節點。
```graphviz
digraph structs {
node[shape=plaintext];
Lastest [fontcolor="blue"];
Oldest [fontcolor="blue"];
node[shape=box];
struct0 [label= "5"];
struct1 [label= "4"];
struct2 [label= "3"];
struct3 [label= "2"];
struct4 [label= "1"];
{
rank="same";
struct0 -> struct1
struct1 -> struct2
struct2 -> struct3
struct3 -> struct4
}
Lastest -> struct0;
Oldest -> struct4;
}
```
```graphviz
digraph structs {
node[shape=plaintext];
put [fontcolor="black"];
Lastest [fontcolor="blue"];
Oldest [fontcolor="blue"];
node[shape=box];
struct0 [label= "5"];
struct1 [label= "4"];
struct2 [label= "3"];
struct3 [label= "2"];
struct4 [label= "1"];
struct5 [label= "6"];
{
rank="same";
struct0 -> struct1
struct1 -> struct2
struct2 -> struct3
struct3 -> struct4
}
Lastest -> struct0;
Oldest -> struct4;
put -> struct5
}
```
```graphviz
digraph structs {
node[shape=plaintext];
put [fontcolor="black"];
Lastest [fontcolor="blue"];
Oldest [fontcolor="blue"];
node[shape=box];
struct0 [label= "5"];
struct1 [label= "4"];
struct2 [label= "3"];
struct3 [label= "2"];
struct4 [label=<<s>1</s>>];
struct5 [label= "6"];
{
rank="same";
struct0 -> struct1
struct1 -> struct2
struct2 -> struct3
struct5 -> struct0
struct4
}
Lastest -> struct5;
Oldest -> struct3;
put -> struct5
}
```
[測驗 3](https://hackmd.io/@sysprog/linux2024-quiz2#%E6%B8%AC%E9%A9%97-3)
藉由 `__ffs` 找到第一個設定的位元,並將要尋找的 `word` 中的第一個位元清除,重複此動作即可找到第 N 個設定的位元,其中 `__ffs` 的做法和二元搜尋的概念相似,先判斷前半段的位元,若前半段的位元都是零則 shift 相對應的位元。