坚持完成这套学习手册,你就可以去 Google 面试了
- 本文為掘金投稿,譯文出自:掘金翻譯計(jì)劃
- 原文地址:Google Interview University
- 原文作者:John Washam
- 譯者:Aleen,Newton,bobmayuze,Jaeger,sqrthree
- 友情提醒:文章較長(zhǎng),需耐心閱讀。
這是?
這是我為了從 Web 開發(fā)者(自學(xué)、非計(jì)算機(jī)科學(xué)學(xué)位)蛻變至 Google 軟件工程師所制定的計(jì)劃,其內(nèi)容歷時(shí)數(shù)月。
這一長(zhǎng)列表是從 Google 的指導(dǎo)筆記 中萃取出來并進(jìn)行擴(kuò)展。因此,有些事情你必須去了解一下。我在列表的底部添加了一些額外項(xiàng),用于解決面試中可能會(huì)出現(xiàn)的問題。這些額外項(xiàng)大部分是來自于 Steve Yegge 的“得到在 Google 工作的機(jī)會(huì)”。而在 Google 指導(dǎo)筆記的逐字間,它們有時(shí)也會(huì)被反映出來。
目錄
- 這是?
- 為何要用到它?
- 如何使用它
- 擁有一名 Googler 的心態(tài)
- 我得到了工作嗎?
- 跟隨著我
- 不要自以為自己足夠聰明
- 關(guān)于 Google
- 相關(guān)視頻資源
- 面試過程 & 通用的面試準(zhǔn)備
- 為你的面試選擇一種語言
- 在你開始之前
- 你所看不到的
- 日常計(jì)劃
- 必備知識(shí)
- 算法復(fù)雜度 / Big-O / 漸進(jìn)分析法
- 數(shù)據(jù)結(jié)構(gòu)
- 數(shù)組(Arrays)
- 鏈表(Linked Lists)
- 堆棧(Stack)
- 隊(duì)列(Queue)
- 哈希表(Hash table)
- 更多的知識(shí)
- 二分查找(Binary search)
- 按位運(yùn)算(Bitwise operations)
- 樹(Trees)
- 樹 —— 筆記 & 背景
- 二叉查找樹(Binary search trees):BSTs
- 堆(Heap) / 優(yōu)先級(jí)隊(duì)列(Priority Queue) / 二叉堆(Binary Heap)
- 字典樹(Tries)
- 平衡查找樹(Balanced search trees)
- N 叉樹(K 叉樹、M 叉樹)
- 排序
- 圖(Graphs)
- 更多知識(shí)
- 遞歸
- 動(dòng)態(tài)規(guī)劃
- 組合 & 概率
- NP, NP-完全和近似算法
- 緩存
- 進(jìn)程和線程
- 系統(tǒng)設(shè)計(jì)、可伸縮性、數(shù)據(jù)處理
- 論文
- 測(cè)試
- 調(diào)度
- 實(shí)現(xiàn)系統(tǒng)例程
- 字符串搜索和操作
- 終面
- 書籍
- 編碼練習(xí)和挑戰(zhàn)
- 當(dāng)你臨近面試時(shí)
- 你的簡(jiǎn)歷
- 當(dāng)面試來臨的時(shí)候
- 問面試官的問題
- 當(dāng)你獲得了夢(mèng)想的職位
—————- 下面的內(nèi)容是可選的 —————-
- 附加的學(xué)習(xí)
- Unicode
- 字節(jié)順序
- Emacs and vi(m)
- Unix 命令行工具
- 信息資源 (視頻)
- 奇偶校驗(yàn)位 & 漢明碼 (視頻)
- 系統(tǒng)熵值(系統(tǒng)復(fù)雜度)
- 密碼學(xué)
- 壓縮
- 網(wǎng)絡(luò) (視頻)
- 計(jì)算機(jī)安全
- 釋放緩存
- 并行/并發(fā)編程
- 設(shè)計(jì)模式
- 信息傳輸, 序列化, 和隊(duì)列化的系統(tǒng)
- 快速傅里葉變換
- 布隆過濾器
- van Emde Boas 樹
- 更深入的數(shù)據(jù)結(jié)構(gòu)
- 跳表
- 網(wǎng)絡(luò)流
- 不相交集 & 聯(lián)合查找
- 快速處理數(shù)學(xué)
- 樹堆 (Treap)
- 線性規(guī)劃
- 幾何:凸包(Geometry, Convex hull)
- 離散數(shù)學(xué)
- 機(jī)器學(xué)習(xí)
- Go 語言
- 一些主題的額外內(nèi)容
- 視頻系列
- 計(jì)算機(jī)科學(xué)課程
為何要用到它?
我一直都是遵循該計(jì)劃去準(zhǔn)備 Google 的面試。自 1997 年以來,我一直從事于 Web 程序的構(gòu)建、服務(wù)器的構(gòu)建及創(chuàng)業(yè)型公司的創(chuàng)辦。對(duì)于只有著一個(gè)經(jīng)濟(jì)學(xué)學(xué)位,而不是計(jì)算機(jī)科學(xué)學(xué)位(CS degree)的我來說,在職業(yè)生涯中所取得的都非常成功。然而,我想在 Google 工作,并進(jìn)入大型系統(tǒng)中,真正地去理解計(jì)算機(jī)系統(tǒng)、算法效率、數(shù)據(jù)結(jié)構(gòu)性能、低級(jí)別編程語言及其工作原理。可一項(xiàng)都不了解的我,怎么會(huì)被 Google 所應(yīng)聘呢?
當(dāng)我創(chuàng)建該項(xiàng)目時(shí),我從一個(gè)堆棧到一個(gè)堆都不了解。那時(shí)的我,完全不了解 Big-O 、樹,或如何去遍歷一個(gè)圖。如果非要我去編寫一個(gè)排序算法的話,我只能說我所寫的肯定是很糟糕。一直以來,我所用的任何數(shù)據(jù)結(jié)構(gòu)都是內(nèi)建于編程語言當(dāng)中。至于它們?cè)诒澈笫侨绾芜\(yùn)作,對(duì)此我一概不清楚。此外,以前的我并不需要對(duì)內(nèi)存進(jìn)行管理,最多就只是在一個(gè)正在執(zhí)行的進(jìn)程拋出了“內(nèi)存不足”的錯(cuò)誤后,采取一些權(quán)變措施。而在我的編程生活中,也甚少使用到多維數(shù)組,可關(guān)聯(lián)數(shù)組卻成千上萬。而且,從一開始到現(xiàn)在,我都還未曾自己實(shí)現(xiàn)過數(shù)據(jù)結(jié)構(gòu)。
就是這樣的我,在經(jīng)過該學(xué)習(xí)計(jì)劃后,已然對(duì)被 Google 所雇傭充滿信心。這是一個(gè)漫長(zhǎng)的計(jì)劃,以至于花費(fèi)了我數(shù)月的時(shí)間。若您早已熟悉大部分的知識(shí),那么也許能節(jié)省大量的時(shí)間。
如何使用它
下面所有的東西都只是一個(gè)概述。因此,你需要由上而下逐一地去處理它。
在學(xué)習(xí)過程中,我是使用 GitHub 特殊的語法特性 markdown flavor 去檢查計(jì)劃的進(jìn)展,包括使用任務(wù)列表。(注:因極客頭條的 markdown 并不支持此語法,因此在下方做了刪除處理)
更多關(guān)于 Github-flavored markdown 的詳情
擁有一名 Googler 的心態(tài)
把一個(gè)(或兩個(gè))印有“future Googler”的圖案打印出來,并用你誓要成功的眼神盯著它。
我得到了工作嗎?
我還沒去應(yīng)聘。
因?yàn)槲译x完成學(xué)習(xí)(完成該瘋狂的計(jì)劃列表)還需要數(shù)天的時(shí)間,并打算在下周開始用一整天的時(shí)間,以編程的方式去解決問題。當(dāng)然,這將會(huì)持續(xù)數(shù)周的時(shí)間。然后,我才通過使用在二月份所得到的一個(gè)介紹資格,去正式應(yīng)聘 Google(沒錯(cuò),是二月份時(shí)就得到的)。
感謝 JP 的這次介紹。跟隨著我
目前我仍在該計(jì)劃的執(zhí)行過程中,如果你想跟隨我腳步去學(xué)習(xí)的話,可以登進(jìn)我在 GoogleyAsHeck.com 上所寫的博客。
下面是我的聯(lián)系方式:
- Twitter: @googleyasheck
- Twitter: @StartupNextDoor
- Google+: +Googleyasheck
- LinkedIn: johnawasham
不要自以為自己足夠聰明
- Google 的工程師都是才智過人的。但是,就算是工作在 Google 的他們,仍然會(huì)因?yàn)樽约翰粔蚵斆鞫械揭环N不安。
- 天才程序員的神話
關(guān)于 Google
- 面向?qū)W生 —— Google 的職業(yè)生涯:技術(shù)開發(fā)指導(dǎo)
- Google 檢索的原理:
- Google 檢索的發(fā)展史(視頻)
- Google 檢索的原理 —— 故事篇
- Google 檢索的原理
- Google 檢索的原理 —— Matt Cutts(視頻)
- Google 是如何改善其檢索算法(視頻)
- 系列文章:
- Google 檢索是如何處理移動(dòng)設(shè)備
- Google 為了尋找大眾需求的秘密研究
- Google 檢索將成為你的下一個(gè)大腦
- Demis Hassabis 的心靈直白
- 書籍:Google 公司是如何運(yùn)作的
- 由 Google 通告所制作 —— 2016年10月(視頻)
相關(guān)視頻資源
部分視頻只能通過在 Coursera、Edx 或 Lynda.com class 上注冊(cè)登錄才能觀看。這些視頻被稱為網(wǎng)絡(luò)公開課程(MOOC)。即便是免費(fèi)觀看,部分課程可能會(huì)由于不在時(shí)間段內(nèi)而無法獲取。因此,你需要多等待幾個(gè)月。
很感謝您能幫我把網(wǎng)絡(luò)公開課程的視頻鏈接轉(zhuǎn)換成公開的視頻源,以代替那些在線課程的視頻。此外,一些大學(xué)的講座視頻也是我所青睞的。面試過程 & 通用的面試準(zhǔn)備
-
視頻:
- 如何在 Google 工作 —— 考生指導(dǎo)課程(視頻)
- Google 招聘者所分享的技術(shù)面試小竅門(視頻)
- 如何在 Google 工作:技術(shù)型簡(jiǎn)歷的準(zhǔn)備(視頻)
-
文章:
- 三步成為 Googler
- 得到在 Google 的工作機(jī)會(huì)
- 所有他所提及的事情都列在了下面
- (早已過期) 如何得到 Google 的一份工作,面試題,應(yīng)聘過程
- 手機(jī)設(shè)備屏幕的問題
-
附加的(雖然 Google 不建議,但我還是添加在此):
- ABC:永遠(yuǎn)都要去編程(Always Be Coding)
- 四步成為 Google 里一名沒有學(xué)位的員工
- 共享白板(Whiteboarding)
- Google 是如何看待應(yīng)聘、管理和公司文化
- 程序開發(fā)面試中有效的白板(Whiteboarding)
- 震撼開發(fā)類面試 第一集:
- Gayle L McDowell —— 震撼開發(fā)類面試(視頻)
- 震撼開發(fā)類面試 —— 作者 Gayle Laakmann McDowell(視頻)
- 如何在世界四強(qiáng)企業(yè)中獲得一份工作:
- “如何在世界四強(qiáng)企業(yè)中獲得一份工作 —— Amazon、Facebook、Google 和 Microsoft”(視頻)
- 面試 Google 失敗
為你的面試選擇一種語言
在這,我就以下話題寫一篇短文 —— 重點(diǎn):為在 Google 的面試選擇一種語言
在大多數(shù)公司的面試當(dāng)中,你可以在編程這一環(huán)節(jié),使用一種自己用起來較為舒適的語言去完成編程。但在 Google,你只有三種固定的選擇:
- C++
- Java
- Python
有時(shí)你也可以使用下面兩種,但需要事先查閱說明。因?yàn)?#xff0c;說明中會(huì)有警告:
- JavaScript
- Ruby
你需要對(duì)你所選擇的語言感到非常舒適且足夠了解。
更多關(guān)于語言選擇的閱讀:
- http://www.byte-by-byte.com/choose-the-right-language-for-your-coding-interview/
- http://blog.codingforinterviews.com/best-programming-language-jobs/
- https://www.quora.com/What-is-the-best-language-to-program-in-for-an-in-person-Google-interview
在此查看相關(guān)語言的資源
由于,我正在學(xué)習(xí)C、C++ 和 Python。因此,在下面你會(huì)看到部分關(guān)于它們的學(xué)習(xí)資料。相關(guān)書籍請(qǐng)看文章的底部。
在你開始之前
該列表已經(jīng)持續(xù)更新了很長(zhǎng)的一段時(shí)間,所以,我們的確很容易會(huì)對(duì)其失去控制。
這里列出了一些我所犯過的錯(cuò)誤,希望您不要重滔覆轍。
1. 你不可能把所有的東西都記住
就算我查看了數(shù)小時(shí)的視頻,并記錄了大量的筆記。幾個(gè)月后的我,仍然會(huì)忘卻其中大部分的東西。所以,我翻閱了我的筆記,并將可回顧的東西制作成抽認(rèn)卡(flashcard)(請(qǐng)往下看)
2. 使用抽認(rèn)卡
為了解決善忘的問題,我制作了一些關(guān)于抽認(rèn)卡的頁面,用于添加兩種抽認(rèn)卡:正常的及帶有代碼的。每種卡都會(huì)有不同的格式設(shè)計(jì)。
而且,我還以移動(dòng)設(shè)備為先去設(shè)計(jì)這些網(wǎng)頁,以使得在任何地方的我,都能通過我的手機(jī)及平板去回顧知識(shí)。
你也可以免費(fèi)制作屬于你自己的抽認(rèn)卡網(wǎng)站:
- 抽認(rèn)卡頁面的代碼倉庫
- 我的抽認(rèn)卡數(shù)據(jù)庫:有一點(diǎn)需要記住的是,我做事有點(diǎn)過頭,以至于把卡片都覆蓋到所有的東西上。從匯編語言和 Python 的細(xì)枝末節(jié),乃至到機(jī)器學(xué)習(xí)和統(tǒng)計(jì)都被覆蓋到卡片上。而這種做法,對(duì)于 Google 的要求來說,卻是多余。
在抽認(rèn)卡上做筆記: 若你第一次發(fā)現(xiàn)你知道問題的答案時(shí),先不要急著把其標(biāo)注成“已懂”。你需要做的,是去查看一下是否有同樣的抽認(rèn)卡,并在你真正懂得如何解決問題之前,多問自己幾次。重復(fù)地問答可幫助您深刻記住該知識(shí)點(diǎn)。
3. 回顧,回顧,回顧
我留有一組 ASCII 碼表、OSI 堆棧、Big-O 記號(hào)及更多的小抄紙,以便在空余的時(shí)候可以學(xué)習(xí)。
每編程半個(gè)小時(shí)就要休息一下,并去回顧你的抽認(rèn)卡。
4. 專注
在學(xué)習(xí)的過程中,往往會(huì)有許多令人分心的事占據(jù)著我們寶貴的時(shí)間。因此,專注和集中注意力是非常困難的。
你所看不到的
由于,這個(gè)巨大的列表一開始是作為我個(gè)人從 Google 面試指導(dǎo)筆記所形成的一個(gè)事件處理列表。因此,有一些我熟悉且普遍的技術(shù)在此都未被談及到:
- SQL
- Javascript
- HTML、CSS 和其他前端技術(shù)
日常計(jì)劃
部分問題可能會(huì)花費(fèi)一天的時(shí)間去學(xué)習(xí),而部分則會(huì)花費(fèi)多天。當(dāng)然,有些學(xué)習(xí)并不需要我們懂得如何實(shí)現(xiàn)。
因此,每一天我都會(huì)在下面所列出的列表中選擇一項(xiàng),并查看相關(guān)的視頻。然后,使用以下的一種語言去實(shí)現(xiàn):
C —— 使用結(jié)構(gòu)體和函數(shù),該函數(shù)會(huì)接受一個(gè)結(jié)構(gòu)體指針 * 及其他數(shù)據(jù)作為參數(shù)。 C++ —— 不使用內(nèi)建的數(shù)據(jù)類型。 C++ —— 使用內(nèi)建的數(shù)據(jù)類型,如使用 STL 的 std::list 來作為鏈表。 Python —— 使用內(nèi)建的數(shù)據(jù)類型(為了持續(xù)練習(xí) Python),并編寫一些測(cè)試去保證自己代碼的正確性。有時(shí),只需要使用斷言函數(shù) assert() 即可。 此外,你也可以使用 Java 或其他語言。以上只是我的個(gè)人偏好而已。為何要在這些語言上分別實(shí)現(xiàn)一次?
因?yàn)榭梢跃毩?xí),練習(xí),練習(xí),直至我厭倦它,并完美地實(shí)現(xiàn)出來。(若有部分邊緣條件沒想到時(shí),我會(huì)用書寫的形式記錄下來并去記憶) 因?yàn)榭梢栽诩冊(cè)臈l件下工作(不需垃圾回收機(jī)制的幫助下,分配/釋放內(nèi)存(除了 Python)) 因?yàn)榭梢岳蒙蟽?nèi)建的數(shù)據(jù)類型,以使得我擁有在現(xiàn)實(shí)中使用內(nèi)建工具的經(jīng)驗(yàn)(在生產(chǎn)環(huán)境中,我不會(huì)去實(shí)現(xiàn)自己的鏈表)就算我沒有時(shí)間去每一項(xiàng)都這么做,但我也會(huì)盡我所能的。
在這里,你可以查看到我的代碼:
- C
- C++
- Python
你不需要記住每一個(gè)算法的內(nèi)部原理。
在一個(gè)白板上寫代碼,而不要直接在計(jì)算機(jī)上編寫。在測(cè)試完部分簡(jiǎn)單的輸入后,到計(jì)算機(jī)上再測(cè)試一遍。
必備知識(shí)
-
計(jì)算機(jī)是如何處理一段程序:
- CPU 是如何執(zhí)行代碼(視頻)
- 機(jī)器碼指令(視頻)
-
編譯器
- 編譯器是如何在 ~1 分鐘內(nèi)工作(視頻)
- Hardvard CS50 —— 編譯器(視頻)
- C++(視頻)
- 掌握編譯器的優(yōu)化(C++)(視頻)
-
浮點(diǎn)數(shù)是如何存儲(chǔ)的:
- 簡(jiǎn)單的 8-bit:浮點(diǎn)數(shù)的表達(dá)形式 —— 1(視頻 —— 在計(jì)算上有一個(gè)錯(cuò)誤 —— 詳情請(qǐng)查看視頻的介紹)
- 32 bit:IEEE754 32-bit 浮點(diǎn)二進(jìn)制(視頻)
算法復(fù)雜度 / Big-O / 漸進(jìn)分析法
- 并不需要實(shí)現(xiàn)
- Harvard CS50 —— 漸進(jìn)表示(視頻)
- Big O 記號(hào)(通用快速教程)(視頻)
- Big O 記號(hào)(以及 Omega 和 Theta)—— 最佳數(shù)學(xué)解釋(視頻)
- Skiena 算法:
- 視頻
- 幻燈片
- 對(duì)于算法復(fù)雜度分析的一次詳細(xì)介紹
- 增長(zhǎng)階數(shù)(Orders of Growth)(視頻)
- 漸進(jìn)性(Asymptotics)(視頻)
- UC Berkeley Big O(視頻)
- UC Berkeley Big Omega(視頻)
- 平攤分析法(Amortized Analysis)(視頻)
- 舉證“Big O”(視頻)
- 高級(jí)編程(包括遞歸關(guān)系和主定理):
- 計(jì)算性復(fù)雜度:第一部
- 計(jì)算性復(fù)雜度:第二部
-
速查表(Cheat sheet)
如果部分課程過于學(xué)術(shù)性,你可直接跳到文章底部,去查看離散數(shù)學(xué)的視頻以獲取相關(guān)背景知識(shí)。
數(shù)據(jù)結(jié)構(gòu)
-
數(shù)組(Arrays)
- 實(shí)現(xiàn)一個(gè)可自動(dòng)調(diào)整大小的動(dòng)態(tài)數(shù)組。
- 介紹:
- 數(shù)組(視頻)
- 數(shù)組的基礎(chǔ)知識(shí)(視頻)
- 多維數(shù)組(視頻)
- 動(dòng)態(tài)數(shù)組(視頻)
- 不規(guī)則數(shù)組(視頻)
- 調(diào)整數(shù)組的大小(視頻)
- 實(shí)現(xiàn)一個(gè)動(dòng)態(tài)數(shù)組(可自動(dòng)調(diào)整大小的可變數(shù)組):
- 練習(xí)使用數(shù)組和指針去編碼,并且指針是通過計(jì)算去跳轉(zhuǎn)而不是使用索引
- 通過分配內(nèi)存來新建一個(gè)原生數(shù)據(jù)型數(shù)組
- 可以使用 int 類型的數(shù)組,但不能使用其語法特性
- 從大小為16或更大的數(shù)(使用2的倍數(shù) —— 16、32、64、128)開始編寫
- size() —— 數(shù)組元素的個(gè)數(shù)
- capacity() —— 可容納元素的個(gè)數(shù)
- is_empty()
- at(index) —— 返回對(duì)應(yīng)索引的元素,且若索引越界則憤然報(bào)錯(cuò)
- push(item)
- insert(index, item) —— 在指定索引中插入元素,并把后面的元素依次后移
- prepend(item) —— 可以使用上面的 insert 函數(shù),傳參 index 為 0
- pop() —— 刪除在數(shù)組末端的元素,并返回其值
- delete(index) —— 刪除指定索引的元素,并把后面的元素依次前移
- remove(item) —— 刪除指定值的元素,并返回其索引(即使有多個(gè)元素)
- find(item) —— 尋找指定值的元素并返回其中第一個(gè)出現(xiàn)的元素其索引,若未找到則返回 -1
- resize(new_capacity) // 私有函數(shù)
- 若數(shù)組的大小到達(dá)其容積,則變大一倍
- 獲取元素后,若數(shù)組大小為其容積的1/4,則縮小一半
- 時(shí)間復(fù)雜度
- 在數(shù)組末端增加/刪除、定位、更新元素,只允許占 O(1) 的時(shí)間復(fù)雜度(平攤(amortized)去分配內(nèi)存以獲取更多空間)
- 在數(shù)組任何地方插入/移除元素,只允許 O(n) 的時(shí)間復(fù)雜度
- 空間復(fù)雜度
- 因?yàn)樵趦?nèi)存中分配的空間鄰近,所以有助于提高性能
- 空間需求 = (大于或等于 n 的數(shù)組容積)* 元素的大小。即便空間需求為 2n,其空間復(fù)雜度仍然是 O(n)
-
鏈表(Linked Lists)
- 介紹:
- 單向鏈表(視頻)
- CS 61B —— 鏈表(視頻)
- C 代碼(視頻)
- 并非看完整個(gè)視頻,只需要看關(guān)于節(jié)點(diǎn)結(jié)果和內(nèi)存分配那一部分即可
- 鏈表 vs 數(shù)組:
- 基本鏈表 Vs 數(shù)組(視頻)
- 在現(xiàn)實(shí)中,鏈表 Vs 數(shù)組(視頻)
- 為什么你需要避免使用鏈表(視頻)
- 的確:你需要關(guān)于“指向指針的指針”的相關(guān)知識(shí):(因?yàn)楫?dāng)你傳遞一個(gè)指針到一個(gè)函數(shù)時(shí),該函數(shù)可能會(huì)改變指針?biāo)赶虻牡刂?#xff09;該頁只是為了讓你了解“指向指針的指針”這一概念。但我并不推薦這種鏈?zhǔn)奖闅v的風(fēng)格。因?yàn)?#xff0c;這種風(fēng)格的代碼,其可讀性和可維護(hù)性太低。
- 指向指針的指針
- 實(shí)現(xiàn)(我實(shí)現(xiàn)了使用尾指針以及沒有使用尾指針這兩種情況):
- size() —— 返回鏈表中數(shù)據(jù)元素的個(gè)數(shù)
- empty() —— 若鏈表為空則返回一個(gè)布爾值 true
- value_at(index) —— 返回第 n 個(gè)元素的值(從0開始計(jì)算)
- push_front(value) —— 添加元素到鏈表的首部
- pop_front() —— 刪除首部元素并返回其值
- push_back(value) —— 添加元素到鏈表的尾部
- pop_back() —— 刪除尾部元素并返回其值
- front() —— 返回首部元素的值
- back() —— 返回尾部元素的值
- insert(index, value) —— 插入值到指定的索引,并把當(dāng)前索引的元素指向到新的元素
- erase(index) —— 刪除指定索引的節(jié)點(diǎn)
- value_n_from_end(n) —— 返回倒數(shù)第 n 個(gè)節(jié)點(diǎn)的值
- reverse() —— 逆序鏈表
- remove_value(value) —— 刪除鏈表中指定值的第一個(gè)元素
- 雙向鏈表
- 介紹(視頻)
- 并不需要實(shí)現(xiàn)
- 介紹:
-
堆棧(Stack)
- 堆棧(視頻)
- 使用堆棧 —— 后進(jìn)先出(視頻)
- 可以不實(shí)現(xiàn),因?yàn)槭褂脭?shù)組來實(shí)現(xiàn)并不重要
-
隊(duì)列(Queue)
- 使用隊(duì)列 —— 先進(jìn)先出(視頻)
- 隊(duì)列(視頻)
- 原型隊(duì)列/先進(jìn)先出(FIFO)
- 優(yōu)先級(jí)隊(duì)列(視頻)
- 使用含有尾部指針的鏈表來實(shí)現(xiàn):
- enqueue(value) —— 在尾部添加值
- dequeue() —— 刪除最早添加的元素并返回其值(首部元素)
- empty()
- 使用固定大小的數(shù)組實(shí)現(xiàn):
- enqueue(value) —— 在可容的情況下添加元素到尾部
- dequeue() —— 刪除最早添加的元素并返回其值
- empty()
- full()
- 花銷:
- 在糟糕的實(shí)現(xiàn)情況下,使用鏈表所實(shí)現(xiàn)的隊(duì)列,其入列和出列的時(shí)間復(fù)雜度將會(huì)是 O(n)。因?yàn)?#xff0c;你需要找到下一個(gè)元素,以致循環(huán)整個(gè)隊(duì)列
- enqueue:O(1)(平攤(amortized)、鏈表和數(shù)組 [探測(cè)(probing)])
- dequeue:O(1)(鏈表和數(shù)組)
- empty:O(1)(鏈表和數(shù)組)
-
哈希表(Hash table)
-
視頻:
- 鏈?zhǔn)焦1?#xff08;視頻)
- Table Doubling 和 Karp-Rabin(視頻)
- Open Addressing 和密碼型哈希(Cryptographic Hashing)(視頻)
- PyCon 2010:The Mighty Dictionary(視頻)
- (進(jìn)階)隨機(jī)取樣(Randomization):全域哈希(Universal Hashing)& 完美哈希(Perfect Hashing)(視頻)
- (進(jìn)階)完美哈希(Perfect hashing)(視頻)
-
在線課程:
- 哈希函數(shù)的掌握(視頻)
- 使用哈希表(視頻)
- 哈希表的支持(視頻)
- 哈希表的語言支持(視頻)
- 基本哈希表(視頻)
- 數(shù)據(jù)結(jié)構(gòu)(視頻)
- 電話薄問題(Phone Book Problem)(視頻)
- 分布式哈希表:
- Dropbox 中的瞬時(shí)上傳及存儲(chǔ)優(yōu)化(視頻)
- 分布式哈希表(視頻)
-
使用線性探測(cè)的數(shù)組去實(shí)現(xiàn)
- hash(k, m) —— m 是哈希表的大小
- add(key, value) —— 如果 key 已存在則更新值
- exists(key)
- get(key)
- remove(key)
-
更多的知識(shí)
-
二分查找(Binary search)
- 二分查找(視頻)
- 二分查找(視頻)
- 詳情
- 實(shí)現(xiàn):
- 二分查找(在一個(gè)已排序好的整型數(shù)組中查找)
- 迭代式二分查找
-
按位運(yùn)算(Bitwise operations)
- Bits 速查表
- 你需要知道大量2的冪數(shù)值(從2^1 到 2^16 及 2^32)
- 好好理解位操作符的含義:&、|、^、~、>>、<<
- 字碼(words)
- 好的介紹:
位操作(視頻) - C 語言編程教程 2-10:按位運(yùn)算(視頻)
- 位操作
- 按位運(yùn)算
- Bithacks
- 位元撫弄者(The Bit Twiddler)
- 交互式位元撫弄者(The Bit Twiddler Interactive)
- 一補(bǔ)數(shù)和補(bǔ)碼
- 二進(jìn)制:利 & 弊(為什么我們要使用補(bǔ)碼)(視頻)
- 一補(bǔ)數(shù)(1s Complement)
- 補(bǔ)碼(2s Complement)
- 計(jì)算置位(Set Bits)
- 計(jì)算一個(gè)字節(jié)中置位(Set Bits)的四種方式(視頻)
- 計(jì)算比特位
- 如何在一個(gè) 32 位的整型中計(jì)算置位(Set Bits)的數(shù)量
- 四舍五入2的冪數(shù):
- 四舍五入到2的下一冪數(shù)
- 交換值:
- 交換(Swap)
- 絕對(duì)值:
- 絕對(duì)整型(Absolute Integer)
- Bits 速查表
樹(Trees)
-
樹 —— 筆記 & 背景
- 系列:基本樹(視頻)
- 系列:樹(視頻)
- 基本的樹形結(jié)構(gòu)
- 遍歷
- 操作算法
- BFS(廣度優(yōu)先檢索,breadth-first search)
- MIT(視頻)
- 層序遍歷(使用隊(duì)列的 BFS 算法)
- 時(shí)間復(fù)雜度: O(n)
- 空間復(fù)雜度:
- 最好情況: O(1)
- 最壞情況:O(n/2)=O(n)
- DFS(深度優(yōu)先檢索,depth-first search)
- MIT(視頻)
- 筆記:
- 時(shí)間復(fù)雜度:O(n)
- 空間復(fù)雜度:
- 最好情況:O(log n) - 樹的平均高度
- 最壞情況:O(n)
- 中序遍歷(DFS:左、節(jié)點(diǎn)本身、右)
- 后序遍歷(DFS:左、右、節(jié)點(diǎn)本身)
- 先序遍歷(DFS:節(jié)點(diǎn)本身、左、右)
-
二叉查找樹(Binary search trees):BSTs
- 二叉查找樹概覽(視頻)
- 系列(視頻)
- 從符號(hào)表開始到 BST 程序
- 介紹(視頻)
- MIT(視頻)
- C/C++:
- 二叉查找樹 —— 在 C/C++ 中實(shí)現(xiàn)(視頻)
- BST 的實(shí)現(xiàn) —— 在堆棧和堆中的內(nèi)存分配(視頻)
- 在二叉查找樹中找到最小和最大的元素(視頻)
- 尋找二叉樹的高度(視頻)
- 二叉樹的遍歷 —— 廣度優(yōu)先和深度優(yōu)先策略(視頻)
- 二叉樹:層序遍歷(視頻)
- 二叉樹的遍歷:先序、中序、后序(視頻)
- 判斷一棵二叉樹是否為二叉查找樹(視頻)
- 從二叉查找樹中刪除一個(gè)節(jié)點(diǎn)(視頻)
- 二叉查找樹中序遍歷的后繼者(視頻)
- 實(shí)現(xiàn):
- insert // 往樹上插值
- get_node_count // 查找樹上的節(jié)點(diǎn)數(shù)
- print_values // 從小到大打印樹中節(jié)點(diǎn)的值
- delete_tree
- is_in_tree // 如果值存在于樹中則返回 true
- get_height // 返回節(jié)點(diǎn)所在的高度(如果只有一個(gè)節(jié)點(diǎn),那么高度則為1)
- get_min // 返回樹上的最小值
- get_max // 返回樹上的最大值
- is_binary_search_tree
- delete_value
- get_successor // 返回給定值的后繼者,若沒有則返回-1
-
堆(Heap) / 優(yōu)先級(jí)隊(duì)列(Priority Queue) / 二叉堆(Binary Heap)
- 可視化是一棵樹,但通常是以線性的形式存儲(chǔ)(數(shù)組、鏈表)
- 堆
- 介紹(視頻)
- 無知的實(shí)現(xiàn)(視頻)
- 二叉樹(視頻)
- 關(guān)于樹高的討論(視頻)
- 基本操作(視頻)
- 完全二叉樹(視頻)
- 偽代碼(視頻)
- 堆排序 —— 跳到起點(diǎn)(視頻)
- 堆排序(視頻)
- 構(gòu)建一個(gè)堆(視頻)
- MIT:堆與堆排序(視頻)
- CS 61B Lecture 24:優(yōu)先級(jí)隊(duì)列(視頻)
- 構(gòu)建線性時(shí)間復(fù)雜度的堆(大頂堆)
- 實(shí)現(xiàn)一個(gè)大頂堆:
- insert
- sift_up —— 用于插入元素
- get_max —— 返回最大值但不移除元素
- get_size() —— 返回存儲(chǔ)的元素?cái)?shù)量
- is_empty() —— 若堆為空則返回 true
- extract_max —— 返回最大值并移除
- sift_down —— 用于獲取最大值元素
- remove(i) —— 刪除指定索引的元素
- heapify —— 構(gòu)建堆,用于堆排序
- heap_sort() —— 拿到一個(gè)未排序的數(shù)組,然后使用大頂堆進(jìn)行就地排序
- 注意:若用小頂堆可節(jié)省操作,但導(dǎo)致空間復(fù)雜度加倍。(無法做到就地)
-
字典樹(Tries)
- 需要注意的是,字典樹各式各樣。有些有前綴,而有些則沒有。有些使用字符串而不使用比特位來追蹤路徑。
- 閱讀代碼,但不實(shí)現(xiàn)。
- 數(shù)據(jù)結(jié)構(gòu)筆記及編程技術(shù)
- 短課程視頻:
- 對(duì)字典樹的介紹(視頻)
- 字典樹的性能(視頻)
- 實(shí)現(xiàn)一棵字典樹(視頻)
- 字典樹:一個(gè)被忽略的數(shù)據(jù)結(jié)構(gòu)
- 高級(jí)編程 —— 使用字典樹
- 標(biāo)準(zhǔn)教程(現(xiàn)實(shí)中的用例)(視頻)
- MIT,高階數(shù)據(jù)結(jié)構(gòu),使用字符串追蹤路徑(可事半功倍)
-
平衡查找樹(Balanced search trees)
- 掌握至少一種平衡查找樹(并懂得如何實(shí)現(xiàn)):
- “在各種平衡查找樹當(dāng)中,AVL 樹和2-3樹已經(jīng)成為了過去,而紅黑樹(red-black trees)看似變得越來越受人青睞。這種令人特別感興趣的數(shù)據(jù)結(jié)構(gòu),亦稱伸展樹(splay tree)。它可以自我管理,且會(huì)使用輪換來移除任何訪問過根節(jié)點(diǎn)的 key。” —— Skiena
- 因此,在各種各樣的平衡查找樹當(dāng)中,我選擇了伸展樹來實(shí)現(xiàn)。雖然,通過我的閱讀,我發(fā)現(xiàn)在 Google 的面試中并不會(huì)被要求實(shí)現(xiàn)一棵平衡查找樹。但是,為了勝人一籌,我們還是應(yīng)該看看如何去實(shí)現(xiàn)。在閱讀了大量關(guān)于紅黑樹的代碼后,我才發(fā)現(xiàn)伸展樹的實(shí)現(xiàn)確實(shí)會(huì)使得各方面更為高效。
- 伸展樹:插入、查找、刪除函數(shù)的實(shí)現(xiàn),而如果你最終實(shí)現(xiàn)了紅黑樹,那么請(qǐng)嘗試一下:
- 跳過刪除函數(shù),直接實(shí)現(xiàn)搜索和插入功能
- 我希望能閱讀到更多關(guān)于 B 樹的資料,因?yàn)樗脖粡V泛地應(yīng)用到大型的數(shù)據(jù)庫當(dāng)中。
-
自平衡二叉查找樹
-
AVL 樹
- 實(shí)際中:我能告訴你的是,該種樹并無太多的用途,但我能看到有用的地方在哪里:AVL 樹是另一種平衡查找樹結(jié)構(gòu)。其可支持時(shí)間復(fù)雜度為 O(log n) 的查詢、插入及刪除。它比紅黑樹嚴(yán)格意義上更為平衡,從而導(dǎo)致插入和刪除更慢,但遍歷卻更快。正因如此,才彰顯其結(jié)構(gòu)的魅力。只需要構(gòu)建一次,就可以在不重新構(gòu)造的情況下讀取,適合于實(shí)現(xiàn)諸如語言字典(或程序字典,如一個(gè)匯編程序或解釋程序的操作碼)。
- MIT AVL 樹 / AVL 樹的排序(視頻)
- AVL 樹(視頻)
- AVL 樹的實(shí)現(xiàn)(視頻)
- 分離與合并
-
伸展樹
- 實(shí)際中:伸展樹一般用于緩存、內(nèi)存分配者、路由器、垃圾回收者、數(shù)據(jù)壓縮、ropes(字符串的一種替代品,用于存儲(chǔ)長(zhǎng)串的文本字符)、Windows NT(虛擬內(nèi)存、網(wǎng)絡(luò)及文件系統(tǒng))等的實(shí)現(xiàn)。
- CS 61B:伸展樹(Splay trees)(視頻)
- MIT 教程:伸展樹(Splay trees):
- 該教程會(huì)過于學(xué)術(shù),但請(qǐng)觀看到最后的10分鐘以確保掌握。
- 視頻
-
2-3查找樹
- 實(shí)際中:2-3樹的元素插入非常快速,但卻有著查詢慢的代價(jià)(因?yàn)橄啾容^ AVL 樹來說,其高度更高)。
- 你會(huì)很少用到2-3樹。這是因?yàn)?#xff0c;其實(shí)現(xiàn)過程中涉及到不同類型的節(jié)點(diǎn)。因此,人們更多地會(huì)選擇紅黑樹。
- 2-3樹的直感與定義(視頻)
- 2-3樹的二元觀點(diǎn)
- 2-3樹(學(xué)生敘述)(視頻)
-
2-3-4樹 (亦稱2-4樹)
- 實(shí)際中:對(duì)于每一棵2-4樹,都有著對(duì)應(yīng)的紅黑樹來存儲(chǔ)同樣順序的數(shù)據(jù)元素。在2-4樹上進(jìn)行插入及刪除操作等同于在紅黑樹上進(jìn)行顏色翻轉(zhuǎn)及輪換。這使得2-4樹成為一種用于掌握紅黑樹背后邏輯的重要工具。這就是為什么許多算法引導(dǎo)文章都會(huì)在介紹紅黑樹之前,先介紹2-4樹,盡管2-4樹在實(shí)際中并不經(jīng)常使用。
- CS 61B Lecture 26:平衡查找樹(視頻)
- 自底向上的2-4樹(視頻)
- 自頂向下的2-4樹(視頻)
-
B 樹
- 有趣的是:為啥叫 B 仍然是一個(gè)神秘。因?yàn)?B 可代表波音(Boeing)、平衡(Balanced)或 Bayer(聯(lián)合創(chuàng)造者)
- 實(shí)際中:B 樹會(huì)被廣泛適用于數(shù)據(jù)庫中,而現(xiàn)代大多數(shù)的文件系統(tǒng)都會(huì)使用到這種樹(或變種)。除了運(yùn)用在數(shù)據(jù)庫中,B 樹也會(huì)被用于文件系統(tǒng)以快速訪問一個(gè)文件的任意塊。但存在著一個(gè)基本的問題,那就是如何將文件塊 i 轉(zhuǎn)換成一個(gè)硬盤塊(或一個(gè)柱面-磁頭-扇區(qū))上的地址。
- B 樹
- B 樹的介紹(視頻)
- B 樹的定義及其插入操作(視頻)
- B 樹的刪除操作(視頻)
- MIT 6.851 —— 內(nèi)存層次模塊(Memory Hierarchy Models)(視頻)
- 覆蓋有高速緩存參數(shù)無關(guān)型(cache-oblivious)B 樹和非常有趣的數(shù)據(jù)結(jié)構(gòu)
- 頭37分鐘講述的很專業(yè),或許可以跳過(B 指塊的大小、即緩存行的大小)
-
紅黑樹
- 實(shí)際中:紅黑樹提供了在最壞情況下插入操作、刪除操作和查找操作的時(shí)間保證。這些時(shí)間值的保障不僅對(duì)時(shí)間敏感型應(yīng)用有用,例如實(shí)時(shí)應(yīng)用,還對(duì)在其他數(shù)據(jù)結(jié)構(gòu)中塊的構(gòu)建非常有用,而這些數(shù)據(jù)結(jié)構(gòu)都提供了最壞情況下的保障;例如,許多用于計(jì)算幾何學(xué)的數(shù)據(jù)結(jié)構(gòu)都可以基于紅黑樹,而目前 Linux 系統(tǒng)所采用的完全公平調(diào)度器(the Completely Fair Scheduler)也使用到了該種樹。在 Java 8中,紅黑樹也被用于存儲(chǔ)哈希列表集合中相同的數(shù)據(jù),而不是使用鏈表及哈希碼。
- Aduni —— 算法 —— 課程4(該鏈接直接跳到開始部分)(視頻)
- Aduni —— 算法 —— 課程5(視頻)
- 黑樹(Black Tree)
- 二分查找及紅黑樹的介紹
-
N 叉樹(K 叉樹、M 叉樹)
- 注意:N 或 K 指的是分支系數(shù)(即樹的最大分支數(shù)):
- 二叉樹是一種分支系數(shù)為2的樹
- 2-3樹是一種分支系數(shù)為3的樹
- K 叉樹
- 注意:N 或 K 指的是分支系數(shù)(即樹的最大分支數(shù)):
排序(Sorting)
-
筆記:
- 實(shí)現(xiàn)各種排序 & 知道每種排序的最壞、最好和平均的復(fù)雜度分別是什么場(chǎng)景:
- 不要用冒泡排序 - 大多數(shù)情況下效率感人 - 時(shí)間復(fù)雜度 O(n^2), 除非 n <= 16
- 排序算法的穩(wěn)定性 (“快排是穩(wěn)定的么?”)
- 排序算法的穩(wěn)定性
- 排序算法的穩(wěn)定性
- 排序算法的穩(wěn)定性
- 排序算法的穩(wěn)定性
- 排序算法 - 穩(wěn)定性
- 哪種排序算法可以用鏈表?哪種用數(shù)組?哪種兩者都可?
- 并不推薦對(duì)一個(gè)鏈表排序,但歸并排序是可行的.
- 鏈表的歸并排序
- 實(shí)現(xiàn)各種排序 & 知道每種排序的最壞、最好和平均的復(fù)雜度分別是什么場(chǎng)景:
-
關(guān)于堆排序,請(qǐng)查看前文堆的數(shù)據(jù)結(jié)構(gòu)部分。堆排序很強(qiáng)大,不過是非穩(wěn)定排序。
-
冒泡排序 (video)
- 冒泡排序分析 (video)
- 插入排序 & 歸并排序 (video)
- 插入排序 (video)
- 歸并排序 (video)
- 快排 (video)
-
選擇排序 (video)
-
斯坦福大學(xué)關(guān)于排序算法的視頻:
- 課程 15 | 編程抽象 (video)
- 課程 16 | 編程抽象 (video)
-
Shai Simonson 視頻, Aduni.org:
- 算法 - 排序 - 第二講 (video)
- 算法 - 排序2 - 第三講 (video)
-
Steven Skiena 關(guān)于排序的視頻:
- 課程從 26:46 開始 (video)
- 課程從 27:40 開始 (video)
- 課程從 35:00 開始 (video)
- 課程從 23:50 開始 (video)
-
加州大學(xué)伯克利分校(UC Berkeley) 大學(xué)課程:
- CS 61B 課程 29: 排序 I (video)
- CS 61B 課程 30: 排序 II (video)
- CS 61B 課程 32: 排序 III (video)
- CS 61B 課程 33: 排序 V (video)
-
- 歸并排序:
- 使用外部數(shù)組
- 對(duì)原數(shù)組直接排序
-
- 快速排序:
- 實(shí)現(xiàn)
- 實(shí)現(xiàn)
-
實(shí)現(xiàn):
- 歸并:平均和最差情況的時(shí)間復(fù)雜度為 O(n log n)。
- 快排:平均時(shí)間復(fù)雜度為 O(n log n)。
- 選擇排序和插入排序的最壞、平均時(shí)間復(fù)雜度都是 O(n^2)。
- 關(guān)于堆排序,請(qǐng)查看前文堆的數(shù)據(jù)結(jié)構(gòu)部分。
-
有興趣的話,還有一些補(bǔ)充 - 但并不是必須的:
- 基數(shù)排序
- 基數(shù)排序 (video)
- 基數(shù)排序, 計(jì)數(shù)排序 (線性時(shí)間內(nèi)) (video)
- 隨機(jī)算法: 矩陣相乘, 快排, Freivalds’ 算法 (video)
- 線性時(shí)間內(nèi)的排序 (video)
圖(Graphs)
圖論能解決計(jì)算機(jī)科學(xué)里的很多問題,所以這一節(jié)會(huì)比較長(zhǎng),像樹和排序的部分一樣。
-
Yegge 的筆記:
- 有 3 種基本方式在內(nèi)存里表示一個(gè)圖:
- 對(duì)象和指針
- 矩陣
- 鄰接表
- 熟悉以上每一種圖的表示法,并了解各自的優(yōu)缺點(diǎn)
- 寬度優(yōu)先搜索和深度優(yōu)先搜索 - 知道它們的計(jì)算復(fù)雜度和設(shè)計(jì)上的權(quán)衡以及如何用代碼實(shí)現(xiàn)它們
- 遇到一個(gè)問題時(shí),首先嘗試基于圖的解決方案,如果沒有再去嘗試其他的。
- 有 3 種基本方式在內(nèi)存里表示一個(gè)圖:
-
Skiena 教授的課程 - 很不錯(cuò)的介紹:
- CSE373 2012 - 課程 11 - 圖的數(shù)據(jù)結(jié)構(gòu) (video)
- CSE373 2012 - 課程 12 - 廣度優(yōu)先搜索 (video)
- CSE373 2012 - 課程 13 - 圖的算法 (video)
- CSE373 2012 - 課程 14 - 圖的算法 (1) (video)
- CSE373 2012 - 課程 15 - 圖的算法 (2) (video)
- CSE373 2012 - 課程 16 - 圖的算法 (3) (video)
-
圖 (復(fù)習(xí)和其他):
- 6.006 單源最短路徑問題 (video)
- 6.006 Dijkstra 算法 (video)
- 6.006 Bellman-Ford 算法(video)
- 6.006 Dijkstra 效率優(yōu)化 (video)
- Aduni: 圖的算法 I - 拓?fù)渑判? 最小生成樹, Prim 算法 - 第六課 (video)
- Aduni: 圖的算法 II - 深度優(yōu)先搜索, 廣度優(yōu)先搜索, Kruskal 算法, 并查集數(shù)據(jù)結(jié)構(gòu) - 第七課 (video)
- Aduni: 圖的算法 III: 最短路徑 - 第八課 (video)
- Aduni: 圖的算法. IV: 幾何算法介紹 - 第九課 (video)
- CS 61B 2014 (從 58:09 開始) (video)
- CS 61B 2014: 加權(quán)圖 (video)
- 貪心算法: 最小生成樹 (video)
- 圖的算法之強(qiáng)連通分量 Kosaraju 算法 (video)
-
完整的 Coursera 課程:
- 圖的算法 (video)
-
Yegge: 如果有機(jī)會(huì),可以試試研究更酷炫的算法:
- Dijkstra 算法 - 上文 - 6.006
- A* 算法
- A* 算法
- A* 尋路教程 (video)
- A* 尋路 (E01: 算法解釋) (video)
-
我會(huì)實(shí)現(xiàn):
- DFS 鄰接表 (遞歸)
- DFS 鄰接表 (棧迭代)
- DFS 鄰接矩陣 (遞歸)
- DFS 鄰接矩陣 (棧迭代)
- BFS 鄰接表
- BFS 鄰接矩陣
- 單源最短路徑問題 (Dijkstra)
- 最小生成樹
- 基于 DFS 的算法 (根據(jù)上文 Aduni 的視頻):
- 檢查環(huán) (我們會(huì)先檢查是否有環(huán)存在以便做拓?fù)渑判?
- 拓?fù)渑判?/li>
- 計(jì)算圖中的連通分支
- 列出強(qiáng)連通分量
- 檢查雙向圖
可以從 Skiena 的書(參考下面的書推薦小節(jié))和面試書籍中學(xué)習(xí)更多關(guān)于圖的實(shí)踐。
更多知識(shí)
-
遞歸(Recursion)
- Stanford 大學(xué)關(guān)于遞歸 & 回溯的課程:
- 課程 8 | 抽象編程 (video)
- 課程 9 | 抽象編程 (video)
- 課程 10 | 抽象編程 (video)
- 課程 11 | 抽象編程 (video)
- 什么時(shí)候適合使用
- 尾遞歸會(huì)更好么?
- 什么是尾遞歸以及為什么它如此糟糕?
- 尾遞歸 (video)
- Stanford 大學(xué)關(guān)于遞歸 & 回溯的課程:
-
動(dòng)態(tài)規(guī)劃(Dynamic Programming)
- This subject can be pretty difficult, as each DP soluble problem must be defined as a recursion relation, and coming up with it can be tricky.
- 這一部分會(huì)有點(diǎn)困難,每個(gè)可以用動(dòng)態(tài)規(guī)劃解決的問題都必須先定義出遞推關(guān)系,要推導(dǎo)出來可能會(huì)有點(diǎn)棘手。
-
我建議先閱讀和學(xué)習(xí)足夠多的動(dòng)態(tài)規(guī)劃的例子,以便對(duì)解決 DP 問題的一般模式有個(gè)扎實(shí)的理解。
-
視頻:
- Skiena 的視頻可能會(huì)有點(diǎn)難跟上,有時(shí)候他用白板寫的字會(huì)比較小,難看清楚。
- Skiena: CSE373 2012 - 課程 19 - 動(dòng)態(tài)規(guī)劃介紹 (video)
- Skiena: CSE373 2012 - 課程 20 - 編輯距離 (video)
- Skiena: CSE373 2012 - 課程 21 - 動(dòng)態(tài)規(guī)劃舉例 (video)
- Skiena: CSE373 2012 - 課程 22 - 動(dòng)態(tài)規(guī)劃應(yīng)用 (video)
- Simonson: 動(dòng)態(tài)規(guī)劃 0 (starts at 59:18) (video)
- Simonson: 動(dòng)態(tài)規(guī)劃 I - 課程 11 (video)
- Simonson: 動(dòng)態(tài)規(guī)劃 II - 課程 12 (video)
- 單獨(dú)的 DP 問題 (每一個(gè)視頻都很短):
動(dòng)態(tài)規(guī)劃 (video)
- Yale 課程筆記:
- 動(dòng)態(tài)規(guī)劃
- Coursera 課程:
- RNA 二級(jí)結(jié)構(gòu)問題 (video)
- 動(dòng)態(tài)規(guī)劃算法 (video)
- DP 算法描述 (video)
- DP 算法的運(yùn)行時(shí)間 (video)
- DP vs 遞歸實(shí)現(xiàn) (video)
- 全局成對(duì)序列排列 (video)
- 本地成對(duì)序列排列 (video)
-
組合(Combinatorics) (n 中選 k 個(gè)) & 概率(Probability)
- 數(shù)據(jù)技巧: 如何找出階乘、排列和組合(選擇) (video)
- 來點(diǎn)學(xué)校的東西: 概率 (video)
- 來點(diǎn)學(xué)校的東西: 概率和馬爾可夫鏈 (video)
- 可汗學(xué)院:
- 課程設(shè)置:
- 概率理論基礎(chǔ)
- 視頻 - 41 (每一個(gè)都短小精悍):
- 概率解釋 (video)
- 課程設(shè)置:
-
NP, NP-完全和近似算法
- 知道最經(jīng)典的一些 NP 完全問題,比如旅行商問題和背包問題,
而且能在面試官試圖忽悠你的時(shí)候識(shí)別出他們。 - 知道 NP 完全是什么意思.
- 計(jì)算復(fù)雜度 (video)
- Simonson:
- 貪心算法. II & 介紹 NP-完全性 (video)
- NP-完全性 II & 歸約 (video)
- NP-完全性 III (Video)
- NP-完全性 IV (video)
- Skiena:
- [CSE373 2012 - 課程 23 - 介紹 NP-完全性 IV (video)](https://youtu.be/KiK5TVgXbFg?list=PLOtl7M3y
- 知道最經(jīng)典的一些 NP 完全問題,比如旅行商問題和背包問題,
總結(jié)
以上是生活随笔為你收集整理的坚持完成这套学习手册,你就可以去 Google 面试了的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Gabor滤波小结整理
- 下一篇: 如何让机器获得幽默感——Goolge图学