日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

坚持完成这套学习手册,你就可以去 Google 面试了

發(fā)布時(shí)間:2025/7/25 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 坚持完成这套学习手册,你就可以去 Google 面试了 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
from: http://geek.csdn.net/news/detail/107064
  • 本文為掘金投稿,譯文出自:掘金翻譯計(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)

樹(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 叉樹

排序(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è)鏈表排序,但歸并排序是可行的.
      • 鏈表的歸并排序
  • 關(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í),首先嘗試基于圖的解決方案,如果沒有再去嘗試其他的。
  • 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)
  • 動(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)
  • 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
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的坚持完成这套学习手册,你就可以去 Google 面试了的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。