Stack
一句話記憶:堆盤子,後進後出 Last In First Out
EX: V8 engine 中的 call stack
Queue
一句話記憶:排隊,先進先出
EX: V8 engine 中的 callback quee
Reference:
一句話記憶:堆盤子,後進後出 Last In First Out
EX: V8 engine 中的 call stack
一句話記憶:排隊,先進先出
EX: V8 engine 中的 callback quee
Reference:
Linear Search
時間複雜度:O(n)
744. Find Smallest Letter Greater Than Target
撞到語法不夠熟悉的問題,原本嘗試在 forEach 中 return 和 break,發現不適用
這種情況適合改用 for loop or every 等等其他方法,可參考以下文章
https://masteringjs.io/tutorials/fundamentals/foreach-break
Binary Search
時間複雜度: O log(n)
適用情境:在一個已排序的陣列中,找出其中特定的值
實作關鍵:遞迴or無窮迴圈,雙指標、中值
=> 設立雙指標、中值,並在查找的過程中不斷移動邊界
延伸閱讀:
取中值的公式
直觀來說會寫
int mid = (low + high)/2;
但這篇文章提到建議改寫
int mid = low + (high – low)/2;
原因是超過最大正整數時,會溢位,這時候取的中值就會是錯的
But if we calculate the middle index like this means our code is not 100% correct, it contains bugs.
That is, it fails for larger values of int variables low and high. Specifically, it fails if the sum of low and high is greater than the maximum positive int value(231 – 1 ).
The sum overflows to a negative value and the value stays negative when divided by 2.
在 Javascript 中遇到排序問題,通常可直接使用原生 function — sort()
因此很少自己實作排序的功能,此次透過刷題,嘗試用各種排序演算法,期待能更深入地對個演算法有記憶,並瞭解使用情境;相關的時間、空間複雜度,將會另撰寫文章
搭配相關的視覺化工具:VisualGo, VISUALIZE CODE EXECUTION
我個人是圖像化學習較能吸收,尤其在針對演算法這種較抽象的概念,能夠直觀地看逐步的過程,可以有更深入的理解。
將會用到的排序:
插入排序 Insert Sort
快速排列 Quick Sort (use space and in place )
堆排序 Bucket Sort
其中在理解插入排序時,對於要用兩個迴圈這件事,我卡了好一陣子,直到查到這部影片,很生動地呈現,才頓悟,推薦給大家。
原來雙迴圈是使用了「雙指標」的概念:一個指標往前遍尋,一個指標往後遍尋。
同樣的我們可以先來看一支舞 XD
延伸閱讀:
2. 各個瀏覽器對於 sort 的實作方式不同探討
Chrome engine v8 對於 Javascript 的 sort 實作:
基礎是用 Quick Sort 實作, 若陣列長度小於 10 則改用 Insert Sort 實作The sorting algorithm itself is rather straightforward: The basis is a Quicksort with an Insertion Sort fall-back for shorter arrays (length < 10). The Insertion Sort fall-back was also used when Quicksort recursion reached a sub-array length of 10. Insertion Sort is more efficient for smaller arrays.
Reference from ChromeDoc
Reference: 淺談 JS sort() 到背後排序方法
Reference: 從 Array 的 sort 方法,聊到各瀏覽器的實作,沒想到 Chrome 和FireFox 的排序如此不同
謝謝你的閱讀,
以上是我的讀書筆記整理,歡迎各方大大討論交流校正~
喜歡的話, Medium 同步更新,歡迎前往拍手:)
我們下次見~