or
or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up
Syntax | Example | Reference | |
---|---|---|---|
# Header | Header | 基本排版 | |
- Unordered List |
|
||
1. Ordered List |
|
||
- [ ] Todo List |
|
||
> Blockquote | Blockquote |
||
**Bold font** | Bold font | ||
*Italics font* | Italics font | ||
~~Strikethrough~~ | |||
19^th^ | 19th | ||
H~2~O | H2O | ||
++Inserted text++ | Inserted text | ||
==Marked text== | Marked text | ||
[link text](https:// "title") | Link | ||
 | Image | ||
`Code` | Code |
在筆記中貼入程式碼 | |
```javascript var i = 0; ``` |
|
||
:smile: | ![]() |
Emoji list | |
{%youtube youtube_id %} | Externals | ||
$L^aT_eX$ | LaTeX | ||
:::info This is a alert area. ::: |
This is a alert area. |
On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?
Please give us some advice and help us improve HackMD.
Do you want to remove this version name and description?
Syncing
xxxxxxxxxx
2023q1 Homework3 (quiz3)
contributed by <
Shiritai
>測驗一
完成紅黑樹 parent 指標之指標、對齊、顏色等相關操作。
AAAA
考慮對齊,取得親代指標指標以
long
(64 bits) 對齊,由於每個地址指向一 byte (8 bits),故真正對齊的地址需為 \(\frac{64}{8} = 8\) 的倍數,也就是最低 \(3\) 位元應為零。不過考慮
long
在不同 ABI 下長度不一,此時可以利用sizeof
處理跨平台的情況。BBBB
設定顏色為紅色單純對最低位進行標記。
CCCC
設定顏色為黑色單純對最低位進行標記。
完成走訪邏輯
DDDD
、EEEE
走訪左右子樹,當非走訪至葉節點且與當前節點相比較小/大時,往左/右子節點走訪。完成 treesort 邏輯
cmap
list
將
list
末個next
設為NULL
後,重設間接指標的起點。圖示化分析以間接指標遍歷的邏輯
以中序遍歷重建
list
,為例,其使用間接指標的技巧,避免邊界條件判斷的必要。假設從 a 走訪到 c,行為如下圖所示:*list = node (1), list = &(*list)->next
*list = node (2), list = &(*list)->next
*list = node (3), list = &(*list)->next
next
設為NULL
是業界常態測驗二
節點與平衡標記相關
取親代指標的邏輯與測驗一同理,利用 sizeof 完成跨平台的指標對齊。
取顏色直接取最低兩位元即可,之所以是兩位元是因為平衡因子有
0
,1
,2
三種可能,佔 \(2\) bits。指派
parent_balance
成員為其指派親代節點指標可利用之前實作的
avl_balance
函式保留平衡因子的部分:指派平衡因子時同理可複用之前實作過的
avl_parent
函式來保留親代指標的部分:AVL 樹插入節點的平衡操作
旋轉比較難畫,就直接引用維基百科的圖了。
觀察
MMMM
,NNNN
所在之迴圈中較前面,針對 RR/RL 所執行的左旋轉/右旋後左旋,推斷MMMM
和NNNN
為處理 LL/LR 的情況,故為對應的右旋轉/左旋後右旋,實作如下:測驗三
TODO
測驗四
測驗四題目
以下程式碼應實現 \(\lceil \log_2(x) \rceil\)。
測驗四分析
觀察程式碼,由其行為可見當
x
大於某二的冪長度之全一時,便以shift
蒐集某長度之全一的長度,記錄shift
於r
後將x
位移shift
。從 \(16\) 個 \(1\) 開始,推測最後會處理一個 1 的情況,故我們應該看到:上述程式碼對
x
的操作沒有必要,因為後續不再使用,故 (不考慮註解的) 第 3 行可去除,並可將 1, 2, 3 行簡化為:至於
r
紀錄了什麼?當x
為無號最大值 \(x_{max}\) (全一) 時,shift
一路下來捕獲了 \(16, 8, 4, 2, 1\),並將其以 or 運算紀錄於r
,結果為 \(31\),與 \(\lceil \log_2(x_{max}) \rceil = 32\) 差一,由此認為return (KKKK) + 1;
的+ 1
因此出現。這樣一來
KKKK
為何就比較明朗了。考慮前方簡化版邏輯,由於直接回傳,不需要將結果存入r
,故改為 expression 版如下:再來我們簡化
x > 0x1
的部分。由於我們已經使用 \(2^1, 2^1, 2^3, 2^4\) 這幾把拿來左移的尺,對於 \(32\) 位元的數字而言只可能還沒碰到原本最高的兩位,此時x
只剩 \(0 \sim 3\) 這四種可能,故可替換其邏輯為x >> 1
,捕獲未觸碰的原最高位。所以答案為
KKKK = r | shift | x >> 1