中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

堅(jiān)持完成這套學(xué)習(xí)手冊,你就可以去 Google 面試了

2018-07-20    來源:編程學(xué)習(xí)網(wǎng)

容器云強(qiáng)勢上線!快速搭建集群,上萬Linux鏡像隨意使用
  • 原文地址:Google Interview University
  • 原文作者:John Washam
  • 譯文出自:掘金翻譯計(jì)劃
  • 譯者:Aleen,Newton,bobmayuze,Jaeger,sqrthree

這是?

這是我為了從 web 開發(fā)者(自學(xué)、非計(jì)算機(jī)科學(xué)學(xué)位)蛻變至 Google 軟件工程師所制定的計(jì)劃,其內(nèi)容歷時(shí)數(shù)月。

白板上編程 ———— 來自 HBO 頻道的劇集,“硅谷”

這一長列表是從 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)先級隊(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ù)處理
    • 論文
    • 測試
    • 調(diào)度
    • 實(shí)現(xiàn)系統(tǒng)例程
    • 字符串搜索和操作
  • 終面
  • 書籍
  • 編碼練習(xí)和挑戰(zhàn)
  • 當(dāng)你臨近面試時(shí)
  • 你的簡歷
  • 當(dāng)面試來臨的時(shí)候
  • 問面試官的問題
  • 當(dā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)辦。對于只有著一個(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)性能、低級別編程語言及其工作原理?梢豁(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)中。至于它們在背后是如何運(yùn)作,對此我一概不清楚。此外,以前的我并不需要對內(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ì)劃后,已然對被 Google 所雇傭充滿信心。這是一個(gè)漫長的計(jì)劃,以至于花費(fèi)了我數(shù)月的時(shí)間。若您早已熟悉大部分的知識(shí),那么也許能節(jié)省大量的時(shí)間。

如何使用它

下面所有的東西都只是一個(gè)概述。因此,你需要由上而下逐一地去處理它。

在學(xué)習(xí)過程中,我是使用 GitHub 特殊的語法特性 markdown flavor 去檢查計(jì)劃的進(jìn)展,包括使用任務(wù)列表。

  •  創(chuàng)建一個(gè)新的分支,以使得你可以像這樣去檢查計(jì)劃的進(jìn)展。直接往方括號中填寫一個(gè)字符 x 即可:[x]

更多關(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)聘%20Google(沒錯(cuò),是二月份時(shí)就得到的)。

感謝%20JP%20的這次介紹。
跟隨著我 目前我仍在該計(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 上注冊登錄才能觀看。這些視頻被稱為網(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ù)型簡歷的準(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)椋f明中會(huì)有警告:

    • JavaScript
    • Ruby

    你需要對你所選擇的語言感到非常舒適且足夠了解。

    更多關(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)書籍請看文章的底部。

    在你開始之前

    該列表已經(jīng)持續(xù)更新了很長的一段時(shí)間,所以,我們的確很容易會(huì)對其失去控制。

    這里列出了一些我所犯過的錯(cuò)誤,希望您不要重滔覆轍。

    1. 你不可能把所有的東西都記住

    就算我查看了數(shù)小時(shí)的視頻,并記錄了大量的筆記。幾個(gè)月后的我,仍然會(huì)忘卻其中大部分的東西。所以,我翻閱了我的筆記,并將可回顧的東西制作成抽認(rèn)卡(flashcard)(請往下看)

    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ì)都被覆蓋到卡片上。而這種做法,對于 Google 的要求來說,卻是多余。

    在抽認(rèn)卡上做筆記: 若你第一次發(fā)現(xiàn)你知道問題的答案時(shí),先不要急著把其標(biāo)注成“已懂”。你需要做的,是去查看一下是否有同樣的抽認(rèn)卡,并在你真正懂得如何解決問題之前,多問自己幾次。重復(fù)地問答可幫助您深刻記住該知識(shí)點(diǎn)。

    3. 回顧,回顧,回顧

    我留有一組 ASCII 碼表、OSI 堆棧、Big-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),并編寫一些測試去保證自己代碼的正確性。有時(shí),只需要使用斷言函數(shù) assert() 即可。
    此外,你也可以使用 Java 或其他語言。以上只是我的個(gè)人偏好而已。

    為何要在這些語言上分別實(shí)現(xiàn)一次?

    因?yàn)榭梢跃毩?xí),練習(xí),練習(xí),直至我厭倦它,并完美地實(shí)現(xiàn)出來。(若有部分邊緣條件沒想到時(shí),我會(huì)用書寫的形式記錄下來并去記憶)
    因?yàn)榭梢栽诩冊臈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ī)上編寫。在測試完部分簡單的輸入后,到計(jì)算機(jī)上再測試一遍。

    必備知識(shí)

    •  計(jì)算機(jī)是如何處理一段程序:

      •  CPU 是如何執(zhí)行代碼(視頻)
      •  機(jī)器碼指令(視頻)
    •  編譯器

      •  編譯器是如何在 ~1 分鐘內(nèi)工作(視頻)
      •  Hardvard CS50 —— 編譯器(視頻)
      •  C++(視頻)
      •  掌握編譯器的優(yōu)化(C++)(視頻)
    •  浮點(diǎn)數(shù)是如何存儲(chǔ)的:

      •  簡單的 8-bit:浮點(diǎn)數(shù)的表達(dá)形式 —— 1(視頻 —— 在計(jì)算上有一個(gè)錯(cuò)誤 —— 詳情請查看視頻的介紹)
      •  32 bit:IEEE754 32-bit 浮點(diǎn)二進(jìn)制(視頻)

    算法復(fù)雜度 / Big-O / 漸進(jìn)分析法

    • 并不需要實(shí)現(xiàn)
    •  Harvard CS50 —— 漸進(jìn)表示(視頻)
    •  Big O 記號(通用快速教程)(視頻)
    •  Big O 記號(以及 Omega 和 Theta)—— 最佳數(shù)學(xué)解釋(視頻)
    •  Skiena 算法:
      • 視頻
      • 幻燈片
    •  對于算法復(fù)雜度分析的一次詳細(xì)介紹
    •  增長階數(shù)(Orders of Growth)(視頻)
    •  漸進(jìn)性(Asymptotics)(視頻)
    •  UC Berkeley Big O(視頻)
    •  UC Berkeley Big Omega(視頻)
    •  平攤分析法(Amortized Analysis)(視頻)
    •  舉證“Big O”(視頻)
    •  高級編程(包括遞歸關(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ù)組的大。ㄒ曨l)
      •  實(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) —— 返回對應(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)赶虻牡刂罚┰擁撝皇菫榱俗屇懔私狻爸赶蛑羔樀闹羔槨边@一概念。但我并不推薦這種鏈?zhǔn)奖闅v的風(fēng)格。因?yàn),這種風(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)先級隊(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)椋阈枰业较乱粋(gè)元素,以致循環(huán)整個(gè)隊(duì)列
        • enqueue:O(1)(平攤(amortized)、鏈表和數(shù)組 [探測(probing)])
        • dequeue:O(1)(鏈表和數(shù)組)
        • empty:O(1)(鏈表和數(shù)組)
    • 哈希表(Hash table)

      •  視頻:

        •  鏈?zhǔn)焦1恚ㄒ曨l)
        •  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)化(視頻)
          • 分布式哈希表(視頻)
      •  使用線性探測的數(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)
      •  絕對值:
        • 絕對整型(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

      •  二叉查找樹概覽(視頻)
      •  系列(視頻)
        • 從符號表開始到 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)先級隊(duì)列(Priority Queue) / 二叉堆(Binary Heap)

      • 可視化是一棵樹,但通常是以線性的形式存儲(chǔ)(數(shù)組、鏈表)
      •  堆
      •  介紹(視頻)
      •  無知的實(shí)現(xiàn)(視頻)
      •  二叉樹(視頻)
      •  關(guān)于樹高的討論(視頻)
      •  基本操作(視頻)
      •  完全二叉樹(視頻)
      •  偽代碼(視頻)
      •  堆排序 —— 跳到起點(diǎn)(視頻)
      •  堆排序(視頻)
      •  構(gòu)建一個(gè)堆(視頻)
      •  MIT:堆與堆排序(視頻)
      •  CS 61B Lecture 24:優(yōu)先級隊(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ù)
      •  短課程視頻:
        •  對字典樹的介紹(視頻)
        •  字典樹的性能(視頻)
        •  實(shí)現(xiàn)一棵字典樹(視頻)
      •  字典樹:一個(gè)被忽略的數(shù)據(jù)結(jié)構(gòu)
      •  高級編程 —— 使用字典樹
      •  標(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)了紅黑樹,那么請嘗試一下:
        • 跳過刪除函數(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ǔ)長串的文本字符)、Windows NT(虛擬內(nèi)存、網(wǎng)絡(luò)及文件系統(tǒng))等的實(shí)現(xiàn)。
        •  CS 61B:伸展樹(Splay trees)(視頻)
        •  MIT 教程:伸展樹(Splay trees):
          • 該教程會(huì)過于學(xué)術(shù),但請觀看到最后的10分鐘以確保掌握。
          • 視頻
      •  2-3查找樹

        • 實(shí)際中:2-3樹的元素插入非?焖,但卻有著查詢慢的代價(jià)(因?yàn)橄啾容^ AVL 樹來說,其高度更高)。
        • 你會(huì)很少用到2-3樹。這是因?yàn)椋鋵?shí)現(xiàn)過程中涉及到不同類型的節(jié)點(diǎn)。因此,人們更多地會(huì)選擇紅黑樹。
        •  2-3樹的直感與定義(視頻)
        •  2-3樹的二元觀點(diǎn)
        •  2-3樹(學(xué)生敘述)(視頻)
      •  2-3-4樹 (亦稱2-4樹)

        • 實(shí)際中:對于每一棵2-4樹,都有著對應(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í)間值的保障不僅對時(shí)間敏感型應(yīng)用有用,例如實(shí)時(shí)應(yīng)用,還對在其他數(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ù)雜度分別是什么場景:
        • 不要用冒泡排序 - 大多數(shù)情況下效率感人 - 時(shí)間復(fù)雜度 O(n^2), 除非 n <= 16
      •  排序算法的穩(wěn)定性 ("快排是穩(wěn)定的么?")
        • 排序算法的穩(wěn)定性
        • 排序算法的穩(wěn)定性
        • 排序算法的穩(wěn)定性
        • 排序算法的穩(wěn)定性
        • 排序算法 - 穩(wěn)定性
      •  哪種排序算法可以用鏈表?哪種用數(shù)組?哪種兩者都可?
        • 并不推薦對一個(gè)鏈表排序,但歸并排序是可行的.
        • 鏈表的歸并排序
    • 關(guān)于堆排序,請查看前文堆的數(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ù)組
      •  對原數(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)于堆排序,請查看前文堆的數(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ì)比較長,像樹和排序的部分一樣。

    • Yegge 的筆記:

      • 有 3 種基本方式在內(nèi)存里表示一個(gè)圖:
        • 對象和指針
        • 矩陣
        • 鄰接表
      • 熟悉以上每一種圖的表示法,并了解各自的優(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ù)渑判?
        •  計(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ī)劃的例子,以便對解決 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 二級結(jié)構(gòu)問題 (video)
        •  動(dòng)態(tài)規(guī)劃算法 (video)
        •  DP 算法描述 (video)
        •  DP 算法的運(yùn)行時(shí)間 (video)
        •  DP vs 遞歸實(shí)現(xiàn) (video)
        •  全局成對序列排列 (video)
        •  本地成對序列排列 (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)
        •  CSE373 2012 - 課程 24 - NP-完全性證明 (video)
        •  CSE373 2012 - 課程 25 - NP-完全性挑戰(zhàn) (video)
      •  復(fù)雜度: P, NP, NP-完全性, 規(guī)約 (video)
      •  復(fù)雜度: 近視算法 Algorithms (video)
      •  復(fù)雜度: 固定參數(shù)算法 (video)
      • Peter Norvik 討論旅行商問題的近似最優(yōu)解:
        • Jupyter 筆記本
      • 《算法導(dǎo)論》的第 1048 - 1140 頁。
    • 緩存(Cache)

      •  LRU 緩存:
        •  LRU 的魔力 (100 Days of Google Dev) (video)
        •  實(shí)現(xiàn) LRU (video)
        •  LeetCode - 146 LRU Cache (C++) (video)
      •  CPU 緩存:
        •  MIT 6.004 L15: 存儲(chǔ)體系 (video)
        •  MIT 6.004 L16: 緩存的問題 (video)
    • 進(jìn)程(Processe)和線程(Thread)

      •  計(jì)算機(jī)科學(xué) 162 - 操作系統(tǒng) (25 個(gè)視頻):
        • 視頻 1-11 是關(guān)于進(jìn)程和線程
        • 操作系統(tǒng)和系統(tǒng)編程 (video)
      • 進(jìn)程和線程的區(qū)別是什么?
      • 涵蓋了:
        • 進(jìn)程、線程、協(xié)程
          • 進(jìn)程和線程的區(qū)別
          • 進(jìn)程
          • 線程
          • 互斥
          • 信號量
          • 監(jiān)控
          • 他們是如何工作的
          • 死鎖
          • 活鎖
        • CPU 活動(dòng), 中斷, 上下文切換
        • 現(xiàn)代多核處理器的并發(fā)式結(jié)構(gòu)
        • 進(jìn)程資源需要(內(nèi)存:代碼、靜態(tài)存儲(chǔ)器、棧、堆、文件描述符、I/O)
        • 線程資源需要(在同一個(gè)進(jìn)程內(nèi)和其他線程共享以上的資源,但是每個(gè)線程都有獨(dú)立的程序計(jì)數(shù)器、棧計(jì)數(shù)器、寄存器和棧)
        • Fork 操作是真正的寫時(shí)復(fù)制(只讀),直到新的進(jìn)程寫到內(nèi)存中,才會(huì)生成一份新的拷貝。
        • 上下文切換
          • 操作系統(tǒng)和底層硬件是如何初始化上下文切換的。
      •  C++ 的線程 (系列 - 10 個(gè)視頻)
      •  Python 的協(xié)程 (視頻):
        •  線程系列
        •  Python 線程
        •  理解 Python 的 GIL (2010)
          • 參考
        •  David Beazley - Python 協(xié)程 - PyCon 2015
        •  Keynote David Beazley - 興趣主題 (Python 異步 I/O)
        •  Python 中的互斥

      系統(tǒng)設(shè)計(jì)以及可伸縮性,要把軟硬件的伸縮性設(shè)計(jì)的足夠好有很多的東西要考慮,所以這是個(gè)包含非常多內(nèi)容和資源的大主題。需要花費(fèi)相當(dāng)多的時(shí)間在這個(gè)主題上。

    • 系統(tǒng)設(shè)計(jì)、可伸縮性、數(shù)據(jù)處理

      • Yegge 的注意事項(xiàng):
        • 伸縮性
          • 把大數(shù)據(jù)集提取為單一值
          • 大數(shù)據(jù)集轉(zhuǎn)換
          • 處理大量的數(shù)據(jù)集
        • 系統(tǒng)
          • 特征集
          • 接口
          • 類層次結(jié)構(gòu)
          • 在特定的約束下設(shè)計(jì)系統(tǒng)
          • 輕量和健壯性
          • 權(quán)衡和折衷
          • 性能分析和優(yōu)化
      •  從這里開始: HiredInTech:系統(tǒng)設(shè)計(jì)
      •  該如何為技術(shù)面試?yán)镌O(shè)計(jì)方面的問題做準(zhǔn)備?
      •  在系統(tǒng)設(shè)計(jì)面試前必須知道的 8 件事
      •  算法設(shè)計(jì)
      •  數(shù)據(jù)庫范式 - 1NF, 2NF, 3NF and 4NF (video)
      •  系統(tǒng)設(shè)計(jì)面試 - 這一部分有很多的資源,瀏覽一下我放在下面的文章和例子。
      •  如何在系統(tǒng)設(shè)計(jì)面試中脫穎而出
      •  每個(gè)人都該知道的一些數(shù)字
      •  上下文切換操作會(huì)耗費(fèi)多少時(shí)間?
      •  跨數(shù)據(jù)中心的事務(wù) (video)
      •  簡明 CAP 理論介紹
      •  Paxos 一致性算法:
        • 時(shí)間很短
        • 用例 和 multi-paxos
        • 論文
      •  一致性哈希
      •  NoSQL 模式
      •  OOSE: UML 2.0 系列 (video)
      •  OOSE: 使用 UML 和 Java 開發(fā)軟件 (21 videos):
        • 如果你對 OO 都深刻的理解和實(shí)踐,可以跳過這部分。
        • OOSE: 使用 UML 和 Java 開發(fā)軟件
      •  面向?qū)ο缶幊痰?SOLID 原則:
        •  Bob Martin 面向?qū)ο蟮?SOLID 原則和敏捷設(shè)計(jì) (video)
        •  C# SOLID 設(shè)計(jì)模式 (video)
        •  SOLID 原則 (video)
        •  S - 單一職責(zé)原則 | 每個(gè)對象的單一職責(zé)
          • 更多
        •  O - 開閉原則 | 生產(chǎn)環(huán)境里的對象應(yīng)該為擴(kuò)展做準(zhǔn)備而不是為更改
          • 更多
        •  L - 里氏代換原則 | 基類和繼承類遵循 ‘IS A’ 原則
          • 更多
        •  I - 接口隔離原則 | 客戶端被迫實(shí)現(xiàn)用不到的接口
          • 5 分鐘講解接口隔離原則 (video)
          • 更多
        •  D -依賴反轉(zhuǎn)原則 | 減少對象里的依賴。
          • 什么是依賴倒置以及它為什么重要
          • 更多
      •  可伸縮性:
        •  很棒的概述 (video)
        •  簡短系列:
          • 克隆
          • 數(shù)據(jù)庫
          • 緩存
          • 異步
        •  可伸縮的 Web 架構(gòu)和分布式系統(tǒng)
        •  錯(cuò)誤的分布式系統(tǒng)解釋
        •  實(shí)用編程技術(shù)
          • extra: Google Pregel 圖形處理
        •  Jeff Dean - 在 Goolge 構(gòu)建軟件系統(tǒng) (video)
        •  可伸縮系統(tǒng)架構(gòu)設(shè)計(jì)介紹
        •  使用 App Engine 和云存儲(chǔ)擴(kuò)展面向全球用戶的手機(jī)游戲架構(gòu)實(shí)踐(video)
        •  How Google Does Planet-Scale Engineering for Planet-Scale Infra (video)
        •  算法的重要性
        •  分片
        •  Facebook 系統(tǒng)規(guī)模擴(kuò)展實(shí)踐 (2009)
        •  Facebook 系統(tǒng)規(guī)模擴(kuò)展實(shí)踐 (2012), "為 10 億用戶構(gòu)建" (video)
        •  Long Game 工程實(shí)踐 - Astrid Atkinson Keynote(video)
        •  30 分鐘看完 YouTuBe 7 年系統(tǒng)擴(kuò)展經(jīng)驗(yàn)
          • video
        •  PayPal 如何用 8 臺(tái)虛擬機(jī)扛住 10 億日交易量系統(tǒng)
        •  如何對大數(shù)據(jù)集去重
        •  Etsy 的擴(kuò)展和工程文化探究 Jon Cowie (video)
        •  是什么造就了 Amazon 自己的微服務(wù)架構(gòu)
        •  壓縮還是不壓縮,是 Uber 面臨的問題
        •  異步 I/O Tarantool 隊(duì)列
        •  什么時(shí)候應(yīng)該用近視查詢處理?
        •  Google 從單數(shù)據(jù)中心到故障轉(zhuǎn)移, 到本地多宿主架構(gòu)的演變
        •  Spanner
        •  Egnyte: 構(gòu)建和擴(kuò)展 PB 級分布式系統(tǒng)架構(gòu)的經(jīng)驗(yàn)教訓(xùn)
        •  機(jī)器學(xué)習(xí)驅(qū)動(dòng)的編程: 新世界的新編程方式
        •  日服務(wù)數(shù)百萬請求的圖像優(yōu)化技術(shù)
        •  Patreon 架構(gòu)
        •  Tinder: 推薦引擎是如何決定下一個(gè)你將會(huì)看到誰的?
        •  現(xiàn)代緩存設(shè)計(jì)
        •  Facebook 實(shí)時(shí)視頻流擴(kuò)展
        •  在 Amazon AWS 上把服務(wù)擴(kuò)展到 1100 萬量級的新手教程
        •  對延時(shí)敏感的應(yīng)用是否應(yīng)該使用 Docker?
        •  AMP(Accelerated Mobile Pages)的存在是對 Google 的威脅么?
        •  360 度解讀 Netflix 技術(shù)棧
        •  延遲無處不在 - 如何搞定它?
        •  無服務(wù)器架構(gòu)
        •  是什么驅(qū)動(dòng)著 Instagram: 上百個(gè)實(shí)例、幾十種技術(shù)
        •  Cinchcast 架構(gòu) - 每天處理 1500 小時(shí)的音頻
        •  Justin.Tv 實(shí)時(shí)視頻播放架構(gòu)
        •  Playfish's 社交游戲架構(gòu) - 每月五千萬用戶增長
        •  貓途鷹架構(gòu) - 40 萬訪客, 200 萬動(dòng)態(tài)頁面訪問, 30TB 數(shù)據(jù)
        •  PlentyOfFish 架構(gòu)
        •  Salesforce 架構(gòu) - 如何扛住 13 億日交易量
        •  ESPN's 架構(gòu)擴(kuò)展
        •  下面 『消息、序列化和消息系統(tǒng)』部分的內(nèi)容會(huì)提到什么樣的技術(shù)能把各種服務(wù)整合到一起
        •  Twitter:
          • O'Reilly MySQL CE 2011: Jeremy Cole, "Big and Small Data at @Twitter" (video)
          • 時(shí)間線的擴(kuò)展
        • 更多內(nèi)容可以查看視頻部分的『大規(guī)模數(shù)據(jù)挖掘』視頻系列。
      •  系統(tǒng)設(shè)計(jì)問題練習(xí):下面有一些指導(dǎo)原則,每一個(gè)都有相關(guān)文檔以及在現(xiàn)實(shí)中該如何處理。
        • 復(fù)習(xí): HiredInTech 的系統(tǒng)設(shè)計(jì)
        • cheat sheet
        • 流程:
          1. 理解問題和范圍:
            • 在面試官的幫助下定義用例
            • 提出附加功能的建議
            • 去掉面試官認(rèn)定范圍以外的內(nèi)容
            • 假定高可用是必須的,而且要作為一個(gè)用例
          2. 考慮約束:
            • 問一下每月請求量
            • 問一下每秒請求量 (他們可能會(huì)主動(dòng)提到或者讓你算一下)
            • 評估讀寫所占的百分比
            • 評估的時(shí)候牢記 2/8 原則
            • 每秒寫多少數(shù)據(jù)
            • 總的數(shù)據(jù)存儲(chǔ)量要考慮超過 5 年的情況
            • 每秒讀多少數(shù)據(jù)
          3. 抽象設(shè)計(jì):
            • 分層 (服務(wù), 數(shù)據(jù), 緩存)
            • 基礎(chǔ)設(shè)施: 負(fù)載均衡, 消息
            • 粗略的概括任何驅(qū)動(dòng)整個(gè)服務(wù)的關(guān)鍵算法
            • 考慮瓶頸并指出解決方案
        • 練習(xí):
          • 設(shè)計(jì)一個(gè) CDN 網(wǎng)絡(luò)
          • 設(shè)計(jì)一個(gè)隨機(jī)唯一 ID 生成系統(tǒng)
          • 設(shè)計(jì)一個(gè)在線多人卡牌游戲
          • 設(shè)計(jì)一個(gè) key-value 數(shù)據(jù)庫
          • 設(shè)計(jì)一個(gè)函數(shù)獲取過去某個(gè)時(shí)間段內(nèi)前 K 個(gè)最高頻訪問的請求
          • 設(shè)計(jì)一個(gè)圖片分享系統(tǒng)
          • 設(shè)計(jì)一個(gè)推薦系統(tǒng)
          • 設(shè)計(jì)一個(gè)短域名生成系統(tǒng)
          • 設(shè)計(jì)一個(gè)緩存系統(tǒng)
    • 論文

      • 有 Google 的論文和一些知名的論文.
      • 你很可能實(shí)在沒時(shí)間一篇篇完整的讀完他們。我建議可以有選擇的讀其中一些論文里的核心部分。
      •  1978: 通信順序處理
        • Go 實(shí)現(xiàn)
        • 喜歡經(jīng)典的論文?
      •  2003: The Google 文件系統(tǒng)
        • 2012 年被 Colossus 取代了
      •  2004: MapReduce: Simplified Data Processing on Large Clusters
        • 大多被云數(shù)據(jù)流取代了?
      •  2007: 每個(gè)程序員都應(yīng)該知道的內(nèi)存知識(shí) (非常長,作者建議跳過某些章節(jié)來閱讀)
      •  2012: Google 的 Colossus
        • 沒有論文
      •  2012: AddressSanitizer: 快速的內(nèi)存訪問檢查器:
        • 論文
        • 視頻
      •  2013: Spanner: Google 的分布式數(shù)據(jù)庫:
        • 論文
        • 視頻
      •  2014: Machine Learning: The High-Interest Credit Card of Technical Debt
      •  2015: Continuous Pipelines at Google
      •  2015: 大規(guī)模高可用: 構(gòu)建 Google Ads 的數(shù)據(jù)基礎(chǔ)設(shè)施
      •  2015: TensorFlow: 異構(gòu)分布式系統(tǒng)上的大規(guī)模機(jī)器學(xué)習(xí)
      •  2015: 開發(fā)者應(yīng)該如何搜索代碼:用例學(xué)習(xí)
      •  2016: Borg, Omega, and Kubernetes
    • 測試

      • 涵蓋了:
        • 單元測試是如何工作的
        • 什么是模擬對象
        • 什么是集成測試
        • 什么是依賴注入
      •  James Bach 講敏捷軟件測試 (video)
      •  James Bach 軟件測試公開課 (video)
      •  Steve Freeman - 測試驅(qū)動(dòng)的開發(fā) (video)
        • slides
      •  測試驅(qū)動(dòng)的開發(fā)已死。測試不朽。
      •  測試驅(qū)動(dòng)的開發(fā)已死? (video)
      •  視頻系列 (152 個(gè)) - 并不都是必須 (video)
      •  Python:測試驅(qū)動(dòng)的 Web 開發(fā)
      •  依賴注入:
        •  視頻
        •  測試之道
      •  如何編寫測試
    • 調(diào)度

      • 在操作系統(tǒng)中是如何運(yùn)作的
      • 在操作系統(tǒng)部分的視頻里有很多資料
    • 實(shí)現(xiàn)系統(tǒng)例程

      • 理解你使用的系統(tǒng) API 底層有什么
      • 你能自己實(shí)現(xiàn)它們么?
    • 字符串搜索和操作

      •  文本的搜索模式 (video)
      •  Rabin-Karp (videos):
        • Rabin Karps 算法
        • 預(yù)先計(jì)算的優(yōu)化
        • 優(yōu)化: 實(shí)現(xiàn)和分析
        • Table Doubling, Karp-Rabin
        • 滾動(dòng)哈希
      •  Knuth-Morris-Pratt (KMP) 算法:
        • Pratt 算法
        • 教程: Knuth-Morris-Pratt (KMP) 字符串匹配算法
      •  Boyer–Moore 字符串搜索算法
        • Boyer-Moore字符串搜索算法
        • Boyer-Moore-Horspool 高級字符串搜索算法 (video)
      •  Coursera: 字符串的算法

    終面

    這一部分有一些短視頻,你可以快速的觀看和復(fù)習(xí)大多數(shù)重要概念。
    這對經(jīng)常性的鞏固很有幫助。

    綜述:

    •  2-3 分鐘的短視頻系列 (23 個(gè))
      • Videos
    •  2-5 分鐘的短視頻系列 - Michael Sambol (18 個(gè)):
      • Videos

    排序:

    •  歸并排序: https://www.youtube.com/watch?v=GCae1WNvnZM

    書籍

    Google Coaching 里提到的

    閱讀并做練習(xí):

    •  算法設(shè)計(jì)手冊 (Skiena)

      • 書 (Kindle 上可以租到):
        • Algorithm Design Manual
      • Half.com 是一個(gè)資源豐富且性價(jià)比很高的在線書店.
      • 答案:
        • 解答
        • 解答
      • 勘誤表

      read and do exercises from the books below. Then move to coding challenges (further down below) 一旦你理解了每日計(jì)劃里的所有內(nèi)容,就去讀上面所列的書并完成練習(xí),然后開始讀下面所列的書并做練習(xí),之后就可以開始實(shí)戰(zhàn)寫代碼了(本文再往后的部分)

    首先閱讀:

    •  Programming Interviews Exposed: Secrets to Landing Your Next Job, 2nd Edition

    然后閱讀 (這本獲得了很多推薦, 但是不在 Google coaching 的文檔里):

    •  Cracking the Coding Interview, 6th Edition
      • 如果你看到有人在看 "The Google Resume", 實(shí)際上它和 "Cracking the Coding Interview" 是同一個(gè)作者寫的,而且后者是升級版。

    附加書單

    這些沒有被 Google 推薦閱讀,不過我因?yàn)樾枰@些背景知識(shí)所以也把它們列在了這里。

    •  C Programming Language, Vol 2

      • 練習(xí)的答案
    •  C++ Primer Plus, 6th Edition

    •  《Unxi 環(huán)境高級編程》 The Unix Programming Environment

    •  《編程珠璣》 Programming Pearls

    •  Algorithms and Programming: Problems and Solutions

    如果你有時(shí)間

    •  Introduction to Algorithms

    •  Elements of Programming Interviews

      • 如果你希望在面試?yán)镉?C++ 寫代碼,這本書的代碼全都是 C++ 寫的
      • 通常情況下能找到解決方案的好書.

    編碼練習(xí)和挑戰(zhàn)

    一旦你學(xué)會(huì)了理論基礎(chǔ),就應(yīng)該把它們拿出來練練。 盡量堅(jiān)持每天做編碼練習(xí),越多越好。

    編程問題預(yù)備:

    •  不錯(cuò)的介紹 (摘自 System Design 章節(jié)): 算法設(shè)計(jì):
    •  如何找到解決方案
    •  如何剖析 Topcoder 題目描述
    •  Topcoders 里用到的數(shù)學(xué)
    •  動(dòng)態(tài)規(guī)劃 – 從入門到精通

    • MIT 面試材料

    • 針對編程語言本身的練習(xí)

    編碼練習(xí)平臺(tái):

    • LeetCode
    • TopCoder
    • Project Euler (數(shù)學(xué)方向?yàn)橹?
    • Codewars
    • HackerRank
    • Codility
    • InterviewCake
    • InterviewBit

    • 模擬大公司的面試

    當(dāng)你臨近面試時(shí)

    •  搞定代碼面試 (videos):
      • Cracking The Code Interview
      • Cracking the Coding Interview - 全棧系列
      • Ask Me Anything: Gayle Laakmann McDowell (Cracking the Coding Interview 的作者)

    你的簡歷

    • 10 條小貼士讓你寫出一份還算不錯(cuò)的簡歷
    • 這是搞定面試的第一個(gè)關(guān)鍵步驟

    當(dāng)面試來臨的時(shí)候

    隨著下面列舉的問題思考下你可能會(huì)遇到的 20 個(gè)面試問題
    每個(gè)問題準(zhǔn)備 2-3 種回答
    準(zhǔn)備點(diǎn)故事,不要只是擺一些你完成的事情的數(shù)據(jù),相信我,人人都喜歡聽故事
    • 你為什么想得到這份工作?
    • 你解決過的最有難度的問題是什么?
    • 面對過的最大挑戰(zhàn)是什么?
    • 見過的最好或者最壞的設(shè)計(jì)是怎么樣的?
    • 對某項(xiàng) Google 產(chǎn)品提出改進(jìn)建議。
    • 你作為一個(gè)個(gè)體同時(shí)也是團(tuán)隊(duì)的一員,如何達(dá)到最好的工作狀態(tài)?
    • 你的什么技能或者經(jīng)驗(yàn)是你的角色中不可或缺的?為什么?
    • 你在某份工作或某個(gè)項(xiàng)目中最享受的是什么?
    • 你在某份工作或某個(gè)項(xiàng)目中面臨過的最大挑戰(zhàn)是什么?
    • 你在某份工作或某個(gè)項(xiàng)目中遇到過的最蛋疼的 Bug 是什么樣的?
    • 你在某份工作或某個(gè)項(xiàng)目中學(xué)到了什么?
    • 你在某份工作或某個(gè)項(xiàng)目中哪些地方還可以做的更好?

    問面試官的問題

    我會(huì)問的一些:(可能我已經(jīng)知道了答案但我想聽聽面試官的看法或者了解團(tuán)隊(duì)的前景):
    • 團(tuán)隊(duì)多大規(guī)模?
    • 開發(fā)周期是怎樣的? 會(huì)使用瀑布流/極限編程/敏捷開發(fā)么?
    • 經(jīng)常會(huì)為 deadline 加班么? 或者是有彈性的?
    • 團(tuán)隊(duì)里怎么做技術(shù)選型?
    • 每周平均開多少次會(huì)?
    • 你覺得工作環(huán)境有助于員工集中精力嗎?
    • 目前正在做什么工作?
    • 喜歡這些事情嗎?
    • 工作期限是怎么樣的?

    當(dāng)你獲得了夢想的職位

    我還能說些什么呢,恭喜你!

    • 我希望在 Google 的第一天就知道的 10 件事

    堅(jiān)持繼續(xù)學(xué)習(xí)。

    得到這份工作只是一個(gè)開始。


    *****************************************************************************************************
    *****************************************************************************************************
    
    下面的內(nèi)容都是可選的。這些是我的推薦,不是 Google 的。
    通過學(xué)習(xí)這些內(nèi)容,你將會(huì)得到更多的有關(guān) CS 的概念,并將為所有的軟件工程工作做更好的準(zhǔn)備。
    
    *****************************************************************************************************
    *****************************************************************************************************

    附加的學(xué)習(xí)

    • Unicode

      •  每一個(gè)軟件開發(fā)者的絕對最低限度,必須要知道的關(guān)于 Unicode 和字符集知識(shí)
      •  關(guān)于處理文本需要的編碼和字符集, 每個(gè)程序員絕對需要知道的知識(shí)
    • 字節(jié)順序

      •  大、小端字節(jié)序
      •  大端字節(jié) Vs 小端字節(jié)(視頻)
      •  大、小端字節(jié)序的里里外外(Big And Little Endian Inside/Out) (視頻)
        • 內(nèi)核開發(fā)者的討論非常技術(shù)性,如果大多數(shù)都超出了你的理解范圍,不要太擔(dān)心。
        • 前半段已經(jīng)足夠了。
    • Emacs and vi(m)

      • Yegge 的建議,從一個(gè)很早以前的亞馬遜招聘信息中而來:熟悉基于 unix 的代碼編輯器
      • vi(m):
        • 使用 vim 進(jìn)行編輯 01 - 安裝, 設(shè)置和模式 (視頻)
        • VIM 的冒險(xiǎn)之旅
        • 4 個(gè)視頻集:
          • vi/vim 編輯器 - 課程 1
          • vi/vim 編輯器 - 課程 2
          • vi/vim 編輯器 - 課程 4
          • vi/vim 編輯器 - 課程 3
        • 使用 Vi 而不是 Emacs
      • emacs:
        • 基礎(chǔ) Emacs 教程 (視頻)
        • 3 個(gè)視頻集:
          • Emacs 教程 (初學(xué)者) -第 1 部分- 文件命令, 剪切/復(fù)制/粘貼, 自定義命令
          • Emacs 教程 (初學(xué)者 -第 2 部分- Buffer 管理, 搜索, M-x grep 和 rgrep 模式
          • Emacs 教程 (初學(xué)者 -第 3 部分- 表達(dá)式, 聲明, ~/.emacs 文件和包機(jī)制
        • Evil 模式: 或許, 我是怎樣對 Emacs 路人轉(zhuǎn)粉的 (視頻)
        • 使用 Emacs 開發(fā) C 程序
        • (或許) 深度組織模式:管理結(jié)構(gòu) (視頻)
    • Unix 命令行工具

      • 下列內(nèi)容中的優(yōu)秀工具由的 Yegge 推薦,Yegge 目前致力于 Amazon 人事招聘處。
      •  bash
      •  cat
      •  grep
      •  sed
      •  awk
      •  curl or wget
      •  sort
      •  tr
      •  uniq
      •  strace
      •  tcpdump
    • 信息資源 (視頻)

      •  Khan Academy 可汗學(xué)院
      •  更多有關(guān)馬爾可夫的內(nèi)容:
        •  Core Markov Text Generation馬爾可夫內(nèi)容生成
        •  Core Implementing Markov Text Generation馬爾可夫內(nèi)容生成補(bǔ)充
        •  Project = Markov Text Generation Walk Through一個(gè)馬爾可夫內(nèi)容生成器的項(xiàng)目
      • 關(guān)于更多信息,請參照下方 MIT 6.050J 信息和系統(tǒng)復(fù)雜度的內(nèi)容.
    • 奇偶校驗(yàn)位 & 漢明碼 (視頻)

      •  入門
      •  奇偶校驗(yàn)位
      •  漢明碼(Hamming Code):
        • 發(fā)現(xiàn)錯(cuò)誤
        • 修正錯(cuò)誤
      •  檢查錯(cuò)誤
    • 系統(tǒng)熵值(系統(tǒng)復(fù)雜度)

      • 請參考下方視頻
      • 觀看之前,請先確定觀看了信息論的視頻
      •  信息理論, 克勞德·香農(nóng), 熵值, 系統(tǒng)冗余, 數(shù)據(jù)比特壓縮 (視頻)
    • 密碼學(xué)

      • 請參考下方視頻
      • 觀看之前,請先確定觀看了信息論的視頻
      •  可汗學(xué)院
      •  密碼學(xué): 哈希函數(shù)
      •  密碼學(xué): 加密
    • 壓縮

      • 觀看之前,請先確定觀看了信息論的視頻
      •  壓縮 (視頻):
        •  壓縮
        •  壓縮熵值
        •  由上而下的樹 (霍夫曼編碼樹)
        •  額外比特 - 霍夫曼編碼樹
        •  優(yōu)雅的壓縮數(shù)據(jù) (無損數(shù)據(jù)壓縮方法)
        •  Text Compression Meets Probabilities
      •  數(shù)據(jù)壓縮的藝術(shù)
      •  (可選) 谷歌開發(fā)者: GZIP 還差遠(yuǎn)了呢!
    • 網(wǎng)絡(luò) (視頻)

      •  可汗學(xué)院
      •  網(wǎng)絡(luò)傳輸協(xié)議中的數(shù)據(jù)壓縮
      •  TCP/IP 和 OSI 模型解析!
      •  TCP/IP 教程:傳輸數(shù)據(jù)包.
      •  HTTP
      •  SSL 和 HTTPS
      •  SSL/TLS
      •  HTTP 2.0
      •  視頻
      •  子網(wǎng)絡(luò)解密 - 第五部分 經(jīng)典內(nèi)部域名指向 CIDR 標(biāo)記
    • 計(jì)算機(jī)安全

      • MIT
        •  威脅模型:入門
        •  控制攻擊
        •  緩沖數(shù)據(jù)注入和防御
        •  優(yōu)先權(quán)區(qū)分
        •  能力
        •  在沙盒中運(yùn)行原生代碼
        •  網(wǎng)絡(luò)安全模型
        •  網(wǎng)絡(luò)安全應(yīng)用
        •  標(biāo)志化執(zhí)行
        •  網(wǎng)絡(luò)安全
        •  網(wǎng)絡(luò)協(xié)議
        •  旁路攻擊
    • 釋放緩存

      •  Java 釋放緩存; 片段化數(shù)據(jù) (視頻)
      •  編譯器 (視頻)
      •  Python 釋放緩存 (視頻)
      •  深度解析:論釋放緩存在 JAVA 中的重要性
      •  深度解析:論釋放緩存在 Python 中的重要性(視頻)
    • 并行/并發(fā)編程

      •  Coursera (Scala)
      •  論并行/并發(fā)編程如何提高 Python 執(zhí)行效率 (視頻)
    • 設(shè)計(jì)模式

      •  UML統(tǒng)一建模語言概覽 (視頻)
      •  主要有如下的設(shè)計(jì)模式:
        •  s(strategy)
        •  singleton
        •  adapter
        •  prototype
        •  decorator
        •  visitor
        •  factory, abstract factory
        •  facade
        •  observer
        •  proxy
        •  delegate
        •  command
        •  state
        •  memento
        •  iterator
        •  composite
        •  flyweight
      •  第六章 (第 1 部分 ) - 設(shè)計(jì)模式 (視頻)
      •  第六章 (第 2 部分 ) - Abstraction-Occurrence, General Hierarchy, Player-Role, Singleton, Observer, Delegation (視頻)
      •  第六章 (第 3 部分 ) - Adapter, Facade, Immutable, Read-Only Interface, Proxy (video)
      •  視頻
      •  Head Fisrt 設(shè)計(jì)模型
        • 盡管這本書叫做設(shè)計(jì)模式:重復(fù)使用模塊,但是我還是認(rèn)為Head First是對于新手來說很不錯(cuò)的書。
      •  基于實(shí)際操作對于入門開發(fā)者的建議
    • 信息傳輸, 序列化,和隊(duì)列化的系統(tǒng)

      •  Thrift
        • 教程
      •  協(xié)議緩沖
        • 教程
      •  gRPC
        • gRPC 對于JAVA開發(fā)者的入門教程(視頻)
      •  Redis
        • 教程
      •  Amazon的 SQS 系統(tǒng) (隊(duì)列)
      •  Amazon的 SNS 系統(tǒng) (pub-sub)
      •  RabbitMQ
        • 入門教程
      •  Celery
        • Celery入門
      •  ZeroMQ
        • 入門教程
      •  ActiveMQ
      •  Kafka
      •  MessagePack
      •  Avro
    • 快速傅里葉變換

      •  什么是傅立葉變換?論傅立葉變換的用途
      •  什么是傅立葉變換? (視頻)
      •  關(guān)于 FFT 的不同觀點(diǎn) (視頻)
      •  FTT 是什么
    • 布隆過濾器

      • 給一個(gè)布隆過濾器m比特和k個(gè)哈希函數(shù),所有的注入和相關(guān)測試都會(huì)是通過。
      • 布隆過濾器
      • 布隆過濾器 | 數(shù)據(jù)挖掘 | Stanford University
      • 教程
      • 如何寫一個(gè)布隆過濾器應(yīng)用
    • van Emde Boas 樹

      •  爭論: van Emde Boas 樹 (視頻)
      •  MIT課堂筆記
    • 更深入的數(shù)據(jù)結(jié)構(gòu)

      •  CS 61B 第 39 課: 更深入的數(shù)據(jù)結(jié)構(gòu)
    • 跳表

      • "有一種非常迷幻的數(shù)據(jù)類型" - Skiena
      •  隨機(jī)化: 跳表 (視頻)
      •  更生動(dòng)詳細(xì)的解釋
    • 網(wǎng)絡(luò)流

      •  5分鐘簡析Ford-Fulkerson (視頻)
      •  Ford-Fulkerson 算法 (視頻)
      •  網(wǎng)絡(luò)流 (視頻)
    • 不相交集 & 聯(lián)合查找

      •  不相交集
      •  UCB 61B - 不相交集; 排序 & 選擇(視頻)
      •  Coursera (not needed since the above video explains it great):
        •  概覽
        •  初級實(shí)踐
        •  樹狀結(jié)構(gòu)
        •  合并樹狀結(jié)構(gòu)
        •  路徑壓縮
        •  分析選項(xiàng)
    • 快速處理數(shù)學(xué)

      •  整數(shù)運(yùn)算, Karatsuba 乘法 (視頻)
      •  中國剩余定理 (在密碼學(xué)中的使用) (視頻)
    • 樹堆 (Treap)

      • 一個(gè)二叉搜索樹和一個(gè)堆的組合
      •  樹堆
      •  數(shù)據(jù)結(jié)構(gòu):樹堆的講解(video)
      •  集合操作的應(yīng)用(Applications in set operations)
    • 線性規(guī)劃(Linear Programming)(視頻)

      •  線性規(guī)劃
      •  尋找最小成本
      •  尋找最大值
    • 幾何:凸包(Geometry, Convex hull)(視頻)

      •  Graph Alg. IV: 幾何算法介紹 - 第 9 課
      •  Graham & Jarvis: 幾何算法 - 第 10 課
      •  Divide & Conquer: 凸包, 中值查找
    • 離散數(shù)學(xué)

      • 查看下面的視頻:(這里沒看到視頻= =)
    • 機(jī)器學(xué)習(xí)(Machine Learning)

      •  為什么學(xué)習(xí)機(jī)器學(xué)習(xí)?
        •  谷歌如何將自己改造成一家「機(jī)器學(xué)習(xí)優(yōu)先」公司?
        •  智能計(jì)算機(jī)系統(tǒng)的大規(guī)模深度學(xué)習(xí) (視頻)
        •  Peter Norvig:深度學(xué)習(xí)和理解與軟件工程和驗(yàn)證的對比
      •  谷歌云機(jī)器學(xué)習(xí)工具(視頻)
      •  谷歌開發(fā)者機(jī)器學(xué)習(xí)清單 (Scikit Learn 和 Tensorflow) (視頻)
      •  Tensorflow (視頻)
      •  Tensorflow 教程
      •  Python 實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)實(shí)例教程(使用 Theano)
      • 課程:
        •  很棒的初級課程:機(jī)器學(xué)習(xí)
          • 視頻教程
          • 看第 12-18 集復(fù)習(xí)線性代數(shù)(第 14 集和第 15 集是重復(fù)的)
        •  機(jī)器學(xué)習(xí)中的神經(jīng)網(wǎng)絡(luò)
        •  Google 深度學(xué)習(xí)微學(xué)位
        •  Google/Kaggle 機(jī)器學(xué)習(xí)工程師微學(xué)位
        •  無人駕駛工程師微學(xué)位
        •  Metis 在線課程 (兩個(gè)月 99 美元)
      • 資源:
        • 書籍: Data Science from Scratch: First Principles with Python: https://www.amazon.com/Data-Science-Scratch-Principles-Python/dp/149190142X
        • 網(wǎng)站: Data School: http://www.dataschool.io/
    • Go 語言

      •  視頻:
        •  為什么學(xué)習(xí) Go 語言?
        •  Go 語言編程
        •  Go 語言之旅
      •  書籍:
        •  Go 語言編程入門 (免費(fèi)在線閱讀)
        •  Go 語言圣經(jīng) (Donovan & Kernighan)
      •  Go 語言新手訓(xùn)練營

    一些主題的額外內(nèi)容

    我為前面提到的某些主題增加了一些額外的內(nèi)容,之所以沒有直接添加到前面,是因?yàn)檫@樣很容易導(dǎo)致某個(gè)主題內(nèi)容過多。畢竟你想在本世紀(jì)找到一份工作,對吧?
    •  動(dòng)態(tài)規(guī)劃的更多內(nèi)容 (視頻)

      •  6.006: 動(dòng)態(tài)規(guī)劃 I: 斐波那契數(shù)列, 最短路徑
      •  6.006: 動(dòng)態(tài)規(guī)劃 II: 文本匹配, 二十一點(diǎn)/黑杰克
      •  6.006: 動(dòng)態(tài)規(guī)劃 III: 最優(yōu)加括號方式, 最小編輯距離, 背包問題
      •  6.006: 動(dòng)態(tài)規(guī)劃 IV: 吉他指法,拓?fù),超級馬里奧.
      •  6.046: 動(dòng)態(tài)規(guī)劃: 動(dòng)態(tài)規(guī)劃進(jìn)階
      •  6.046: 動(dòng)態(tài)規(guī)劃: 所有點(diǎn)對最短路徑
      •  6.046: 動(dòng)態(tài)規(guī)劃: 更多示例
    •  圖形處理進(jìn)階 (視頻)

      •  異步分布式算法: 對稱性破缺,最小生成樹
      •  異步分布式算法: 最小生成樹
    •  MIT 概率論 (mathy, and go slowly, which is good for mathy things) (視頻):

      •  MIT 6.042J - 概率論概述
      •  MIT 6.042J - 條件概率 Probability
      •  MIT 6.042J - 獨(dú)立
      •  MIT 6.042J - 隨機(jī)變量
      •  MIT 6.042J - 期望 I
      •  MIT 6.042J - 期望 II
      •  MIT 6.042J - 大偏差
      •  MIT 6.042J - 隨機(jī)游走
    •  Simonson: 近似算法 (視頻)

    視頻系列

    坐下來享受一下吧。"netflix and skill" :P

    •  個(gè)人的動(dòng)態(tài)規(guī)劃問題列表 (都是短視頻喲)

    •  x86 架構(gòu),匯編,應(yīng)用程序 (11 個(gè)視頻)

    •  MIT 18.06 線性代數(shù),2005 年春季 (35 個(gè)視頻)

    •  絕妙的 MIT 微積分:單變量微積分

    •  計(jì)算機(jī)科學(xué) 70, 001 - 2015 年春季 - 離散數(shù)學(xué)和概率理論

    •  離散數(shù)學(xué) (19 個(gè)視頻)

    •  CSE373 - 算法分析 (25 個(gè)視頻)

      • Skiena 的算法設(shè)計(jì)手冊講座
    •  UC Berkeley 61B (2014 年春季): 數(shù)據(jù)結(jié)構(gòu) (25 個(gè)視頻)

    •  UC Berkeley 61B (2006 年秋季): 數(shù)據(jù)結(jié)構(gòu) (39 個(gè)視頻)

    •  UC Berkeley 61C: 計(jì)算機(jī)結(jié)構(gòu) (26 個(gè)視頻)

    •  OOSE: 使用 UML 和 Java 進(jìn)行軟件開發(fā) (21 個(gè)視頻)

    •  UC Berkeley CS 152: 計(jì)算機(jī)結(jié)構(gòu)和工程 (20 個(gè)視頻)

    •  MIT 6.004: 計(jì)算結(jié)構(gòu) (49 視頻)

    •  卡內(nèi)基梅隆大學(xué) - 計(jì)算機(jī)架構(gòu)講座 (39 個(gè)視頻)

    •  MIT 6.006: 算法介紹 (47 個(gè)視頻)

    •  MIT 6.033: 計(jì)算機(jī)系統(tǒng)工程 (22 個(gè)視頻)

    •  MIT 6.034 人工智能, 2010 年秋季 (30 個(gè)視頻)

    •  MIT 6.042J: 計(jì)算機(jī)科學(xué)數(shù)學(xué), 2010 年秋季 (25 個(gè)視頻)

    •  MIT 6.046: 算法設(shè)計(jì)與分析 (34 個(gè)視頻)

    •  MIT 6.050J: 信息和熵, 2008 年春季 (19 個(gè)視頻)

    •  MIT 6.851: 高等數(shù)據(jù)結(jié)構(gòu) (22 個(gè)視頻)

    •  MIT 6.854: 高等算法, 2016 年春季 (24 個(gè)視頻)

    •  MIT 6.858計(jì)算機(jī)系統(tǒng)安全, 2014 年秋季

    •  斯坦福: 編程范例 (17 個(gè)視頻)

      • C 和 C++ 課程
    •  密碼學(xué)導(dǎo)論

      • 本系列更多內(nèi)容 (不分先后順序)
    •  大數(shù)據(jù) - 斯坦福大學(xué) (94 個(gè)視頻)

    計(jì)算機(jī)科學(xué)課程

    • 在線 CS 課程目錄
    • CS 課程目錄 (一些是在線講座)

    標(biāo)簽: Google linux Mysql ssl swap 安全 大數(shù)據(jù) 代碼 短域名 服務(wù)器 谷歌 開發(fā)者 數(shù)據(jù)庫 搜索 通信 網(wǎng)絡(luò) 網(wǎng)絡(luò)安全 域名

    版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
    特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
    本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

    上一篇:30個(gè)深度學(xué)習(xí)庫:按Python和C++等10種語言分類

    下一篇:關(guān)于 Android WebView 的內(nèi)存泄露問題