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
2024q1 Homework2 (quiz1+2)
contributed by <
w96086123
>第一週測驗
測驗一
了解資料結構
left
代表比 value 小的集合。right
代表比 value 大的集合。next
表示此 node 的下一個 node 。value
表示此 node 的數值。了解操作函數
list_add
將一個 node_t 加入至 list 的 head 。
list_tail
尋找此 node_t 中 left 的最後一個 node_t ,並且回傳該指標。
其中的
AAAA
為 (*left)->next。list_length
尋找此 node_t 中 left 的長度。
其中的
BBBB
為 (*left)->next。list_construct
建立一個 value 為 n 的 node_t ,並且將 node_t 加入至 list 的頭,且回傳該指標。
list_free
將 list 中的已配置記憶體的全部釋放。
list_is_ordered
檢查此 list 是否已完成排序。
shuffle
將 array 中的資料已亂數交換的方式打亂。
quick_sort
此方法利用堆疊取代原本的遞迴呼叫。
此區主要作為切割並且儲存的區域,因此我將此區分成三個區域了解。
藉由上面解析,可以知道每次的切割會新增兩個區塊,因此最大堆疊的空間需要 2 * n 。
此區將 list 中進行分類。
逐一利用
list_add
進行分類,分類條件為n->value > value
,若為真,則表示較大,將 n 分類為 right,否則,將 n 分類為 left 。因此
CCCC
為 p->next 。原本的狀態
進行分類過後的狀態
由於先進行 right 的切割,因此第一次將 L 儲存為 result 的一定為最大值,第二次則為第二大值,依序下來,直到堆疊的索引小於 0 ,結果必為完成排序。
main
建立一個長度為 100000 的 array ,順序則為 1 至 100000,並且利用
shuffle
進行打亂,後建立打亂後順序的 list ,並進行quick_sort
排序,排序後利用list_is_ordered
進行排序結果的判斷,最後利用list_free
將記憶體釋放,並且釋放該 array 。延伸問題 1
因為每次的切割都需要使用兩次
list_tail
,但每次使用都需要 O(N) ,如果改成使用雙向鏈結串列的方式實做,時間複雜度將降低為 O(1) 。修改資料結構
新增
prev
節點。修改操作函數
list_add
list_tail
藉由新的結構,可以直接訪問最後的節點,無須逐步訪問,因此時間複雜度可變為 O(1) 。
list_construct
由於修改為新的結構,因此在建立的過程中也需要做相對應的修改。
比較(10000 個節點)
由上表可知,這樣得修改方式是有提昇處理時間。
延伸問題 2
若想要避免最壞狀況,可以使用 Median of Three 的方式取得 pivot ,這樣可以避免一直取得最大或是最小值。
測驗二
Timsort 步驟
先尋找 run
由左到右尋找非嚴格遞增或遞減的序列,每個 run 的長度盡量符合 minrun 跟 2 的冪。
內部 run 進行插入排序法
利用合併排序的方式進行合併
程式碼解讀
find_run
第二週測驗
測驗一
原版
利用深度優先搜尋的方式建立樹。
AAAA
此函數主要作用為將 n 插入至 h 的頭。
因此
AAAA
為 h->first 。BBBB 和 CCCC
此函數為尋找特定值。
BBBB
這裡要遍歷 hlist_node ,因此BBBB
為 &heads 。每次的遍歷都需要將當前指針轉換為 order_node,因此
CCCC
為 list_entry 。DDDD
此函數主要將創立一個新的 order_node ,並且將此 node 放入置 hlist_head。
因此
DDDD
為 heads 。dfs
利用深度優先搜尋法的方式建立 Tree。
先利用
find
尋找出preoder[pre_low]
在 inorder 中的索引值,此索引值稱為idx
。切割方式:
循環利用上面的方式,就可以將有 preorder 與 inorder 的序列,轉換為 Tree 了。
測驗二
了解資料架構
LRUCache
capacity
用於儲存 LRU 緩存的容量。count
用於紀錄當前 LRU 緩存中儲存的數量。dhead
用於紀錄 LRU 中節點的訪問順序,用於尋找替換順序。hhead
用於紀錄 LRU 中節點的哈希表連結。LRUNode
key
節點的鍵值。value
節點的值。node
與其他節點的指標。link
用於與 LRU 的連結。測驗三