原先我為了成為一個軟體工程師而建立這份簡單的讀書主題清單(To-do list), 但這份To-do list隨著時間而膨脹成這個樣子。 做完這份To-do list上的每個目標後,我成為了Amazon的工程師! 你或許不需要像我讀一樣多。但是,每個讓你成為一位稱職工程師所需要的知識都在這裡了。
我每天讀8~12小時的書,這樣持續了好幾個月。這是我的故事:為什麼我為了Google面試而讀了8個月
在這份To-do list內的主題會讓你擁有足夠的知識去面對幾乎每家軟體公司的專業面試, 這些公司包含了科技巨獸,例如Amazon、Facebook、Google,或者是Microsoft。
祝你好運!
翻譯:
正在翻譯的項目:
這是我為了從一個網頁開發者(自學,並且沒有任何與資工、電腦科學有關的學位),成為一個大公司軟體工程師,持續好幾個月的讀書計畫。
這是為了那些新手軟體工程師,或者是那些想要轉換跑道,從軟體/網頁開發者轉為軟體工程師(需要資工、電腦科學的知識)的人。
請注意就算你有多年的軟體/網頁開發經驗,那些著名的大型軟體公司,像是Google、Amazon、Facebook,或是Microsoft事實上把軟體/網頁開發(Software/Web Development)與軟體工程(Software Engineering)視為不同,而後者需要的是電腦科學/資訊工程的知識。
如果你想成為一個可靠的工程師或者是Operation Engineer,閱讀並且學習更多這份清單中的The Optional List(裡面包含網路與資訊安全的知識)。
- What is it?
- Why use it?
- How to use it
- 不要覺得自己不夠聰明
- 關於影片資源
- 面試過程&面試準備
- 面試時專精一種程式語言
- 書單
- 在你開始之前
- 這份清單沒有包含的內容
- 先備知識
- 每日計畫
- 演算法複雜度 / Big-O / 漸進分析
- 資料結構
- 更多
- 樹狀結構(Tree)
- Trees-重點與背景知識
- 二元搜尋樹
- Heap / Priority Queue / Binary Heap
- 平衡搜尋樹(基本概念,非細節)
- 遍歷:前序、中序、後序、BFS、DFS
- 排序
- 選擇排序
- 插入排序
- 堆積排序
- 快速排序
- 合併排序
- 圖
- 有向圖
- 無向圖
- adjacency matrix
- adjacency list
- 遍歷: 廣度優先(BFS), 深度優先(DFS)
- 更多知識
- 系統設計、可擴充性、資料處理 (如果你有四年以上的經驗)
- 總複習
- 解題練習
- 解題練習/挑戰
- 面試前夕
- 你的履歷
- 想想面試時可能的狀況
- 一旦你得到工作
---------------- 以下皆為選讀 ----------------
- 選修書籍
- 額外學習
- 編譯器
- Emacs and vi(m)
- Unix命令列工具
- 資訊理論
- 同位位元 & 漢明碼
- Entropy
- 密碼學
- 壓縮
- 電腦安全
- 垃圾回收
- 平行計算
- 通訊、序列化以及佇列系統
- A*搜尋演算法
- 快速傅立葉轉換
- 布隆過濾器
- HyperLogLog
- Locality-Sensitive Hashing
- van Emde Boas Trees
- Augmented Data Structures
- 平衡樹
- AVL樹
- 伸縮樹Splay tree
- 紅黑樹
- 2-3搜尋樹
- 2-3-4樹(aka 2-4樹)
- N-ary (K-ary, M-ary)樹
- B樹
- k-D樹
- Skip lists
- Network Flows
- Disjoint Sets & Union Find
- 快速處理的數學
- Treap
- 線性程式設計
- 幾何、Convex hull
- 離散數學
- 機器學習
- 某些主題的額外知識
- 影片系列
- 電腦科學課程
- 論文
當我開始這項計畫的時候,我不知道Stack與Heap的差別,不知道時間複雜度(Big-O),不知道樹狀結構(Tree),也不知道如何遍歷一個圖(Graph)。過去如果我需要寫一個排序演算法(Sorting Algorithm),那個code一定是個災難。我過去都用程式語言中內建的資料結構(Data Structure),對於資料結構裡面的實作方法跟原理我完全沒有任何的概念。除非我的程式碰到了"out of memory"的錯誤我才會去找解決方法,否則我從不特別去花費心思管理程式中的記憶體配置。雖然我有用過多維陣列(Multidimensional Arrays)跟關聯陣列(Associative Arrays),但我從來沒有自己時做過資料結構。
這是個遠大的計畫,或許要花上你數個月的時間。如果你對其中大部分的東西已經很熟悉的話,那麼執行這項計畫所花費的時間將減少許多。
下面每項是大綱,你需要從上到下的去理解這些大綱。
我用了Github-flavored markdown語法,其中包含了可以確定完成進度的任務清單。
建立一個新的Branch以使用Github-flavored markdown的勾選功能。只要在[]中打x,像是: [x]
Fork一個branch,並且跟隨以下的指令
git clone git@github.com:<your_github_username>/coding-interview-university.git
git checkout -b progress
git remote add jwasham https://github.com/jwasham/coding-interview-university
git fetch --all
在你完成了一些目標後,在框框中打x
git add .
git commit -m "Marked x"
git rebase jwasham/main
git push --set-upstream origin progress
git push --force
- 大多數成功的軟體工程師都非常聰明,但他們都有一種覺得自己不夠聰明的不安全感。
- The myth of the Genius Programmer(天才Programmer的迷思)
- It's Dangerous to Go Alone: Battling the Invisible Monsters in Tech(不要單打獨鬥:面對科技中的隱形怪物)
有些影片要註冊Coursera或者Edx的課程後才能觀看,也就是所謂的MOOCs。有時候某些課程需要等待好幾個月才能註冊,這期間你無法觀看這些課程的影片。
我非常喜歡那些大學的線上課程。感謝你們幫忙加入一些免費、可隨時觀看的公開資源,像是那些線上課程的YouTube影片。
- ABC: Always Be Coding
- Whiteboarding
- Demystifying Tech Recruiting
- 如何錄取Big Tech(Google, Amazon, Facebook, Apple):
- Coding面試解密:
- Facebook Coding面試解密:
- 準備課程:
- Software Engineer Interview Unleashed (paid course):
- 從前Google面試官身上學習如何充實自己,讓自己能夠應付軟體工程師的面試。
- Python for Data Structures, Algorithms, and Interviews (paid course):
- Python面試準備課程,其中包含了資料結構、演算法、模擬面試等等。
- Intro to Data Structures and Algorithms using Python (Udacity free course):
- Python免費資料結構及演算法課程。
- Data Structures and Algorithms Nanodegree! (Udacity paid Nanodegree):
- 超過100種實際的資料結構及演算法練習。名師指導讓你準備好面試以及工作的實際情況。
- Software Engineer Interview Unleashed (paid course):
在面試的coding階段,你可以選擇任何一個你擅長的程式語言。但多數大公司僅有以下選擇:
- C++
- Java
- Python
你也可以選擇以下的程式語言,但可能會有某些限制:
- JavaScript
- Ruby
我之前寫過一篇關於在面試時選擇程式語言的文章:Pick One Language for the Coding Interview
你需要非常熟練這個程式語言,並且對他非常了解。
閱讀更多有關程式語言的選擇:
- http://www.byte-by-byte.com/choose-the-right-language-for-your-coding-interview/
- http://blog.codingforinterviews.com/best-programming-language-jobs/
因為我正在學習C、C++以及Python,所以下面會出現一些有關於這些程式語言的資源。
為了節省你的時間,以下是已經縮減過的書單。
- Programming Interviews Exposed: Coding Your Way Through the Interview, 4th Edition
- 附有解答 in C++ and Java
- 內含很棒的coding面試解密
- 不會很困難,大多問題都比面試中的還簡單(從我讀過的)
- Cracking the Coding Interview, 6th Edition
- 附有解答 in Java
選擇以下其中一個:
- Elements of Programming Interviews (C++ version)
- Elements of Programming Interviews in Python
- 程式面試精華 (Java版)
面試時你需要選擇一種程式語言(詳如上述)
以下是一些我對程式語言的建議。這邊沒有所有種類程式語言的資源,所以歡迎補充。
如果你讀過以下其中一本,你應該已經具備了所有解決coding問題所需要的資料結構與演算法的知識。除非你想要複習,否則你可以跳過這個計畫中所有的教學影片。
我沒讀過這兩本書,但他們頗受好評。作者是Sedgewick,他超讚的!
- Algorithms in C++, Parts 1-4: Fundamentals, Data Structure, Sorting, Searching
- Algorithms in C++ Part 5: Graph Algorithms
如果你有更好的C++書籍,請告訴我。我正在蒐集全面性的資源。
- Algorithms (Sedgewick and Wayne)
- 在Coursera平台上有影片、書籍內容、(以及Sedgewick!)
或者:
- Data Structures and Algorithms in Java
- 作者:Goodrich、Tamassia、Goldwasser
- 被作為UC Berkeley資工系入門課程的補充教材
- 看看下面我對這本書的Python版的書評。兩本書都包含了相同的主題。
- Data Structures and Algorithms in Python
- 作者:Goodrich、Tamassia、Goldwasser
- 我超愛這本書。他包含了所有東西。
- 很Python的Code!
- 我的書評: https://startupnextdoor.com/book-report-data-structures-and-algorithms-in-python/
這份清單隨著時間越來越大。當然,這也同時代表我越來越難以掌握他的整體內容。
以下是一些清單內的錯誤,希望能讓你避免這些錯誤,並且有更好的學習體驗。
我看了數小時的影片,同時也寫下了大量的筆記。但過了幾個月後,大部分的東西都消失的無影無蹤。我花了三天重新看過我的筆記,並做了小字卡幫助我複習他們。
請閱讀以下的文章以免重蹈覆轍:
Retaining Computer Science Knowledge.
有人推薦給我的課程(但我還沒看過:( ): Learning how to Learn
為了解決剛剛提到的遺忘問題,我自己寫了一個小字卡網站。網站上可以新增兩種小字卡,一般的以及程式碼。 每一種類的小字卡都有不同的格式。
這個小字卡網站在製作時便是以行動裝置優先的方式設計的,好處是無論我在何處,我都可以在我的手機與平板上複習。
製作屬於自己的免費小字卡:
- Flashcards site repo
- My flash cards database (old - 1200 cards):
- My flash cards database (new - 1800 cards):
我的小字卡資料庫中包含了組合語言、Python的小知識、機器學習以及統計。這些內容已經超出了原本他的預設。
關於小字卡:當你第一次知道答案後,別馬上把那張小字卡標記為已知。反覆複習這張小字卡,直到每次都能答對後才是真正學會了這個問題。反覆的動作會讓這個知識深深地烙印在你的腦海內。
這裡有個替代我小字卡的網站Anki,很多人向我推薦過他。這個網站用同一個字卡重複出現的方式讓你牢牢地記住他。 這個網站非常容易使用,支援多平台,並且有雲端同步功能。在iOS平台上收費25美金,其他平台免費。
這是我用Anki這個網站裡的格式所儲存的小字卡資料庫: https://ankiweb.net/shared/info/25173560 (感謝 @xiewenya)
把你學過的東西應用在解題上面,否則你很快就會忘了他們。這是一個過來人的經驗談。一旦你自認學會了一個主題,像是Linked List之類的,打開任何一本Coding面試問題書籍,做一些裡面有關Linked List的問題。接著繼續讀後面的主題。然後,再回頭反覆做有關Linked List、遞迴或者其他任何東西(原文為Recursion,非Recursive)的題目。但切記一定在讀這些資料結構、演算法的同時,也要實際去寫一些有關這些東西的題目。公司錄取你是為了能有即戰力能夠上戰場,而非一個紙上談兵的人。這邊我覺得還不錯的書籍和網站。更多: Coding Question Practice
我自己寫了一些有關於ASCII Code、網路OSI模型、Big-O(時間複雜度)等等的小抄。我有空的時候就會把他們拿出來看一看複習一下。
打Code累了的話就休息半個小時,並且複習你的小字卡。
能夠干擾你,浪費你寶貴時間的東西很多。因此,專注集中精神實在很難。放點純音樂能幫上一些忙。
以下為普遍但沒有包含在這份清單內的技術:
- SQL
- Javascript
- HTML、CSS,以及其他前後端的技術
每個主題所花費的時間都不盡相同,有些只要一天,有些需要花上數天。有些主題只有單純的知識而無包含實作。
每天我選擇下面其中一個主題,看跟該主題相關的影片,再用下面的程式語言實作:
- C - 用使用了struct *或者其他東西當作參數的struct以及函數
- C++ - 不要使用內建的東西
- C++ - 用C++內建的東西,像是STL的Linked List,std::list。
- Python - 使用內建的東西(為了練習Python)
- 寫一些測試來驗證自己寫的東西是正確的,像是用assert()等簡單的方法。
- 你也可以用Java來練習,上面只是我自己的方法。
你不需要學會所有的程式語言,你只需要專精在某個程式語言 one language for the interview.
為什麼要這樣寫Code?
- 練習,練習,再練習,直到我對他產生厭惡感,並且能輕鬆無誤地寫出那些Code。(有些東西需要特別記住,像是在邊界的時候會出現問題(edge cases),或者一些小細節)
- 全部自己來(像是手動分配/釋放記憶體,不要依賴語言中的garbage collection的功能(除了Python或者Java))
- 利用語言中內建的東西及工具,之後在實際工作的時候才能得心應手(畢竟我不想在工作時手刻一個Linked List)。
我沒有時間做每個主題中的每個東西,但我會盡力而為。
下面是我自己寫的程式碼:
你不需要記住每個演算法裡面的內容。
試試看把程式碼寫在白板或者紙上而不是電腦上。接著用一些測資來測試他。最後才用電腦來驗證。
- 學習C
- C語言無所不在。在你學習的過程中,幾乎任何一本書、課程,或者影片中你都能看到他的身影。
- C Programming Language, Vol 2
- 這本書還滿輕薄的,但他能讓你有初步對於C語言的認識。看著這本書並且練習,你能更快地掌握C語言。理解C語言能讓你更了解程式的運作以及內部記憶體配置。
- answers to questions
- 一個程式在電腦中是如何運作的:
- 沒有任何東西能實作
- 這個主題有許多影片,看到你真正了解他為止。你可以隨時回來複習他。
- 如果這些課程太過數學的話,你可以去看看最下面離散數學的影片,他能讓你更了解這些數學背後的來源以及原理。
- Harvard CS50 - Asymptotic Notation (video)
- Big O Notations (general quick tutorial) (video)
- Big O Notation (and Omega and Theta) - best mathematical explanation (video)
- Skiena:
- A Gentle Introduction to Algorithm Complexity Analysis
- Orders of Growth (video)
- Asymptotics (video)
- UC Berkeley Big O (video)
- UC Berkeley Big Omega (video)
- Amortized Analysis (video)
- Illustrating "Big O" (video)
- TopCoder (includes recurrence relations and master theorem):
- Cheat sheet
- [Review] Big-O notation in 5 minutes (video)
-
- 實作一個可以自動調整大小的陣列(動態陣列vector)
- (動態)陣列背後原理:
- 實作動態陣列(可變、可動態調整大小的陣列)
- 練習在程式中用陣列以及指標,透過計算指標而存取該內容,而不是直接用索引。
- 直接動態生成一個新的陣列
- 可以生成一個int型別的陣列,但不要使用語言提供的功能
- 從16,或者更大的數開始寫,像是2的次方 - 16、32、64、128。
- size() - 陣列中元素個數
- capacity() - 陣列能存的最大元素個數
- is_empty()
- at(index) - 傳回該索引值的元素,附有邊界檢查(boundary check)
- push(item)
- insert(index, item) - 把元素插入該索引值,把原本在該索引值的元素往右邊移動。
- prepend(item) - 可以把元素插入索引值為0的地方。
- pop() - 移除陣列中最後一個元素,並回傳該元素的值。
- delete(index) - 刪除在該索引值的元素,並且把右邊剩下元素全部往左移。
- remove(item) - 從陣列中尋找該數值,並且移除他(就算陣列中數個地方都有這個數值)。
- find(item) - 從陣列中尋找該數值,並且傳回最前面找到該數值的索引值,如果沒有則傳回-1。
- resize(nex_capacity) // private function
- 當陣列已經用盡了所有容量後,把陣列的容量*2。
- 如果移除掉一個元素後,陣列實際大小是最大容量的1/4,則把陣列容量減半。
- 時間複雜度
- O(1) 在陣列末端插入/刪除元素
- O(n) 在任何地方插入/刪除元素
- 空間複雜度
- 在記憶體中的存放位置是連續的,這種儲存方式有助於存取的性能。
- 所需空間 = (陣列容量,>=n) * 元素所需大小,但就算結果為2n,實際上仍算成O(n)
-
- Linked Lists背後原理:
- C Code (video) - 沒有完整的code,裡面只包含了用struct實作節點的方式以及其記憶體配置。
- Linked List vs 陣列:
- why you should avoid linked lists (video)
- 小心!: 你需要一些關於指標的指標(Pointer to pointer)的知識: (當你回傳一個指標到函式,這個動作可能會改變指標所指向的地址) 這個頁面僅提供基本對於指標的指標的認識。我不推薦這個遍歷linked list的方式,因為他用的方式太過神奇,所以可讀性以及維護性並不好。
- 實作Linked list (我做了有末端指標(tail pointer)的版本以及無末端指標的版本):
- size() - 回傳linked list裡面的元素個數
- empty() - 回傳型態:bool,如果linked list為空,回傳true
- value_at(index) - 回傳索引值為index的元素的數值,第一個元素索引值為0,以此類推
- push_front(value) - 從linked list的起始點加入新的元素
- pop_front() - 移除第一個元素,並且回傳該元素的數值
- push_back(value) - 在linked list末端加入新元素
- pop_back() - 移除最後一個元素,並且回傳該元素的數值
- front() - 回傳第一個元素的數值
- back() - 回傳最後一個元素的數值
- insert(index, value) - 把新元素插入到該索引值,而新元素指向原本在該索引值的元素。
- erase(index) - 刪除該索引值的元素(節點)
- value_n_from_end(n) - 回傳從末端開始計算的第n個元素的數值
- reverse() - 反轉該linked list
- remove_value(value) - 刪除第一個為該數值的元素(意即7 2 2 1,要刪除2的話,只刪除index:1的那個2)
- 雙向linked List
- 背後原理(影片)
- 不需實作
-
- Stacks(影片)
- 使用Stacks先進後出(Last-In First-Out)(影片)
- [Review] Stacks in 3 minutes (video)
- 無須實作,可以用陣列實作,但這樣太過簡單了。
-
- 使用Queues(先進先出)First-In First-Out(影片)
- Queue(影片)
- Circular buffer/FIFO
- Priority Queues(影片)
- [Review] Queues in 3 minutes (video)
- 使用linked list實作,包含末端指標(tail pointer):
- enqueue(value) - 在queue末端加入元素
- dequeue() - 刪除當時queue中最早進入的元素(意即queue中第一個元素),並且回傳該元素的值。
- empty()
- full()
-
- enqueue: O(1) (平均情況,無論對於用linked list或陣列實作的方法)
- dequeue: O(1) (linked list與陣列)
- empty: O(1) (linked list與陣列)
-
-
影片:
-
線上開放式課程:
-
實作雜湊表(用陣列以及線性探測(linear probing))
- hash(k, m) - m:雜湊表的大小
- add(key, value) - 如果key已經存在,則更新該key的value
- exists(key)
- get(key)
- remove(key)
-
-
- 二分搜尋法(影片)
- 二分搜尋法(影片)
- 細節
- [Review] Binary search in 4 minutes (video)
- 實作:
- 二分搜尋法 (對已經排列好的數列)
- 用遞迴(recursion)的方法實作二分搜尋法
-
- Bits cheat sheet - 你應該能背出一些2的指數(從2^1到2^16以及2^32)
- 實際了解如何用下列的位元運算子來操作每個位元: &, |, ^, ~, >>, <<
- 一補數與二補數
- count set bits
- swap values:
- 絕對值:
-
- Series: Trees (影片)
- 如何建立一棵樹
- 遍歷
- 操作樹的演算法
- BFS(breadth-first search) and DFS(depth-first search) (影片)
- BFS(廣度優先搜尋)重點:
- 每一層的順序(BFS,用queue)
- 時間複雜度: O(n)
- 空間複雜度: 最佳: O(1), 最糟: O(n/2)=O(n)
- DFS(深度優先搜尋)重點:
- 時間複雜度: O(n)
- 空間複雜度: 最佳: O(log n) - 平均. 樹的高度 最糟: O(n)
- 中序 (DFS: 左子樹、根、右子樹)
- 後序 (DFS: 左子樹、右子樹、根)
- 前序 (DFS: 根、左子樹、右子樹)
- BFS(廣度優先搜尋)重點:
- [Review] Breadth-first search in 4 minutes (video)
- [Review] Depth-first search in 4 minutes (video)
- [Review] Tree Traversal (playlist) in 11 minutes (video)
-
- Binary Search Tree Review (影片)
- Series (影片)
- starts with symbol table and goes through BST applications
- Introduction (影片)
- MIT (影片)
- C/C++:
- 實作:
- insert // 把數值插入到二元搜尋樹當中
- get_node_count // get count of values stored
- print_values // 把二元搜尋樹中的數值從小到大輸出
- delete_tree
- is_in_tree // 如果給定的數值位於二元搜尋樹當中則回傳true
- get_height // 回傳該節點內的高度(單一節點的樹高度為1)
- get_min // 回傳二元搜尋樹當中的最小值
- get_max // 回傳二元搜尋樹當中的最大值
- is_binary_search_tree
- delete_value
- get_successor // 回傳二元搜尋樹當中大小在給定數值後一位的數值,如果沒有則回傳-1
-
- 一般將此資料結構以樹的方式視覺化,但實際上是以線性的方式儲存(陣列、linked list)
- Heap
- Introduction (影片)
- Naive Implementations (影片)
- Binary Trees (影片)
- Tree Height Remark (影片)
- Basic Operations (影片)
- Complete Binary Trees (影片)
- Pseudocode (影片)
- Heap Sort - jumps to start (影片)
- Heap Sort (影片)
- Building a heap (影片)
- MIT: Heaps and Heap Sort (影片)
- CS 61B Lecture 24: Priority Queues (影片)
- Linear Time BuildHeap (max-heap)
- [Review] Heap (playlist) in 13 minutes (video)
- 實作max heap:
- insert
- sift_up - needed for insert
- get_max - returns the max item, without removing it
- get_size() - return number of elements stored
- is_empty() - returns true if heap contains no elements
- extract_max - returns the max item, removing it
- sift_down - needed for extract_max
- remove(i) - removes item at index x
- heapify - create a heap from an array of elements, needed for heap_sort
- heap_sort() - take an unsorted array and turn it into a sorted array in-place using a max heap
- 重點: using a min heap instead would save operations, but double the space needed (cannot do in-place).
-
重點:
- 實作排序,並且了解該排序法在最佳/最糟/平均情況下的複雜度為何:
- 不要用泡沫排序法(bubble sort),那個太糟了 - O(n^2),除非n<=16
- 排序演算法的穩定性("快速排序法穩定嗎?")
- 哪個演算法可以用在linked list上?那些可以用在陣列上?或者兩個都可以?
- 我不推薦對一個linked list進行排序,但合併排序是可行的.
- 對linked list進行合併排序
- 實作排序,並且了解該排序法在最佳/最糟/平均情況下的複雜度為何:
-
有關於堆積排序,可以看看上面有關於堆積的介紹。堆積排序很棒,但不太穩定。
-
UC Berkeley:
-
合併排序程式碼:
-
快速排序程式碼:
-
實作:
- 合併排序: 平均與最糟都是O(n log n)
- 快速排序: 平均O(n log n)
- 選擇排序與插入排序平均與最糟的時間複雜度都是O(n^2)。
- 有關堆積排序,請見上方關於堆積的介紹。
-
非必要,但我建議看一看:
這裡有15種排序演算法的影片,如果你想對排序演算法有更多的了解,看看Additional Detail on Some Subjects裡的「排序」這個部分
圖在電腦科學中可以用來表示、處理很多問題,所以這個部分就像樹以及排序一樣篇幅很長。
-
重點:
- 有4種基本表示圖的方式:
- 物件與指標(objects and pointers)
- adjacency matrix
- adjacency list
- adjacency map
- 請務必了解每種圖的表示法與每種表示法的優點及缺點。
- 廣度優先搜尋(BFS)與深度優先搜尋(DFS) - 知道他們的時間複雜度,他們的優缺點,以及如何實作他們。
- 如果出現一個問題,請優先想想看有沒有辦法用圖的方式解決,如果沒辦法再想想其他方法。
- 有4種基本表示圖的方式:
-
MIT(影片):
-
Skiena Lectures - 很棒的入門介紹:
- CSE373 2012 - Lecture 11 - Graph Data Structures (影片)
- CSE373 2012 - Lecture 12 - Breadth-First Search (影片)
- CSE373 2012 - Lecture 13 - Graph Algorithms (影片)
- CSE373 2012 - Lecture 14 - Graph Algorithms (con't) (影片)
- CSE373 2012 - Lecture 15 - Graph Algorithms (con't 2) (影片)
- CSE373 2012 - Lecture 16 - Graph Algorithms (con't 3) (影片)
-
圖(複習以及進階知識):
- 6.006 Single-Source Shortest Paths Problem (影片)
- 6.006 Dijkstra (影片)
- 6.006 Bellman-Ford (影片)
- 6.006 Speeding Up Dijkstra (影片)
- Aduni: Graph Algorithms I - Topological Sorting, Minimum Spanning Trees, Prim's Algorithm - Lecture 6 (影片)
- Aduni: Graph Algorithms II - DFS, BFS, Kruskal's Algorithm, Union Find Data Structure - Lecture 7 (影片)
- Aduni: Graph Algorithms III: Shortest Path - Lecture 8 (影片)
- Aduni: Graph Alg. IV: Intro to geometric algorithms - Lecture 9 (影片)
-
CS 61B 2014 (starting at 58:09) (影片) - CS 61B 2014: Weighted graphs (影片)
- Greedy Algorithms: Minimum Spanning Tree (影片)
- Strongly Connected Components Kosaraju's Algorithm Graph Algorithm (影片)
- [Review] Shortest Path Algorithms (playlist) in 16 minutes (video)
- [Review] Minimum Spanning Trees (playlist) in 4 minutes (video)
-
完整Coursera課程:
-
我將實作:
- 深度優先搜尋搭配adjacency list(遞迴recursive)
- 深度優先搜尋搭配adjacency list(疊代+stack)
- 深度優先搜尋搭配adjacency matrix (遞迴recursive)
- 深度優先搜尋搭配adjacency matrix(疊代+stack)
- 廣度優先搜尋搭配adjacency list
- 廣度優先搜尋搭配adjacency matrix
- single-source shortest path (Dijkstra)
- minimum spanning tree
- DFS-based algorithms (看看上面Aduni的影片):
- check for cycle (needed for topological sort, since we'll check for cycle before starting)
- topological sort
- count connected components in a graph
- list strongly connected components
- check for bipartite graph
-
- Stanford課程-遞迴recursion與回溯法backtracking:
- 什麼時候適合用這些
- tail recursion沒有比較好?
-
- 在你的面試中或許沒有任何動態規劃的問題,但能夠知道一個題目可以使用動態規劃來解決是很重要的。
- 動態規劃很難,因為動態規劃的題目通常都要有遞迴關係。要想到他的解法有時需要天外飛來一筆的想法。
- 我建議你可以多看一些動態規劃的題目,這可以讓你對這類型的問題以及他的長相有更多的理解。
- 影片:
- Skiena的影片有點難跟上,他有時候用白板,寫的字又很小。
- Skiena: CSE373 2012 - Lecture 19 - Introduction to Dynamic Programming (影片)
- Skiena: CSE373 2012 - Lecture 20 - Edit Distance (影片)
- Skiena: CSE373 2012 - Lecture 21 - Dynamic Programming Examples (影片)
- Skiena: CSE373 2012 - Lecture 22 - Applications of Dynamic Programming (影片)
- Simonson: Dynamic Programming 0 (starts at 59:18) (影片)
- Simonson: Dynamic Programming I - Lecture 11 (影片)
- Simonson: Dynamic programming II - Lecture 12 (影片)
- List of individual DP problems (每一部都很短): Dynamic Programming (v影片ideo)
- Yale課程筆記:
- Coursera:
-
- Optional: UML 2.0 Series (影片)
- 重要!物件導向程式設計原則: SOLID Principles (影片)
-
- 學學這些設計模式:
- strategy
- singleton
- adapter
- prototype
- decorator
- visitor
- factory, abstract factory
- facade
- observer
- proxy
- delegate
- command
- state
- memento
- iterator
- composite
- flyweight
- Chapter 6 (Part 1) - Patterns (影片)
- Chapter 6 (Part 2) - Abstraction-Occurrence, General Hierarchy, Player-Role, Singleton, Observer, Delegation (影片)
- Chapter 6 (Part 3) - Adapter, Facade, Immutable, Read-Only Interface, Proxy (影片)
- Series of videos (27部影片)
- Head First Design Patterns
- 我知道"Design Patterns: Elements of Reusable Object-Oriented Software"才是這方面的經典書籍,但深入淺出系列對於物件導向的初學者可能是更好的選擇。
- Handy reference: 101 Design Patterns & Tips for Developers
- Design patterns for humans
- 學學這些設計模式:
-
- 了解一些著名的NP-Complete問題,像是旅行推銷員問題(traveling salesman problem)和背包問題(knapsack problem),並要能夠在面試官問類似這些經典範例的問題時辨認出他們。
- 了解NP-complete的方法。
- 計算複雜性理論(影片))
- Simonson:
- Skiena:
- 複雜性: P、NP、NP-completeness、Reductions(影片)
- 複雜性: 近似演算法(影片)
- 複雜性: Fixed-Parameter Algorithms(影片)
- Peter Norvig在影片中提到旅行推銷員問題的近似最佳解:
- 在演算法導論(Introduction to Algorithms)第1048~1140頁
-
Computer Science 162 - 作業系統 (25部影片): - 程序與執行緒在第1~11部影片中 - 作業系統以及系統程式設計(影片)
- 程序與執行緒有什麼差別?
- 涵蓋:
- 探討程序、執行緒與並行性
- 程序與執行緒的差別
- 程序(processes)
- 執行緒(threads)
- 鎖(locks)
- 互斥鎖(mutexes)
- 號誌(semaphores)
- 監視器(monitors)
- 他們如何運作?
- 死鎖(deadlock)
- 活鎖(livelock)
- CPU活動、中斷、上下文交換(context switching)
- 現代cpu並行性由多核處理器實現
- Paging, segmentation and virtual memory(影片)
- 中斷Interrupt(影片)
- 程序所需資源 (記憶體): code, 靜態儲存, stack, heap,檔案描述符(file descriptors)以及i/o)
- 執行序所需資源 (跟上述相同(除了stack), 其他的執行序都各自擁有pc、stack計數器、暫存器以及stack在相同的程序中)
- Forking只有複製寫入(唯讀),直到新的程序被寫入到記憶體中u,然後他再複製一個新的
- 上下文交換
- 上下文交換如何被作業系統以及硬體所啟動
- 探討程序、執行緒與並行性
- C++執行序 (包含10部影片的系列)
- Python並行性 (影片)):
-
- 涵蓋:
- 單元測試如何運作
- 什麼是模擬對象(mock object)
- 整合測試(integration testing)是什麼
- 什麼是依賴注入(dependency injection)
- 敏捷軟體測試-James Bach(影片))
- James Bach軟體測試的公開課程(影片))
- Steve Freeman - 測試導向軟體開發(影片))
- 依賴注入(Dependency injection):
- 如何寫測試
- 涵蓋:
-
- 作業系統中排程如何運作?
- 可以從作業系統的課程影片中學習
-
如果你想知道更多有關這個主題的知識,可以去看某些主題的額外知識中的"String Matching"
-
- 請注意字典樹有許多種類。有些有前綴,有些沒有,而有些在追蹤路徑時使用字串而非位元。
- 我有看過這些程式碼,但沒有實作
- Sedgewick-字典樹(3部影片)
- Note:資料結構以及coding技巧
- 簡短的課程影片:
- 字典樹:一個被忽視的資料結構
- TopCoder-使用字典樹
- Stanford線上課程(實際使用範例))(影片)
- MIT進階資料結構-字串(影片中間有點困難)(影片)
-
- 大/小端序
- 大端序 Vs 小端序(影片)
- 由裡入內的大端序與小端序(影片)
- 對於核心開發非常具有技術性。如果大多數的內容聽不懂也沒關係。
- 前半部就已經足夠了
-
- 以下為如果你有網路相關經驗,或是想成為一個可靠的工程師需要知道的知識
- 知道這些有益無害,多多益善!
- Khan Academy
- UDP and TCP: Comparison of Transport Protocols(影片)
- TCP/IP and the OSI Model Explained!(影片)
- Packet Transmission across the Internet. Networking & TCP/IP tutorial.(影片)
- HTTP(影片)
- SSL and HTTPS(影片)
- SSL/TLS(影片)
- HTTP 2.0(影片)
- Video Series (21 videos)(影片)
- Subnetting Demystified - Part 5 CIDR Notation(影片)
- Sockets:
如果你已經擁有了4年以上的程式經驗,那你可以來看看有關系統設計的問題
-
可擴充性與系統設計的範圍非常廣大,裡面還包含了許多主題,因為在設計一個具有擴充性的軟體/硬體時有許多事情需要考量。你可以花點時間看看這些。
-
考量:
- 可擴充性
- 將大量資料抽取出而成一個值
- 將一個資料轉換成另一個
- 處理大量的資料
- 系統設計
- 功能集
- 介面
- class階層
- 在某些限制下設計一個系統
- 簡單與強健的系統
- 權衡得失
- 效能評估與最佳化
- 可擴充性
-
從這裡開始: The System Design Primer
-
How Do I Prepare To Answer Design Questions In A Technical Inverview?
-
System Design Interview - 這個裡面包含許多資源。把裡面的文章與例子都看過一遍,裡面有些我把他特別放在下面。
-
共識演算法(Consensus Algorithms):
-
可擴充性:
- 不用把這些全讀過,挑幾個你有興趣的即可。
- Great overview(影片)
- 簡單系列:
- Scalable Web Architecture and Distributed Systems
- Fallacies of Distributed Computing Explained
- Pragmatic Programming Techniques
- Jeff Dean - Building Software Systems At Google and Lessons Learned (影片)
- Introduction to Architecting Systems for Scale
- Scaling mobile games to a global audience using App Engine and Cloud Datastore (影片)
- How Google Does Planet-Scale Engineering for Planet-Scale Infra (影片)
- The Importance of Algorithms
- Sharding
- Scale at Facebook (2012), "Building for a Billion Users" (影片)
- Engineering for the Long Game - Astrid Atkinson Keynote(影片)
- 7 Years Of YouTube Scalability Lessons In 30 Minutes
- How PayPal Scaled To Billions Of Transactions Daily Using Just 8VMs
- How to Remove Duplicates in Large Datasets
- A look inside Etsy's scale and engineering culture with Jon Cowie (video)
- What Led Amazon to its Own Microservices Architecture
- To Compress Or Not To Compress, That Was Uber's Question
- Asyncio Tarantool Queue, Get In The Queue
- When Should Approximate Query Processing Be Used?
- Google's Transition From Single Datacenter, To Failover, To A Native Multihomed Architecture
- Spanner
- Machine Learning Driven Programming: A New Programming For A New World
- The Image Optimization Technology That Serves Millions Of Requests Per Day
- A Patreon Architecture Short
- Tinder: How Does One Of The Largest Recommendation Engines Decide Who You'll See Next?
- Design Of A Modern Cache
- Live Video Streaming At Facebook Scale
- A Beginner's Guide To Scaling To 11 Million+ Users On Amazon's AWS
- How Does The Use Of Docker Effect Latency?
- A 360 Degree View Of The Entire Netflix Stack
- Latency Is Everywhere And It Costs You Sales - How To Crush It
- Serverless (very long, just need the gist)
- What Powers Instagram: Hundreds of Instances, Dozens of Technologies
- Cinchcast Architecture - Producing 1,500 Hours Of Audio Every Day
- Justin.Tv's Live Video Broadcasting Architecture
- Playfish's Social Gaming Architecture - 50 Million Monthly Users And Growing
- TripAdvisor Architecture - 40M Visitors, 200M Dynamic Page Views, 30TB Data
- PlentyOfFish Architecture
- Salesforce Architecture - How They Handle 1.3 Billion Transactions A Day
- ESPN's Architecture At Scale - Operating At 100,000 Duh Nuh Nuhs Per Second
- 看看下方的"通訊、序列化以及佇列系統",裡面有一些你可以參考的東西。
- Twitter:
- 更多請看看下面影片系列中的"Mining Massive Datasets"
-
練習系統設計的過程:以下是在紙上練習的一些方法,每個都有他們如何運用在現實中的說明文件:
- 複習: 系統設計入門
- HiredInTech系統設計
- 提示
- 流程:
- 了解問題與其範圍:
- 在面試官的幫助下定義使用情況
- 提供些額外功能的建議
- 移除面試官認為是超出範圍的東西
- 默認高可用度是必須的,並增加一些使用情況
- 設想限制:
- 想想看每個月會有多少請求
- 想想看每秒會有多少請求(他們可能自願或者讓你自己計算)
- 評估讀寫比率
- 評估時請保持80/20法則
- 每秒有多少資料被寫入?
- 5年內總共需要的儲存空間
- 每秒有多少資料被讀取?
- 抽象設計:
- 層(服務、資料、快取)
- 基礎:讀取平衡、通訊
- 初步概覽驅動整個服務的關鍵演算法
- 考慮會遇到的瓶頸以及解決方案
- 了解問題與其範圍:
- 練習:
這部分我放了一些簡短的影片,觀看這些影片可以快速的複習一些重要的觀念。
如果你想時常複習,那真是太棒了!
- 2-3分鐘快速複習影片系列(23個影片)
- 2-5分鐘快速複習影片系列-Michael Sambol (46個影片)
- Sedgewick Videos - Algorithms I
- Sedgewick Videos - Algorithms II
現在你已經知道上面所有有關電腦科學的主題了,該是時候做些解題的練習了。
解題練習不能死記題目的解法
為什麼你需要練習解題:
- 快速識別問題,以及如何應用正確的資料結構及演算法。
- 蒐集問題的需求
- 模擬面試時用你的方法闡述問題
- 試著不要在電腦上寫程式,而是 在白板上或紙上
- 想出該問題的時間與空間複雜度
- 測試你的解法
這裡有個很棒的入門教學,內容是如何在面試中有條不紊,並且有互動溝通地解決問題。這種能力可以從面試書籍中獲得,但我覺得這個也超讚的:Algorithm design canvas
家裡沒有白板嗎?這很合理。但我是個奇怪的人,家裡有個大白板。沒有白板的話,可以去美術社買個大的繪圖板。你可以坐在沙發上練習。這是我的「沙發白板」。我在照片中放了一枝筆當作比例尺。如果你用筆的話,你將會希望你可以擦拭他,因為他很快就會變髒了。通常我都用鉛筆與橡皮擦。
補充:
閱讀並解題(按照以下順序):
- Programming Interviews Exposed: Secrets to Landing Your Next Job, 2nd Edition
- 附有C、C++、Java的解答
- Cracking the Coding Interview, 6th Edition
- 附有Java的解答
看看上方的書單
學了一些東西之後,可以開始試試每天解一些題目,越多越好!
Coding面試題目影片:
- IDeserve (88部影片)
- Tushar Roy (5個播放清單)
- 對於解法的練習非常有幫助
- Nick White - LeetCode Solutions (187部影片)
- 這些是我最近很喜歡的影片,你可以在短時間內看完他們
- 對於解法以及程式碼有很棒的解釋
解題網站:
- LeetCode
- TopCoder
- Project Euler (math-focused)
- Codewars
- HackerEarth
- HackerRank
- Codility
- InterviewCake
- Geeks for Geeks
- InterviewBit
- Sphere Online Judge (spoj)
- Codechef
解題repository:
更多面試:
- Gainlo.co: Mock interviewers from big companies - I used this and it helped me relax for the phone screen and on-site interview.
- Pramp: Mock interviews from/with peers - 點對點面試練習
- Refdash: Mock interviews and expedited interviews - 同樣能藉由跳過跟多家科技公司的面試,幫助你快速步上軌道,
- Coding面試解密-第二集(影片):
- 看看Coding面試解密中的履歷準備。
一些我預想的問題(我或許已經知道答案,但想知道他們的意見或是團隊的觀點):
- 你的團隊規模多大?
- 你的開發週期大概是怎樣?敏捷agile、瀑布式waterfall、sprint?
- 截止日前趕工是常態嗎?或是這之中有彈性?
- 在你的團隊中是怎麼做決定的?
- 每週你們開幾次會?
- 你覺得你的工作環境能幫助你專注嗎?
- 你目前在做哪個專案?
- 你喜歡這個專案的哪個部份?
- 工作生活如何?
- 工作與生活如何取得平衡?
恭喜!!!
繼續學習
活到老,學到老。
*****************************************************************************************************
*****************************************************************************************************
下面的東西都是額外的。
讀這些東西,可以更了解電腦科學的概念,
並且能讓自己對任何軟體工程的工作做更好的準備。
如此一來,你將會成為一個更全面的軟體工程師。
*****************************************************************************************************
*****************************************************************************************************
你可以從以下的書單挑選你有興趣的主題來研讀
-
The Unix Programming Environment
- 老,但卻很棒
-
The Linux Command Line: A Complete Introduction
- 現代選擇
-
- 設計模式的入門簡介
-
Design Patterns: Elements of Reusable Object-Oriented Software
- 也被稱為"四人幫"("Gang of Four(GOF)")
- 經典設計模式書籍
-
Algorithm Design Manual (Skiena)
- 作為複習以及問題辨別
- 這本書中演算法的部分難度已經超過面試會出現的
- 本書分為兩個部分:
- 資料結構及演算法課本
- 優點:
- 跟其他演算法課本一樣是個很棒的複習素材
- 內含關於作者以往解決工業及學術上問題的經驗的故事
- 含C語言程式碼範例
- 缺點:
- 某些地方跟"Introduction to Algorithms"一樣艱深,但在某些主題,"Introduction to Algorithms"或許是更好的選擇。
- 第7、8、9章有點難以消化,因為某些地方並沒有解釋得很清楚,或者根本上我就是個學渣
- 別會錯意了,我很喜歡Skiena的教學方法以及他的風格。
- 優點:
- 演算法目錄:
- 這個部分是買這本書的最大誘因
- 我即將著手進行這部分,一旦完成這部分我會再更新上來
- 可以在kindle上租
- 資料結構及演算法課本
- 解答:
- 勘誤表
-
Write Great Code: Volume 1: Understanding the Machine
- 這本書出版於2004年,某些程度上他有點過時了,但對於初步理解電腦是個很棒的資源
- 作者發明了高階組合語言HLA,所以提到,並且舉了一些HLA的例子。裡面沒有用到很多,但都是很棒的組合語言的例子。
- 這些章節很值得一讀,讓你具備極佳的基礎:
- 第2章 - 數值表示法
- 第3章 - 二進位運算和位元運算
- 第4章 - 浮點數表示法
- 第5章 - 字元表示法
- 第6章 - 記憶體組織和存取
- 第7章 - 複合資料型別和記憶體
- 第9章 - CPU架構
- 第10章 - 指令集架構
- 第11章 - 記憶體架構與組織
-
- 重要: 讀這本書CP值不高。這本書作為複習演算法和資料結構還算滿不錯的,但它裡面沒有教你怎麼實作這些東西。你必須要能夠自己寫出很棒、有效率的解法。
- 也被稱為CLR,或是CLRS,因為Stein是後來才加入作者群的。
-
Computer Architecture, Sixth Edition: A Quantitative Approach
- 更豐富、更新(2017年),但篇幅較長。
-
- 前幾章提供了一些解決coding問題的精妙絕倫的方法(有些很舊,甚至還用磁帶),但那些只是導論。這是本程式設計和架構的指南。
我把他們加了進來為了讓你成為更全方位的軟體工程師,並且留意一些科技以及演算法,讓你的資料庫中有更多素材。
-
- 讓你自己熟悉unix的文字編輯器
- vi(m):
- emacs:
-
- Khan Academy
- 更多有關馬可夫鏈:
- 進一步的可以去看看下方的MIT 6.050J Information和Entropy系列
-
- 同樣看看下方的影片
- 務必先看過資訊理論的影片
- Information Theory, Claude Shannon, Entropy, Redundancy, Data Compression & Bits (影片)
-
- 同樣看看下方的影片
- 務必先看過資訊理論的影片
- Khan Academy Series
- Cryptography: Hash Functions
- Cryptography: Encryption
-
- 給定布隆過濾器m個位元以及k個雜湊函式,插入以及membership testing都是O(k)
- 布隆過濾器 (影片))
- 布隆過濾器 | Mining of Massive Datasets | Stanford University (影片)
- 教學
- 如何寫一個布隆過濾器的APP
-
- 用來判定文件的相似度
- 跟MD5/SHA正好相反,他們是用來判定兩個文件/字串是否完全相同
- Simhashing (hopefully) made simple
-
-
至少要了解一種平衡樹(並且理解怎麼實作他):
-
"在平衡樹中,AVL和2/3樹已經有點過時了,而紅黑樹則比較流行。伸展樹(Splay tree)是一個特別有趣,能夠自我伸展的資料結構,他利用了旋轉rotation來移動任何accessed key到樹的根部。" - Skiena
-
在這麼多平衡樹之中,我選擇實作伸縮樹。從我曾聽過的看來,在面試時你並不需要會實作平衡搜尋樹。我看過了很多紅黑樹的程式碼。
- 伸縮樹:插入、搜尋、刪除函式 如果你最後選擇實作紅黑樹,試試看以下這些:
- 搜尋和插入函式,跳過刪除
-
我想學習更多有關B-Tree的東西,因為在大量資料的時候他運用得十分廣泛
-
AVL樹
- 實際上: 從我所知,這些樹在實際上並沒有用到太多,但這些是他們可能會出現的地方: AVL樹是另一個能夠在O(log n)的時間內搜尋、插入和刪除的資料結構。AVL樹比起紅黑樹更加嚴格的兩邊平衡,而這也導致了比較慢的插入和刪除,但比較快速的拿取。這對於那些只要建立一次,之後就只要取用的資料結構非常有吸引力,像是字典(或是程式字典,像是直譯器或組譯器的opcodes)
- MIT AVL Trees / AVL Sort (影片)
- AVL Trees (影片)
- AVL Tree Implementation (影片)
- Split And Merge
- [Review] AVL Trees (playlist) in 19 minutes (video)
-
伸縮樹Splay tree
- 實際上: 伸縮樹運用在快取、記憶體分配、路由、垃圾回收、資料壓縮、ropes(在長字串時取代string)、Windows NT(在虛擬記憶體、網路以及檔案系統)等等。
- CS 61B: Splay Trees (影片)
- MIT Lecture: 伸縮樹:
- 非常數學,但務必看看最後10分鐘
- 影片
-
紅黑樹
- 這些是2-3樹的解釋(請看下方)
- 實際上: 紅黑樹插入、刪除以及搜尋的時間複雜度在最糟情況下仍有一定程度的保證表現。 這不只讓他們在時間要求極高的應用(像是即時應用)有著很高的價值,在建構其他資料結構中也有著極高的價值。 舉例來說,許多在計算幾何中的資料結構都是由紅黑樹所構成的,而在Linux中用到的Completely Fair Scheduler也用到了紅黑樹。 在Java8中,Collection HashMap也從原本用Linked List實作,儲存特定元素的hashcode,改為用紅黑樹實作。
- Aduni - Algorithms - Lecture 4 (link jumps to starting point) (影片)
- Aduni - Algorithms - Lecture 5 (影片)
- Red-Black Tree
- An Introduction To Binary Search And Red Black Tree
- [Review] Red-Black Trees (playlist) in 30 minutes (video)
-
2-3搜尋樹
- 實際上: 2-3樹在犧牲了搜尋速度下換來了相對快速的插入速度(因為高度比起AVL樹來的高)
- 2-3樹極少被用到,因為實作他需要用到不同的節點。因此,紅黑樹的出現機率較高。
- 23-Tree Intuition and Definition (影片)
- Binary View of 23-Tree
- 2-3 Trees (student recitation) (影片)
-
2-3-4樹 (aka 2-4樹)
- 實際上: 每個2-4樹都有相對應,有著相同資料順序的紅黑樹。2-4樹的插入以及刪除跟紅黑樹中的color-flipping以及rotation是相同的。這讓2-4樹成為了了解紅黑樹背後的 邏輯的重要工具,而這也是為什麼很多演算法入門課本都會在介紹紅黑樹前介紹2-4樹,即使2-4樹在實際上並不常用到。
- CS 61B Lecture 26: Balanced Search Trees (影片)
- Bottom Up 234-Trees (影片)
- Top Down 234-Trees (影片)
-
N-ary (K-ary, M-ary) trees
- 重點: N或K指的是branching factor(最大的分支數)
- 二元樹屬於2-ary tree,branching factor為2
- 2-3樹屬於3-ary
- K-Ary Tree
-
B樹
- 有趣的小知識: B代表什麼是個謎題,或許代表Boeing、Balanced,或Bayer(co-inventor)
- 實際上: B樹廣泛的運用在資料庫中。多數現代資料系統使用B樹(或是其變異體)。除了在資料庫方面的應用,B樹也用在資料系統中,使得我們能夠 隨機存取特定檔案中的任意部分。最基礎的問題是把file block的i address轉變為disk block(或是轉變為cylinder head sector)的address。
- B-Tree
- B-Tree Datastructure
- Introduction to B-Trees (影片)
- B-Tree Definition and Insertion (影片)
- B-Tree Deletion (影片)
- MIT 6.851 - Memory Hierarchy Models (影片) - 涵蓋了cache-oblivious B樹,非常有趣的資料結構 - 前37分鐘非常技術性,可以跳過(B代表block大小、cache line大小)
- [Review] B-Trees (playlist) in 26 minutes (video)
-
-
- 是找矩形中或是更高維度物體中的點的數量的好方法
- 對於k-nearest neighbors很有幫助
- Kd Trees (影片)
- kNN K-d tree algorithm (影片)
-
- "這些資料結構某種程度上有些邪門" - Skiena
- Randomization: Skip Lists (影片)
- For animations and a little more detail
-
- 觀看下方影片
-
- 為什麼要學機器學習?
- Google's Cloud Machine learning tools (影片)
- Google Developers' Machine Learning Recipes (Scikit Learn & Tensorflow) (影片)
- Tensorflow (影片)
- Tensorflow Tutorials
- Practical Guide to implementing Neural Networks in Python (使用Theano)
- 課程:
- Great starter course: Machine Learning - 只有影片 - see videos 12-18 for a review of linear algebra (14 and 15 are duplicates)
- Neural Networks and Deep Learning Learning
- Google's Deep Learning Nanodegree
- Google/Kaggle Machine Learning Engineer Nanodegree
- Self-Driving Car Engineer Nanodegree
- 資源:
我為了強化某些已經在上面呈現的內容,所以才增加這些東西。但因為上面已經有太多內容了,所以不想把這些放在上面。
You want to get hired in this century, right?
-
SOLID
- Bob Martin SOLID Principles of Object Oriented and Agile Design (video)
- S - Single Responsibility Principle | Single responsibility to each Object
- O - Open/Closed Principal | On production level Objects are ready for extension but not for modification
- L - Liskov Substitution Principal | Base Class and Derived class follow ‘IS A’ principal
- I - Interface segregation principle | clients不該被強迫去實作他們不會用到的介面
- D -Dependency Inversion principle | 減少對物件的composition的依賴
-
Union-Find
-
More Dynamic Programming (影片)
- 6.006: Dynamic Programming I: Fibonacci, Shortest Paths
- 6.006: Dynamic Programming II: Text Justification, Blackjack
- 6.006: DP III: Parenthesization, Edit Distance, Knapsack
- 6.006: DP IV: Guitar Fingering, Tetris, Super Mario Bros.
- 6.046: Dynamic Programming & Advanced DP
- 6.046: Dynamic Programming: All-Pairs Shortest Paths
- 6.046: Dynamic Programming (student recitation)
-
Advanced Graph Processing (影片)
-
MIT Probability (過於數學,進度緩慢,但這對於數學的東西卻是必要之惡) (影片):
-
String Matching
- Rabin-Karp (影片):
- Knuth-Morris-Pratt (KMP):
- Boyer–Moore string search algorithm
- Coursera: Algorithms on Strings
- 開始的時候很不錯,但過了KMP的部分後就變得過於困難
- 很好的解釋了tries(字典樹)
- 可以跳過
-
排序
- Stanford的排序課程:
- Shai Simonson, Aduni.org:
- Steven Skiena的排序課程:
坐下來享受一下"Netflix和技巧" :P
-
Excellent - MIT Calculus Revisited: Single Variable Calculus
-
Computer Science 70, 001 - Spring 2015 - Discrete Mathematics and Probability Theory
-
CSE373 - Analysis of Algorithms (25部影片)
-
UC Berkeley CS 152: Computer Architecture and Engineering (20部影片) -
MIT 6.042J: Mathematics for Computer Science, Fall 2010 (25部影片)
- Love classic papers?
- 1978: Communicating Sequential Processes
- 2003: The Google File System
- replaced by Colossus in 2012
- 2004: MapReduce: Simplified Data Processing on Large Clusters
- mostly replaced by Cloud Dataflow?
- 2006: Bigtable: A Distributed Storage System for Structured Data
- 2006: The Chubby Lock Service for Loosely-Coupled Distributed Systems
- 2007: Dynamo: Amazon’s Highly Available Key-value Store
- The Dynamo paper kicked off the NoSQL revolution
- 2007: What Every Programmer Should Know About Memory (very long, and the author encourages skipping of some sections)
- 2010: Dapper, a Large-Scale Distributed Systems Tracing Infrastructure
- 2010: Dremel: Interactive Analysis of Web-Scale Datasets
- 2012: Google's Colossus
- 論文暫不提供
- 2012: AddressSanitizer: A Fast Address Sanity Checker:
- 2013: Spanner: Google’s Globally-Distributed Database:
- 2014: Machine Learning: The High-Interest Credit Card of Technical Debt
- 2015: Continuous Pipelines at Google
- 2015: High-Availability at Massive Scale: Building Google’s Data Infrastructure for Ads
- 2015: TensorFlow: Large-Scale Machine Learning on Heterogeneous Distributed Systems
- 2015: How Developers Search for Code: A Case Study
- 2016: Borg, Omega, and Kubernetes