contributed by < idoleat
>
examples/
目錄提供 quick sort 實作,請探討 Linux 的 linked list 和上述程式碼的落差,並改寫 linux-list 的 quick sort 範例,避免使用遞迴呼叫
list_add_node_t(node_t **list, node_t *node_t)
把傳入的 node 的 next 指向傳入的 list 的內容,再把 list 更新為該 node,亦即把 node 加入至 list 的最前端。
list_concat(node_t **left, node_t *right)
left 會指向一個 node,在 while 迴圈中他會一直往下指直到變成 NULL
quicksort
如果把表示 list 的 node_t **list
都改成 node_t *list
會有什麼問題?
你所不知道的 C 語言:指標篇 內有比較範例,及 list 實做上使用與不使用 pointer to pointer 的比較
在先前一個 nodejs 的專案中,我發現 nodejs 沒有內建的 Pseudorandom number generator,所以需要 自己實做 一個。在 wikipedia 上我找了一個最容易理解及實做的 ACORN[1][2] 演算法來實做,就該專案的使用情形來說還行,但是其實都還沒實際測試過他是不是真的夠亂,這是一個很好的機會用 C 語言再實做一遍,並執行例如 Monte Carlo 等測試,並以圖表呈現。
[1] http://acorn.wikramaratna.org/concept.html
[2] https://www.sciencedirect.com/science/article/pii/S0377042709006931
如果結果不如預期則思考哪裡實做不對,因為根據 別人做的實驗 他長期累積的亂數是足以 uniformly distributed 的
Repository: https://github.com/idoleat/Linux2021_Quizzes/tree/master/Quiz1
亂數計算的方法如下
給定一個 order 和 modulus (通常是 2 的次冪),讓種子碼 為一個正整數,滿足 ,以及初始值 ,每個皆滿足
則一個 order 的 Additive Congruential Random Number (ACORN) 被定義為
的範圍為 的亂數生成結果,而 為 的結果。
除了設定種子碼,還必須先設定 order 、初始值 還有 。通常累加的次數 會大於 10, 為 2 的次冪,因為種子必須與其互質,而選擇為 2 的次冪那種子的限制就只有必須是奇數。依據作者建議 ,可獲得較佳結果,2 以上最好。
這樣 size 永遠都是 1,得不到 arr 的大小喔,所以可以理解各式函式庫會有「有 n」和「沒 n」的兩種函式,例如 strcpy()
和 strncpy()
,前者不會也沒辦法判定字串陣列大小,後者則需要者用者明確指定大小來解決前者的缺陷。(以上說法待商榷)
random()
not yet