├── extras ├── future-googler.pdf ├── future-googler-preview.png └── cheat sheets │ ├── Cpp_reference.pdf │ ├── system-design.pdf │ ├── bits-cheat-cheet.pdf │ ├── python-cheat-sheet-v1.pdf │ ├── STL Quick Reference 1.29.pdf │ └── C Reference Card (ANSI) 2.2.pdf └── README.md /extras/future-googler.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firstcomdigital/Google-Interview-University/HEAD/extras/future-googler.pdf -------------------------------------------------------------------------------- /extras/future-googler-preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firstcomdigital/Google-Interview-University/HEAD/extras/future-googler-preview.png -------------------------------------------------------------------------------- /extras/cheat sheets/Cpp_reference.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firstcomdigital/Google-Interview-University/HEAD/extras/cheat sheets/Cpp_reference.pdf -------------------------------------------------------------------------------- /extras/cheat sheets/system-design.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firstcomdigital/Google-Interview-University/HEAD/extras/cheat sheets/system-design.pdf -------------------------------------------------------------------------------- /extras/cheat sheets/bits-cheat-cheet.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firstcomdigital/Google-Interview-University/HEAD/extras/cheat sheets/bits-cheat-cheet.pdf -------------------------------------------------------------------------------- /extras/cheat sheets/python-cheat-sheet-v1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firstcomdigital/Google-Interview-University/HEAD/extras/cheat sheets/python-cheat-sheet-v1.pdf -------------------------------------------------------------------------------- /extras/cheat sheets/STL Quick Reference 1.29.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firstcomdigital/Google-Interview-University/HEAD/extras/cheat sheets/STL Quick Reference 1.29.pdf -------------------------------------------------------------------------------- /extras/cheat sheets/C Reference Card (ANSI) 2.2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/firstcomdigital/Google-Interview-University/HEAD/extras/cheat sheets/C Reference Card (ANSI) 2.2.pdf -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Google Interview University 2 | 3 | Translations: 4 | - [中文版本](README-cn.md) 5 | - [Español (in progress)](README-es.md) [Issue #80](https://github.com/jwasham/google-interview-university/issues/80) 6 | - हिन्दी (in progress) [Issue #81](https://github.com/jwasham/google-interview-university/issues/81) 7 | 8 | ## What is it? 9 | 10 | This is my multi-month study plan for going from web developer (self-taught, no CS degree) to Google software engineer. 11 | 12 | ![Coding at the whiteboard - from HBO's Silicon Valley](https://dng5l3qzreal6.cloudfront.net/2016/Aug/coding_board_small-1470866369118.jpg) 13 | 14 | This long list has been extracted and expanded from **Google's coaching notes**, so these are the things you need to know. 15 | There are extra items I added at the bottom that may come up in the interview or be helpful in solving a problem. Many items are from 16 | Steve Yegge's "[Get that job at Google](http://steve-yegge.blogspot.com/2008/03/get-that-job-at-google.html)" and are reflected 17 | sometimes word-for-word in Google's coaching notes. 18 | 19 | I've pared down what you need to know from what Yegge recommends. I've altered Yegge's requirements 20 | from information received from my contact at Google. This is meant for **new software engineers** or those switching from 21 | software/web development to software engineering (where computer science knowledge is required). If you have 22 | many years of experience and are claiming many years of software engineering experience, expect a harder interview. 23 | [Read more here](https://googleyasheck.com/what-you-need-to-know-for-your-google-interview-and-what-you-dont/). 24 | 25 | If you have many years of software/web development experience, note that Google views software engineering as 26 | different from software/web development and they require computer science knowledge. 27 | 28 | If you want to be a reliability engineer or systems engineer, study more from the optional list (networking, security). 29 | 30 | --- 31 | 32 | ## Table of Contents 33 | 34 | - [What is it?](#what-is-it) 35 | - [Why use it?](#why-use-it) 36 | - [How to use it](#how-to-use-it) 37 | - [Get in a Googley Mood](#get-in-a-googley-mood) 38 | - [Did I Get the Job?](#did-i-get-the-job) 39 | - [Follow Along with Me](#follow-along-with-me) 40 | - [Don't feel you aren't smart enough](#dont-feel-you-arent-smart-enough) 41 | - [About Google](#about-google) 42 | - [About Video Resources](#about-video-resources) 43 | - [Interview Process & General Interview Prep](#interview-process--general-interview-prep) 44 | - [Pick One Language for the Interview](#pick-one-language-for-the-interview) 45 | - [Book List](#book-list) 46 | - [Before you Get Started](#before-you-get-started) 47 | - [What you Won't See Covered](#what-you-wont-see-covered) 48 | - [Prerequisite Knowledge](#prerequisite-knowledge) 49 | - [The Daily Plan](#the-daily-plan) 50 | - [Algorithmic complexity / Big-O / Asymptotic analysis](#algorithmic-complexity--big-o--asymptotic-analysis) 51 | - [Data Structures](#data-structures) 52 | - [Arrays](#arrays) 53 | - [Linked Lists](#linked-lists) 54 | - [Stack](#stack) 55 | - [Queue](#queue) 56 | - [Hash table](#hash-table) 57 | - [More Knowledge](#more-knowledge) 58 | - [Binary search](#binary-search) 59 | - [Bitwise operations](#bitwise-operations) 60 | - [Trees](#trees) 61 | - [Trees - Notes & Background](#trees---notes--background) 62 | - [Binary search trees: BSTs](#binary-search-trees-bsts) 63 | - [Heap / Priority Queue / Binary Heap](#heap--priority-queue--binary-heap) 64 | - balanced search trees (general concept, not details) 65 | - traversals: preorder, inorder, postorder, BFS, DFS 66 | - [Sorting](#sorting) 67 | - selection 68 | - insertion 69 | - heapsort 70 | - quicksort 71 | - merge sort 72 | - [Graphs](#graphs) 73 | - directed 74 | - undirected 75 | - adjacency matrix 76 | - adjacency list 77 | - traversals: BFS, DFS 78 | - [Even More Knowledge](#even-more-knowledge) 79 | - [Recursion](#recursion) 80 | - [Object-Oriented Programming](#object-oriented-programming) 81 | - [Design Patterns](#design-patterns) 82 | - [Combinatorics (n choose k) & Probability](#combinatorics-n-choose-k--probability) 83 | - [NP, NP-Complete and Approximation Algorithms](#np-np-complete-and-approximation-algorithms) 84 | - [Caches](#caches) 85 | - [Processes and Threads](#processes-and-threads) 86 | - [Papers](#papers) 87 | - [Testing](#testing) 88 | - [Scheduling](#scheduling) 89 | - [Implement system routines](#implement-system-routines) 90 | - [String searching & manipulations](#string-searching--manipulations) 91 | - [System Design, Scalability, Data Handling](#system-design-scalability-data-handling) (if you have 4+ years experience) 92 | - [Final Review](#final-review) 93 | - [Coding Question Practice](#coding-question-practice) 94 | - [Coding exercises/challenges](#coding-exerciseschallenges) 95 | - [Once you're closer to the interview](#once-youre-closer-to-the-interview) 96 | - [Your Resume](#your-resume) 97 | - [Be thinking of for when the interview comes](#be-thinking-of-for-when-the-interview-comes) 98 | - [Have questions for the interviewer](#have-questions-for-the-interviewer) 99 | - [Once You've Got The Job](#once-youve-got-the-job) 100 | 101 | ---------------- Everything below this point is optional ---------------- 102 | 103 | - [Additional Books](#additional-books) 104 | - [Additional Learning](#additional-learning) 105 | - [Dynamic Programming](#dynamic-programming) 106 | - [Compilers](#compilers) 107 | - [Floating Point Numbers](#floating-point-numbers) 108 | - [Unicode](#unicode) 109 | - [Endianness](#endianness) 110 | - [Emacs and vi(m)](#emacs-and-vim) 111 | - [Unix command line tools](#unix-command-line-tools) 112 | - [Information theory](#information-theory) 113 | - [Parity & Hamming Code](#parity--hamming-code) 114 | - [Entropy](#entropy) 115 | - [Cryptography](#cryptography) 116 | - [Compression](#compression) 117 | - [Networking](#networking) (if you have networking experience or want to be a systems engineer, expect questions) 118 | - [Computer Security](#computer-security) 119 | - [Garbage collection](#garbage-collection) 120 | - [Parallel Programming](#parallel-programming) 121 | - [Messaging, Serialization, and Queueing Systems](#messaging-serialization-and-queueing-systems) 122 | - [Fast Fourier Transform](#fast-fourier-transform) 123 | - [Bloom Filter](#bloom-filter) 124 | - [HyperLogLog](#hyperloglog) 125 | - [Locality-Sensitive Hashing](#locality-sensitive-hashing) 126 | - [van Emde Boas Trees](#van-emde-boas-trees) 127 | - [Augmented Data Structures](#augmented-data-structures) 128 | - [Tries](#tries) 129 | - [N-ary (K-ary, M-ary) trees](#n-ary-k-ary-m-ary-trees) 130 | - [Balanced search trees](#balanced-search-trees) 131 | - AVL trees 132 | - Splay trees 133 | - Red/black trees 134 | - 2-3 search trees 135 | - 2-3-4 Trees (aka 2-4 trees) 136 | - N-ary (K-ary, M-ary) trees 137 | - B-Trees 138 | - [k-D Trees](#k-d-trees) 139 | - [Skip lists](#skip-lists) 140 | - [Network Flows](#network-flows) 141 | - [Disjoint Sets & Union Find](#disjoint-sets--union-find) 142 | - [Math for Fast Processing](#math-for-fast-processing) 143 | - [Treap](#treap) 144 | - [Linear Programming](#linear-programming) 145 | - [Geometry, Convex hull](#geometry-convex-hull) 146 | - [Discrete math](#discrete-math) 147 | - [Machine Learning](#machine-learning) 148 | - [Go](#go) 149 | - [Additional Detail on Some Subjects](#additional-detail-on-some-subjects) 150 | - [Video Series](#video-series) 151 | - [Computer Science Courses](#computer-science-courses) 152 | 153 | --- 154 | 155 | ## Why use it? 156 | 157 | I'm following this plan to prepare for my Google interview. I've been building the web, building 158 | services, and launching startups since 1997. I have an economics degree, not a CS degree. I've 159 | been very successful in my career, but I want to work at Google. I want to progress into larger systems 160 | and get a real understanding of computer systems, algorithmic efficiency, data structure performance, 161 | low-level languages, and how it all works. And if you don't know any of it, Google won't hire you. 162 | 163 | When I started this project, I didn't know a stack from a heap, didn't know Big-O anything, anything about trees, or how to 164 | traverse a graph. If I had to code a sorting algorithm, I can tell ya it wouldn't have been very good. 165 | Every data structure I've ever used was built into the language, and I didn't know how they worked 166 | under the hood at all. I've never had to manage memory unless a process I was running would give an "out of 167 | memory" error, and then I'd have to find a workaround. I've used a few multidimensional arrays in my life and 168 | thousands of associative arrays, but I've never created data structures from scratch. 169 | 170 | But after going through this study plan I have high confidence I'll be hired. It's a long plan. It's going to take me 171 | months. If you are familiar with a lot of this already it will take you a lot less time. 172 | 173 | ## How to use it 174 | 175 | Everything below is an outline, and you should tackle the items in order from top to bottom. 176 | 177 | I'm using Github's special markdown flavor, including tasks lists to check progress. 178 | 179 | - [x] Create a new branch so you can check items like this, just put an x in the brackets: [x] 180 | 181 | 182 | Fork a branch and follow the commands below 183 | 184 | `git checkout -b progress` 185 | 186 | `git remote add jwasham https://github.com/jwasham/google-interview-university` 187 | 188 | `git fetch --all` 189 | 190 | Mark all boxes with X after you completed your changes 191 | 192 | `git add . ` 193 | 194 | `git commit -m "Marked x" ` 195 | 196 | `git rebase jwasham/master ` 197 | 198 | `git push --force ` 199 | 200 | [More about Github-flavored markdown](https://guides.github.com/features/mastering-markdown/#GitHub-flavored-markdown) 201 | 202 | ## Get in a Googley Mood 203 | 204 | Print out a "[future Googler](https://github.com/jwasham/google-interview-university/blob/master/extras/future-googler.pdf)" sign (or two) and keep your eyes on the prize. 205 | 206 | [![future Googler sign](https://dng5l3qzreal6.cloudfront.net/2016/Oct/Screen_Shot_2016_10_04_at_10_13_24_AM-1475601104364.png)](https://github.com/jwasham/google-interview-university/blob/master/extras/future-googler.pdf) 207 | 208 | ## Did I Get the Job? 209 | 210 | I'm in the queue right now. Hope to interview soon. 211 | 212 | Thanks for the referral, JP. 213 | 214 | ## Follow Along with Me 215 | 216 | My story: [Why I Studied Full-Time for 8 Months for a Google Interview](https://medium.com/@googleyasheck/why-i-studied-full-time-for-8-months-for-a-google-interview-cc662ce9bb13) 217 | 218 | I'm on the journey, too. Follow along: 219 | 220 | - **Blog**: [GoogleyAsHeck.com](https://googleyasheck.com/) 221 | - Twitter: [@googleyasheck](https://twitter.com/googleyasheck) 222 | - Twitter: [@StartupNextDoor](https://twitter.com/StartupNextDoor) 223 | - Google+: [+Googleyasheck](https://plus.google.com/+Googleyasheck) 224 | - LinkedIn: [johnawasham](https://www.linkedin.com/in/johnawasham) 225 | 226 | ![John Washam - Google Interview University](https://dng5l3qzreal6.cloudfront.net/2016/Aug/book_stack_photo_resized_18_1469302751157-1472661280368.png) 227 | 228 | ## Don't feel you aren't smart enough 229 | - Google engineers are smart, but many have an insecurity that they aren't smart enough, even though they work at Google. 230 | - [The myth of the Genius Programmer](https://www.youtube.com/watch?v=0SARbwvhupQ) 231 | - [It's Dangerous to Go Alone: Battling the Invisible Monsters in Tech](https://www.youtube.com/watch?v=1i8ylq4j_EY) 232 | 233 | ## About Google 234 | 235 | - [ ] For students - [Google Careers: Technical Development Guide](https://www.google.com/about/careers/students/guide-to-technical-development.html) 236 | - [ ] How Search Works: 237 | - [ ] [The Evolution of Search (video)](https://www.youtube.com/watch?v=mTBShTwCnD4) 238 | - [ ] [How Search Works - the story](https://www.google.com/insidesearch/howsearchworks/thestory/) 239 | - [ ] [How Search Works](https://www.google.com/insidesearch/howsearchworks/) 240 | - [ ] [How Search Works - Matt Cutts (video)](https://www.youtube.com/watch?v=BNHR6IQJGZs) 241 | - [ ] [How Google makes improvements to its search algorithm (video)](https://www.youtube.com/watch?v=J5RZOU6vK4Q) 242 | - [ ] Series: 243 | - [ ] [How Google Search Dealt With Mobile](https://backchannel.com/how-google-search-dealt-with-mobile-33bc09852dc9) 244 | - [ ] [Google's Secret Study To Find Out Our Needs](https://backchannel.com/googles-secret-study-to-find-out-our-needs-eba8700263bf) 245 | - [ ] [Google Search Will Be Your Next Brain](https://backchannel.com/google-search-will-be-your-next-brain-5207c26e4523) 246 | - [ ] [The Deep Mind Of Demis Hassabis](https://backchannel.com/the-deep-mind-of-demis-hassabis-156112890d8a) 247 | - [ ] [Book: How Google Works](https://www.amazon.com/How-Google-Works-Eric-Schmidt/dp/1455582344) 248 | - [ ] [Made by Google announcement - Oct 2016 (video)](https://www.youtube.com/watch?v=q4y0KOeXViI) 249 | 250 | ## About Video Resources 251 | 252 | Some videos are available only by enrolling in a Coursera, EdX, or Lynda.com class. These are called MOOCs. 253 | Sometimes the classes are not in session so you have to wait a couple of months, so you have no access. Lynda.com courses are not free. 254 | 255 | I'd appreciate your help to add free and always-available public sources, such as YouTube videos to accompany the online course videos. 256 | I like using university lectures. 257 | 258 | 259 | ## Interview Process & General Interview Prep 260 | 261 | - [ ] Videos: 262 | - [ ] [How to Work at Google: Prepare for an Engineering Interview (video)](https://www.youtube.com/watch?v=ko-KkSmp-Lk) 263 | - [ ] [How to Work at Google: Example Coding/Engineering Interview (video)](https://www.youtube.com/watch?v=XKu_SEDAykw) 264 | - [ ] [How to Work at Google - Candidate Coaching Session (video)](https://www.youtube.com/watch?v=oWbUtlUhwa8&feature=youtu.be) 265 | - [ ] [Google Recruiters Share Technical Interview Tips (video)](https://www.youtube.com/watch?v=qc1owf2-220&feature=youtu.be) 266 | - [ ] [How to Work at Google: Tech Resume Preparation (video)](https://www.youtube.com/watch?v=8npJLXkcmu8) 267 | 268 | - [ ] Articles: 269 | - [ ] [Becoming a Googler in Three Steps](http://www.google.com/about/careers/lifeatgoogle/hiringprocess/) 270 | - [ ] [Get That Job at Google](http://steve-yegge.blogspot.com/2008/03/get-that-job-at-google.html) 271 | - all the things he mentions that you need to know are listed below 272 | - [ ] _(very dated)_ [How To Get A Job At Google, Interview Questions, Hiring Process](http://dondodge.typepad.com/the_next_big_thing/2010/09/how-to-get-a-job-at-google-interview-questions-hiring-process.html) 273 | - [ ] [Phone Screen Questions](http://sites.google.com/site/steveyegge2/five-essential-phone-screen-questions) 274 | 275 | - [ ] Prep Courses: 276 | - [ ] [Software Engineer Interview Unleashed (paid course)](https://www.udemy.com/software-engineer-interview-unleashed): 277 | - Learn how to make yourself ready for software engineer interviews from a former Google interviewer. 278 | 279 | - [ ] Additional (not suggested by Google but I added): 280 | - [ ] [ABC: Always Be Coding](https://medium.com/always-be-coding/abc-always-be-coding-d5f8051afce2#.4heg8zvm4) 281 | - [ ] [Four Steps To Google Without A Degree](https://medium.com/always-be-coding/four-steps-to-google-without-a-degree-8f381aa6bd5e#.asalo1vfx) 282 | - [ ] [Whiteboarding](https://medium.com/@dpup/whiteboarding-4df873dbba2e#.hf6jn45g1) 283 | - [ ] [How Google Thinks About Hiring, Management And Culture](http://www.kpcb.com/blog/lessons-learned-how-google-thinks-about-hiring-management-and-culture) 284 | - [ ] [Effective Whiteboarding during Programming Interviews](http://www.coderust.com/blog/2014/04/10/effective-whiteboarding-during-programming-interviews/) 285 | - [ ] Cracking The Coding Interview Set 1: 286 | - [ ] [Gayle L McDowell - Cracking The Coding Interview (video)](https://www.youtube.com/watch?v=rEJzOhC5ZtQ) 287 | - [ ] [Cracking the Coding Interview with Author Gayle Laakmann McDowell (video)](https://www.youtube.com/watch?v=aClxtDcdpsQ) 288 | - [ ] How to Get a Job at the Big 4: 289 | - [ ] ['How to Get a Job at the Big 4 - Amazon, Facebook, Google & Microsoft' (video)](https://www.youtube.com/watch?v=YJZCUhxNCv8) 290 | - [ ] [Failing at Google Interviews](http://alexbowe.com/failing-at-google-interviews/) 291 | 292 | ## Pick One Language for the Interview 293 | 294 | I wrote this short article about it: [Important: Pick One Language for the Google Interview](https://googleyasheck.com/important-pick-one-language-for-the-google-interview/) 295 | 296 | You can use a language you are comfortable in to do the coding part of the interview, but for Google, these are solid choices: 297 | 298 | - C++ 299 | - Java 300 | - Python 301 | 302 | You could also use these, but read around first. There may be caveats: 303 | 304 | - JavaScript 305 | - Ruby 306 | 307 | You need to be very comfortable in the language and be knowledgeable. 308 | 309 | Read more about choices: 310 | - http://www.byte-by-byte.com/choose-the-right-language-for-your-coding-interview/ 311 | - http://blog.codingforinterviews.com/best-programming-language-jobs/ 312 | - https://www.quora.com/What-is-the-best-language-to-program-in-for-an-in-person-Google-interview 313 | 314 | [See language resources here](programming-language-resources.md) 315 | 316 | You'll see some C, C++, and Python learning included below, because I'm learning. There are a few books involved, see the bottom. 317 | 318 | ## Book List 319 | 320 | This is a shorter list than what I used. This is abbreviated to save you time. 321 | 322 | ### Interview Prep 323 | 324 | - [ ] [Programming Interviews Exposed: Secrets to Landing Your Next Job, 2nd Edition](http://www.wiley.com/WileyCDA/WileyTitle/productCd-047012167X.html) 325 | - answers in C++ and Java 326 | - recommended in Google candidate coaching 327 | - this is a good warm-up for Cracking the Coding Interview 328 | - not too difficult, most problems may be easier than what you'll see in an interview (from what I've read) 329 | - [ ] [Cracking the Coding Interview, 6th Edition](http://www.amazon.com/Cracking-Coding-Interview-6th-Programming/dp/0984782850/) 330 | - answers in Java 331 | - recommended on the [Google Careers site](https://www.google.com/about/careers/how-we-hire/interview/) 332 | - If you see people reference "The Google Resume", it was a book replaced by "Cracking the Coding Interview". 333 | 334 | If you have tons of extra time: 335 | 336 | - [ ] [Elements of Programming Interviews](https://www.amazon.com/Elements-Programming-Interviews-Insiders-Guide/dp/1479274836) 337 | - all code is in C++, very good if you're looking to use C++ in your interview 338 | - a good book on problem solving in general. 339 | 340 | ### Computer Architecture 341 | 342 | If short on time: 343 | 344 | - [ ] [Write Great Code: Volume 1: Understanding the Machine](https://www.amazon.com/Write-Great-Code-Understanding-Machine/dp/1593270038) 345 | - The book was published in 2004, and is somewhat outdated, but it's a terrific resource for understanding a computer in brief. 346 | - The author invented HLA, so take mentions and examples in HLA with a grain of salt. Not widely used, but decent examples of what assembly looks like. 347 | - These chapters are worth the read to give you a nice foundation: 348 | - Chapter 2 - Numeric Representation 349 | - Chapter 3 - Binary Arithmetic and Bit Operations 350 | - Chapter 4 - Floating-Point Representation 351 | - Chapter 5 - Character Representation 352 | - Chapter 6 - Memory Organization and Access 353 | - Chapter 7 - Composite Data Types and Memory Objects 354 | - Chapter 9 - CPU Architecture 355 | - Chapter 10 - Instruction Set Architecture 356 | - Chapter 11 - Memory Architecture and Organization 357 | 358 | If you have more time (I want this book): 359 | 360 | - [ ] [Computer Architecture, Fifth Edition: A Quantitative Approach](https://www.amazon.com/dp/012383872X/) 361 | - For a richer, more up-to-date (2011), but longer treatment 362 | 363 | ### Language Specific 364 | 365 | **You need to choose a language for the interview (see above).** Here are my recommendations by language. I don't have resources for all languages. I welcome additions. 366 | 367 | If you read though one of these, you should have all the data structures and algorithms knowledge you'll need to start doing coding problems. 368 | **You can skip all the video lectures in this project**, unless you'd like a review. 369 | 370 | [Additional language-specific resources here.](programming-language-resources.md) 371 | 372 | ### C++ 373 | 374 | I haven't read these two, but they are highly rated and written by Sedgewick. He's awesome. 375 | 376 | - [ ] [Algorithms in C++, Parts 1-4: Fundamentals, Data Structure, Sorting, Searching](https://www.amazon.com/Algorithms-Parts-1-4-Fundamentals-Structure/dp/0201350882/) 377 | - [ ] [Algorithms in C++ Part 5: Graph Algorithms](https://www.amazon.com/Algorithms-Part-Graph-3rd-Pt-5/dp/0201361183/) 378 | 379 | If you have a better recommendation for C++, please let me know. Looking for a comprehensive resource. 380 | 381 | ### Java 382 | 383 | - [ ] [Algorithms (Sedgewick and Wayne)](https://www.amazon.com/Algorithms-4th-Robert-Sedgewick/dp/032157351X/) 384 | - videos with book content (and Sedgewick!): 385 | - [Algorithms I](https://www.youtube.com/user/algorithmscourses/playlists?view=50&sort=dd&shelf_id=2) 386 | - [Algorithms II](https://www.youtube.com/user/algorithmscourses/playlists?shelf_id=3&view=50&sort=dd) 387 | 388 | OR: 389 | 390 | - [ ] [Data Structures and Algorithms in Java](https://www.amazon.com/Data-Structures-Algorithms-Michael-Goodrich/dp/1118771338/) 391 | - by Goodrich, Tamassia, Goldwasser 392 | - used as optional text for CS intro course at UC Berkeley 393 | - see my book report on the Python version below. This book covers the same topics. 394 | 395 | ### Python 396 | 397 | - [ ] [Data Structures and Algorithms in Python](https://www.amazon.com/Structures-Algorithms-Python-Michael-Goodrich/dp/1118290275/) 398 | - by Goodrich, Tamassia, Goldwasser 399 | - I loved this book. It covered everything and more. 400 | - Pythonic code 401 | - my glowing book report: https://googleyasheck.com/book-report-data-structures-and-algorithms-in-python/ 402 | 403 | 404 | ### Optional Books 405 | 406 | **Some people recommend these, but I think it's going overboard, unless you have many years of software engineering experience and expect a much harder interview:** 407 | 408 | - [ ] [Algorithm Design Manual](http://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/dp/1849967202) (Skiena) 409 | - As a review and problem recognition 410 | - The algorithm catalog portion is well beyond the scope of difficulty you'll get in an interview. 411 | - This book has 2 parts: 412 | - class textbook on data structures and algorithms 413 | - pros: 414 | - is a good review as any algorithms textbook would be 415 | - nice stories from his experiences solving problems in industry and academia 416 | - code examples in C 417 | - cons: 418 | - can be as dense or impenetrable as CLRS, and in some cases, CLRS may be a better alternative for some subjects 419 | - chapters 7, 8, 9 can be painful to try to follow, as some items are not explained well or require more brain than I have 420 | - don't get me wrong: I like Skiena, his teaching style, and mannerisms, but I may not be Stony Brook material. 421 | - algorithm catalog: 422 | - this is the real reason you buy this book. 423 | - about to get to this part. Will update here once I've made my way through it. 424 | - To quote Yegge: "More than any other book it helped me understand just how astonishingly commonplace 425 | (and important) graph problems are – they should be part of every working programmer's toolkit. The book also 426 | covers basic data structures and sorting algorithms, which is a nice bonus. But the gold mine is the second half 427 | of the book, which is a sort of encyclopedia of 1-pagers on zillions of useful problems and various ways to solve 428 | them, without too much detail. Almost every 1-pager has a simple picture, making it easy to remember. This is a 429 | great way to learn how to identify hundreds of problem types." 430 | - Can rent it on kindle 431 | - Half.com is a great resource for textbooks at good prices. 432 | - Answers: 433 | - [Solutions](http://www.algorithm.cs.sunysb.edu/algowiki/index.php/The_Algorithms_Design_Manual_(Second_Edition)) 434 | - [Solutions](http://blog.panictank.net/category/algorithmndesignmanualsolutions/page/2/) 435 | - [Errata](http://www3.cs.stonybrook.edu/~skiena/algorist/book/errata) 436 | 437 | - [ ] [Introduction to Algorithms](https://www.amazon.com/Introduction-Algorithms-3rd-MIT-Press/dp/0262033844) 438 | - **Important:** Reading this book will only have limited value. This book is a great review of algorithms and data structures, but won't teach you how to write good code. You have to be able to code a decent solution efficiently. 439 | - To quote Yegge: "But if you want to come into your interviews *prepped*, then consider deferring your application until you've made your way through that book." 440 | - Half.com is a great resource for textbooks at good prices. 441 | - aka CLR, sometimes CLRS, because Stein was late to the game 442 | 443 | - [ ] [Programming Pearls](http://www.amazon.com/Programming-Pearls-2nd-Jon-Bentley/dp/0201657880) 444 | - The first couple of chapters present clever solutions to programming problems (some very old using data tape) but 445 | that is just an intro. This a guidebook on program design and architecture, much like Code Complete, but much shorter. 446 | 447 | - ~~"Algorithms and Programming: Problems and Solutions" by Shen~~ 448 | - A fine book, but after working through problems on several pages I got frustrated with the Pascal, do while loops, 1-indexed arrays, and unclear post-condition satisfaction results. 449 | - Would rather spend time on coding problems from another book or online coding problems. 450 | 451 | 452 | ## Before you Get Started 453 | 454 | This list grew over many months, and yes, it kind of got out of hand. 455 | 456 | Here are some mistakes I made so you'll have a better experience. 457 | 458 | ### 1. You Won't Remember it All 459 | 460 | I watched hours of videos and took copious notes, and months later there was much I didn't remember. I spent 3 days going 461 | through my notes and making flashcards so I could review. 462 | 463 | Read please so you won't make my mistakes: 464 | 465 | [Retaining Computer Science Knowledge](https://googleyasheck.com/retaining-computer-science-knowledge/) 466 | 467 | ### 2. Use Flashcards 468 | 469 | To solve the problem, I made a little flashcards site where I could add flashcards of 2 types: general and code. 470 | Each card has different formatting. 471 | 472 | I made a mobile-first website so I could review on my phone and tablet, wherever I am. 473 | 474 | Make your own for free: 475 | 476 | - [Flashcards site repo](https://github.com/jwasham/computer-science-flash-cards) 477 | - [My flash cards database](https://github.com/jwasham/computer-science-flash-cards/blob/master/cards-jwasham.db): Keep in mind I went overboard and have cards covering everything from assembly language and Python trivia to machine learning and statistics. It's way too much for what's required by Google. 478 | 479 | **Note on flashcards:** The first time you recognize you know the answer, don't mark it as known. You have to see the 480 | same card and answer it several times correctly before you really know it. Repetition will put that knowledge deeper in 481 | your brain. 482 | 483 | An alternative to using my flashcard site is [Anki](http://ankisrs.net/), which has been recommended to me numerous times. It uses a repetition system to help you remember. 484 | It's user-friendly, available on all platforms and has a cloud sync system. It costs $25 on iOS but is free on other platforms. 485 | 486 | My flashcard database in Anki format: https://ankiweb.net/shared/info/25173560 (thanks [@xiewenya](https://github.com/xiewenya)) 487 | 488 | ### 3. Review, review, review 489 | 490 | I keep a set of cheat sheets on ASCII, OSI stack, Big-O notations, and more. I study them when I have some spare time. 491 | 492 | Take a break from programming problems for a half hour and go through your flashcards. 493 | 494 | ### 4. Focus 495 | 496 | There are a lot of distractions that can take up valuable time. Focus and concentration are hard. 497 | 498 | ## What you won't see covered 499 | 500 | This big list all started as a personal to-do list made from Google interview coaching notes. These are prevalent 501 | technologies but were not mentioned in those notes: 502 | 503 | - SQL 504 | - Javascript 505 | - HTML, CSS, and other front-end technologies 506 | 507 | ## The Daily Plan 508 | 509 | Some subjects take one day, and some will take multiple days. Some are just learning with nothing to implement. 510 | 511 | Each day I take one subject from the list below, watch videos about that subject, and write an implementation in: 512 | - C - using structs and functions that take a struct * and something else as args. 513 | - C++ - without using built-in types 514 | - C++ - using built-in types, like STL's std::list for a linked list 515 | - Python - using built-in types (to keep practicing Python) 516 | - and write tests to ensure I'm doing it right, sometimes just using simple assert() statements 517 | - You may do Java or something else, this is just my thing. 518 | 519 | You don't need all these. You need only [one language for the interview](#pick-one-language-for-the-interview). 520 | 521 | Why code in all of these? 522 | - Practice, practice, practice, until I'm sick of it, and can do it with no problem (some have many edge cases and bookkeeping details to remember) 523 | - Work within the raw constraints (allocating/freeing memory without help of garbage collection (except Python)) 524 | - Make use of built-in types so I have experience using the built-in tools for real-world use (not going to write my own linked list implementation in production) 525 | 526 | I may not have time to do all of these for every subject, but I'll try. 527 | 528 | You can see my code here: 529 | - [C] (https://github.com/jwasham/practice-c) 530 | - [C++] (https://github.com/jwasham/practice-cpp) 531 | - [Python] (https://github.com/jwasham/practice-python) 532 | 533 | You don't need to memorize the guts of every algorithm. 534 | 535 | Write code on a whiteboard or paper, not a computer. Test with some sample inputs. Then test it out on a computer. 536 | 537 | ## Prerequisite Knowledge 538 | 539 | - [ ] **Learn C** 540 | - C is everywhere. You'll see examples in books, lectures, videos, *everywhere* while you're studying. 541 | - [ ] [C Programming Language, Vol 2](https://www.amazon.com/Programming-Language-Brian-W-Kernighan/dp/0131103628) 542 | - This is a short book, but it will give you a great handle on the C language and if you practice it a little 543 | you'll quickly get proficient. Understanding C helps you understand how programs and memory work. 544 | - [answers to questions](https://github.com/lekkas/c-algorithms) 545 | 546 | - [ ] **How computers process a program:** 547 | - [ ] [How does CPU execute program (video)](https://www.youtube.com/watch?v=42KTvGYQYnA) 548 | - [ ] [Machine Code Instructions (video)](https://www.youtube.com/watch?v=Mv2XQgpbTNE) 549 | 550 | ## Algorithmic complexity / Big-O / Asymptotic analysis 551 | - nothing to implement 552 | - [ ] [Harvard CS50 - Asymptotic Notation (video)](https://www.youtube.com/watch?v=iOq5kSKqeR4) 553 | - [ ] [Big O Notations (general quick tutorial) (video)](https://www.youtube.com/watch?v=V6mKVRU1evU) 554 | - [ ] [Big O Notation (and Omega and Theta) - best mathematical explanation (video)](https://www.youtube.com/watch?v=ei-A_wy5Yxw&index=2&list=PL1BaGV1cIH4UhkL8a9bJGG356covJ76qN) 555 | - [ ] Skiena: 556 | - [video](https://www.youtube.com/watch?v=gSyDMtdPNpU&index=2&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b) 557 | - [slides](http://www3.cs.stonybrook.edu/~algorith/video-lectures/2007/lecture2.pdf) 558 | - [ ] [A Gentle Introduction to Algorithm Complexity Analysis](http://discrete.gr/complexity/) 559 | - [ ] [Orders of Growth (video)](https://class.coursera.org/algorithmicthink1-004/lecture/59) 560 | - [ ] [Asymptotics (video)](https://class.coursera.org/algorithmicthink1-004/lecture/61) 561 | - [ ] [UC Berkeley Big O (video)](https://youtu.be/VIS4YDpuP98) 562 | - [ ] [UC Berkeley Big Omega (video)](https://youtu.be/ca3e7UVmeUc) 563 | - [ ] [Amortized Analysis (video)](https://www.youtube.com/watch?v=B3SpQZaAZP4&index=10&list=PL1BaGV1cIH4UhkL8a9bJGG356covJ76qN) 564 | - [ ] [Illustrating "Big O" (video)](https://class.coursera.org/algorithmicthink1-004/lecture/63) 565 | - [ ] TopCoder (includes recurrence relations and master theorem): 566 | - [Computational Complexity: Section 1](https://www.topcoder.com/community/data-science/data-science-tutorials/computational-complexity-section-1/) 567 | - [Computational Complexity: Section 2](https://www.topcoder.com/community/data-science/data-science-tutorials/computational-complexity-section-2/) 568 | - [ ] [Cheat sheet](http://bigocheatsheet.com/) 569 | 570 | 571 | If some of the lectures are too mathy, you can jump down to the bottom and 572 | watch the discrete mathematics videos to get the background knowledge. 573 | 574 | ## Data Structures 575 | 576 | - ### Arrays 577 | - Implement an automatically resizing vector. 578 | - [ ] Description: 579 | - [Arrays (video)](https://www.coursera.org/learn/data-structures/lecture/OsBSF/arrays) 580 | - [UCBerkley CS61B - Linear and Multi-Dim Arrays (video)](https://youtu.be/Wp8oiO_CZZE?t=15m32s) 581 | - [Basic Arrays (video)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Basic-arrays/149042/177104-4.html) 582 | - [Multi-dim (video)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Multidimensional-arrays/149042/177105-4.html) 583 | - [Dynamic Arrays (video)](https://www.coursera.org/learn/data-structures/lecture/EwbnV/dynamic-arrays) 584 | - [Jagged Arrays (video)](https://www.youtube.com/watch?v=1jtrQqYpt7g) 585 | - [Jagged Arrays (video)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Jagged-arrays/149042/177106-4.html) 586 | - [Resizing arrays (video)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Resizable-arrays/149042/177108-4.html) 587 | - [ ] Implement a vector (mutable array with automatic resizing): 588 | - [ ] Practice coding using arrays and pointers, and pointer math to jump to an index instead of using indexing. 589 | - [ ] new raw data array with allocated memory 590 | - can allocate int array under the hood, just not use its features 591 | - start with 16, or if starting number is greater, use power of 2 - 16, 32, 64, 128 592 | - [ ] size() - number of items 593 | - [ ] capacity() - number of items it can hold 594 | - [ ] is_empty() 595 | - [ ] at(index) - returns item at given index, blows up if index out of bounds 596 | - [ ] push(item) 597 | - [ ] insert(index, item) - inserts item at index, shifts that index's value and trailing elements to the right 598 | - [ ] prepend(item) - can use insert above at index 0 599 | - [ ] pop() - remove from end, return value 600 | - [ ] delete(index) - delete item at index, shifting all trailing elements left 601 | - [ ] remove(item) - looks for value and removes index holding it (even if in multiple places) 602 | - [ ] find(item) - looks for value and returns first index with that value, -1 if not found 603 | - [ ] resize(new_capacity) // private function 604 | - when you reach capacity, resize to double the size 605 | - when popping an item, if size is 1/4 of capacity, resize to half 606 | - [ ] Time 607 | - O(1) to add/remove at end (amortized for allocations for more space), index, or update 608 | - O(n) to insert/remove elsewhere 609 | - [ ] Space 610 | - contiguous in memory, so proximity helps performance 611 | - space needed = (array capacity, which is >= n) * size of item, but even if 2n, still O(n) 612 | 613 | - ### Linked Lists 614 | - [ ] Description: 615 | - [ ] [Singly Linked Lists (video)](https://www.coursera.org/learn/data-structures/lecture/kHhgK/singly-linked-lists) 616 | - [ ] [CS 61B - Linked Lists (video)](https://www.youtube.com/watch?v=sJtJOtXCW_M&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd&index=5) 617 | - [ ] [C Code (video)](https://www.youtube.com/watch?v=QN6FPiD0Gzo) 618 | - not the whole video, just portions about Node struct and memory allocation. 619 | - [ ] Linked List vs Arrays: 620 | - [Core Linked Lists Vs Arrays (video)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/rjBs9/core-linked-lists-vs-arrays) 621 | - [In The Real World Linked Lists Vs Arrays (video)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/QUaUd/in-the-real-world-lists-vs-arrays) 622 | - [ ] [why you should avoid linked lists (video)](https://www.youtube.com/watch?v=YQs6IC-vgmo) 623 | - [ ] Gotcha: you need pointer to pointer knowledge: 624 | (for when you pass a pointer to a function that may change the address where that pointer points) 625 | This page is just to get a grasp on ptr to ptr. I don't recommend this list traversal style. Readability and maintainability suffer due to cleverness. 626 | - [Pointers to Pointers](https://www.eskimo.com/~scs/cclass/int/sx8.html) 627 | - [ ] implement (I did with tail pointer & without): 628 | - [ ] size() - returns number of data elements in list 629 | - [ ] empty() - bool returns true if empty 630 | - [ ] value_at(index) - returns the value of the nth item (starting at 0 for first) 631 | - [ ] push_front(value) - adds an item to the front of the list 632 | - [ ] pop_front() - remove front item and return its value 633 | - [ ] push_back(value) - adds an item at the end 634 | - [ ] pop_back() - removes end item and returns its value 635 | - [ ] front() - get value of front item 636 | - [ ] back() - get value of end item 637 | - [ ] insert(index, value) - insert value at index, so current item at that index is pointed to by new item at index 638 | - [ ] erase(index) - removes node at given index 639 | - [ ] value_n_from_end(n) - returns the value of the node at nth position from the end of the list 640 | - [ ] reverse() - reverses the list 641 | - [ ] remove_value(value) - removes the first item in the list with this value 642 | - [ ] Doubly-linked List 643 | - [Description (video)](https://www.coursera.org/learn/data-structures/lecture/jpGKD/doubly-linked-lists) 644 | - No need to implement 645 | 646 | - ### Stack 647 | - [ ] [Stacks (video)](https://www.coursera.org/learn/data-structures/lecture/UdKzQ/stacks) 648 | - [ ] [Using Stacks Last-In First-Out (video)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Using-stacks-last-first-out/149042/177120-4.html) 649 | - [ ] Will not implement. Implementing with array is trivial. 650 | 651 | - ### Queue 652 | - [ ] [Using Queues First-In First-Out(video)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Using-queues-first-first-out/149042/177122-4.html) 653 | - [ ] [Queue (video)](https://www.coursera.org/learn/data-structures/lecture/EShpq/queue) 654 | - [ ] [Circular buffer/FIFO](https://en.wikipedia.org/wiki/Circular_buffer) 655 | - [ ] [Priority Queues (video)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Priority-queues-deques/149042/177123-4.html) 656 | - [ ] Implement using linked-list, with tail pointer: 657 | - enqueue(value) - adds value at position at tail 658 | - dequeue() - returns value and removes least recently added element (front) 659 | - empty() 660 | - [ ] Implement using fixed-sized array: 661 | - enqueue(value) - adds item at end of available storage 662 | - dequeue() - returns value and removes least recently added element 663 | - empty() 664 | - full() 665 | - [ ] Cost: 666 | - a bad implementation using linked list where you enqueue at head and dequeue at tail would be O(n) 667 | because you'd need the next to last element, causing a full traversal each dequeue 668 | - enqueue: O(1) (amortized, linked list and array [probing]) 669 | - dequeue: O(1) (linked list and array) 670 | - empty: O(1) (linked list and array) 671 | 672 | - ### Hash table 673 | - [ ] Videos: 674 | - [ ] [Hashing with Chaining (video)](https://www.youtube.com/watch?v=0M_kIqhwbFo&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=8) 675 | - [ ] [Table Doubling, Karp-Rabin (video)](https://www.youtube.com/watch?v=BRO7mVIFt08&index=9&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb) 676 | - [ ] [Open Addressing, Cryptographic Hashing (video)](https://www.youtube.com/watch?v=rvdJDijO2Ro&index=10&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb) 677 | - [ ] [PyCon 2010: The Mighty Dictionary (video)](https://www.youtube.com/watch?v=C4Kc8xzcA68) 678 | - [ ] [(Advanced) Randomization: Universal & Perfect Hashing (video)](https://www.youtube.com/watch?v=z0lJ2k0sl1g&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=11) 679 | - [ ] [(Advanced) Perfect hashing (video)](https://www.youtube.com/watch?v=N0COwN14gt0&list=PL2B4EEwhKD-NbwZ4ezj7gyc_3yNrojKM9&index=4) 680 | 681 | - [ ] Online Courses: 682 | - [ ] [Understanding Hash Functions (video)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Understanding-hash-functions/149042/177126-4.html) 683 | - [ ] [Using Hash Tables (video)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Using-hash-tables/149042/177127-4.html) 684 | - [ ] [Supporting Hashing (video)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Supporting-hashing/149042/177128-4.html) 685 | - [ ] [Language Support Hash Tables (video)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Language-support-hash-tables/149042/177129-4.html) 686 | - [ ] [Core Hash Tables (video)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/m7UuP/core-hash-tables) 687 | - [ ] [Data Structures (video)](https://www.coursera.org/learn/data-structures/home/week/3) 688 | - [ ] [Phone Book Problem (video)](https://www.coursera.org/learn/data-structures/lecture/NYZZP/phone-book-problem) 689 | - [ ] distributed hash tables: 690 | - [Instant Uploads And Storage Optimization In Dropbox (video)](https://www.coursera.org/learn/data-structures/lecture/DvaIb/instant-uploads-and-storage-optimization-in-dropbox) 691 | - [Distributed Hash Tables (video)](https://www.coursera.org/learn/data-structures/lecture/tvH8H/distributed-hash-tables) 692 | 693 | - [ ] implement with array using linear probing 694 | - hash(k, m) - m is size of hash table 695 | - add(key, value) - if key already exists, update value 696 | - exists(key) 697 | - get(key) 698 | - remove(key) 699 | 700 | ## More Knowledge 701 | 702 | - ### Binary search 703 | - [ ] [Binary Search (video)](https://www.youtube.com/watch?v=D5SrAga1pno) 704 | - [ ] [Binary Search (video)](https://www.khanacademy.org/computing/computer-science/algorithms/binary-search/a/binary-search) 705 | - [ ] [detail](https://www.topcoder.com/community/data-science/data-science-tutorials/binary-search/) 706 | - [ ] Implement: 707 | - binary search (on sorted array of integers) 708 | - binary search using recursion 709 | 710 | - ### Bitwise operations 711 | - [ ] [Bits cheat sheet](https://github.com/jwasham/google-interview-university/blob/master/extras/cheat%20sheets/bits-cheat-cheet.pdf) - you should know many of the powers of 2 from (2^1 to 2^16 and 2^32) 712 | - [ ] Get a really good understanding of manipulating bits with: &, |, ^, ~, >>, << 713 | - [ ] [words](https://en.wikipedia.org/wiki/Word_(computer_architecture)) 714 | - [ ] Good intro: 715 | [Bit Manipulation (video)](https://www.youtube.com/watch?v=7jkIUgLC29I) 716 | - [ ] [C Programming Tutorial 2-10: Bitwise Operators (video)](https://www.youtube.com/watch?v=d0AwjSpNXR0) 717 | - [ ] [Bit Manipulation](https://en.wikipedia.org/wiki/Bit_manipulation) 718 | - [ ] [Bitwise Operation](https://en.wikipedia.org/wiki/Bitwise_operation) 719 | - [ ] [Bithacks](https://graphics.stanford.edu/~seander/bithacks.html) 720 | - [ ] [The Bit Twiddler](http://bits.stephan-brumme.com/) 721 | - [ ] [The Bit Twiddler Interactive](http://bits.stephan-brumme.com/interactive.html) 722 | - [ ] 2s and 1s complement 723 | - [Binary: Plusses & Minuses (Why We Use Two's Complement) (video)](https://www.youtube.com/watch?v=lKTsv6iVxV4) 724 | - [1s Complement](https://en.wikipedia.org/wiki/Ones%27_complement) 725 | - [2s Complement](https://en.wikipedia.org/wiki/Two%27s_complement) 726 | - [ ] count set bits 727 | - [4 ways to count bits in a byte (video)](https://youtu.be/Hzuzo9NJrlc) 728 | - [Count Bits](https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan) 729 | - [How To Count The Number Of Set Bits In a 32 Bit Integer](http://stackoverflow.com/questions/109023/how-to-count-the-number-of-set-bits-in-a-32-bit-integer) 730 | - [ ] round to next power of 2: 731 | - [Round Up To Next Power Of Two](http://bits.stephan-brumme.com/roundUpToNextPowerOfTwo.html) 732 | - [ ] swap values: 733 | - [Swap](http://bits.stephan-brumme.com/swap.html) 734 | - [ ] absolute value: 735 | - [Absolute Integer](http://bits.stephan-brumme.com/absInteger.html) 736 | 737 | ## Trees 738 | 739 | - ### Trees - Notes & Background 740 | - [ ] [Series: Core Trees (video)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/ovovP/core-trees) 741 | - [ ] [Series: Trees (video)](https://www.coursera.org/learn/data-structures/lecture/95qda/trees) 742 | - basic tree construction 743 | - traversal 744 | - manipulation algorithms 745 | - BFS (breadth-first search) 746 | - [MIT (video)](https://www.youtube.com/watch?v=s-CYnVz-uh4&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=13) 747 | - level order (BFS, using queue) 748 | time complexity: O(n) 749 | space complexity: best: O(1), worst: O(n/2)=O(n) 750 | - DFS (depth-first search) 751 | - [MIT (video)](https://www.youtube.com/watch?v=AfSk24UTFS8&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=14) 752 | - notes: 753 | time complexity: O(n) 754 | space complexity: 755 | best: O(log n) - avg. height of tree 756 | worst: O(n) 757 | - inorder (DFS: left, self, right) 758 | - postorder (DFS: left, right, self) 759 | - preorder (DFS: self, left, right) 760 | 761 | - ### Binary search trees: BSTs 762 | - [ ] [Binary Search Tree Review (video)](https://www.youtube.com/watch?v=x6At0nzX92o&index=1&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6) 763 | - [ ] [Series (video)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/p82sw/core-introduction-to-binary-search-trees) 764 | - starts with symbol table and goes through BST applications 765 | - [ ] [Introduction (video)](https://www.coursera.org/learn/data-structures/lecture/E7cXP/introduction) 766 | - [ ] [MIT (video)](https://www.youtube.com/watch?v=9Jry5-82I68) 767 | - C/C++: 768 | - [ ] [Binary search tree - Implementation in C/C++ (video)](https://www.youtube.com/watch?v=COZK7NATh4k&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P&index=28) 769 | - [ ] [BST implementation - memory allocation in stack and heap (video)](https://www.youtube.com/watch?v=hWokyBoo0aI&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P&index=29) 770 | - [ ] [Find min and max element in a binary search tree (video)](https://www.youtube.com/watch?v=Ut90klNN264&index=30&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P) 771 | - [ ] [Find height of a binary tree (video)](https://www.youtube.com/watch?v=_pnqMz5nrRs&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P&index=31) 772 | - [ ] [Binary tree traversal - breadth-first and depth-first strategies (video)](https://www.youtube.com/watch?v=9RHO6jU--GU&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P&index=32) 773 | - [ ] [Binary tree: Level Order Traversal (video)](https://www.youtube.com/watch?v=86g8jAQug04&index=33&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P) 774 | - [ ] [Binary tree traversal: Preorder, Inorder, Postorder (video)](https://www.youtube.com/watch?v=gm8DUJJhmY4&index=34&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P) 775 | - [ ] [Check if a binary tree is binary search tree or not (video)](https://www.youtube.com/watch?v=yEwSGhSsT0U&index=35&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P) 776 | - [ ] [Delete a node from Binary Search Tree (video)](https://www.youtube.com/watch?v=gcULXE7ViZw&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P&index=36) 777 | - [ ] [Inorder Successor in a binary search tree (video)](https://www.youtube.com/watch?v=5cPbNCrdotA&index=37&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P) 778 | - [ ] Implement: 779 | - [ ] insert // insert value into tree 780 | - [ ] get_node_count // get count of values stored 781 | - [ ] print_values // prints the values in the tree, from min to max 782 | - [ ] delete_tree 783 | - [ ] is_in_tree // returns true if given value exists in the tree 784 | - [ ] get_height // returns the height in nodes (single node's height is 1) 785 | - [ ] get_min // returns the minimum value stored in the tree 786 | - [ ] get_max // returns the maximum value stored in the tree 787 | - [ ] is_binary_search_tree 788 | - [ ] delete_value 789 | - [ ] get_successor // returns next-highest value in tree after given value, -1 if none 790 | 791 | - ### Heap / Priority Queue / Binary Heap 792 | - visualized as a tree, but is usually linear in storage (array, linked list) 793 | - [ ] [Heap](https://en.wikipedia.org/wiki/Heap_(data_structure)) 794 | - [ ] [Introduction (video)](https://www.coursera.org/learn/data-structures/lecture/2OpTs/introduction) 795 | - [ ] [Naive Implementations (video)](https://www.coursera.org/learn/data-structures/lecture/z3l9N/naive-implementations) 796 | - [ ] [Binary Trees (video)](https://www.coursera.org/learn/data-structures/lecture/GRV2q/binary-trees) 797 | - [ ] [Tree Height Remark (video)](https://www.coursera.org/learn/data-structures/supplement/S5xxz/tree-height-remark) 798 | - [ ] [Basic Operations (video)](https://www.coursera.org/learn/data-structures/lecture/0g1dl/basic-operations) 799 | - [ ] [Complete Binary Trees (video)](https://www.coursera.org/learn/data-structures/lecture/gl5Ni/complete-binary-trees) 800 | - [ ] [Pseudocode (video)](https://www.coursera.org/learn/data-structures/lecture/HxQo9/pseudocode) 801 | - [ ] [Heap Sort - jumps to start (video)](https://youtu.be/odNJmw5TOEE?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=3291) 802 | - [ ] [Heap Sort (video)](https://www.coursera.org/learn/data-structures/lecture/hSzMO/heap-sort) 803 | - [ ] [Building a heap (video)](https://www.coursera.org/learn/data-structures/lecture/dwrOS/building-a-heap) 804 | - [ ] [MIT: Heaps and Heap Sort (video)](https://www.youtube.com/watch?v=B7hVxCmfPtM&index=4&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb) 805 | - [ ] [CS 61B Lecture 24: Priority Queues (video)](https://www.youtube.com/watch?v=yIUFT6AKBGE&index=24&list=PL4BBB74C7D2A1049C) 806 | - [ ] [Linear Time BuildHeap (max-heap)](https://www.youtube.com/watch?v=MiyLo8adrWw) 807 | - [ ] Implement a max-heap: 808 | - [ ] insert 809 | - [ ] sift_up - needed for insert 810 | - [ ] get_max - returns the max item, without removing it 811 | - [ ] get_size() - return number of elements stored 812 | - [ ] is_empty() - returns true if heap contains no elements 813 | - [ ] extract_max - returns the max item, removing it 814 | - [ ] sift_down - needed for extract_max 815 | - [ ] remove(i) - removes item at index x 816 | - [ ] heapify - create a heap from an array of elements, needed for heap_sort 817 | - [ ] heap_sort() - take an unsorted array and turn it into a sorted array in-place using a max heap 818 | - note: using a min heap instead would save operations, but double the space needed (cannot do in-place). 819 | 820 | ## Sorting 821 | 822 | - [ ] Notes: 823 | - Implement sorts & know best case/worst case, average complexity of each: 824 | - no bubble sort - it's terrible - O(n^2), except when n <= 16 825 | - [ ] stability in sorting algorithms ("Is Quicksort stable?") 826 | - [Sorting Algorithm Stability](https://en.wikipedia.org/wiki/Sorting_algorithm#Stability) 827 | - [Stability In Sorting Algorithms](http://stackoverflow.com/questions/1517793/stability-in-sorting-algorithms) 828 | - [Stability In Sorting Algorithms](http://www.geeksforgeeks.org/stability-in-sorting-algorithms/) 829 | - [Sorting Algorithms - Stability](http://homepages.math.uic.edu/~leon/cs-mcs401-s08/handouts/stability.pdf) 830 | - [ ] Which algorithms can be used on linked lists? Which on arrays? Which on both? 831 | - I wouldn't recommend sorting a linked list, but merge sort is doable. 832 | - [Merge Sort For Linked List](http://www.geeksforgeeks.org/merge-sort-for-linked-list/) 833 | 834 | - For heapsort, see Heap data structure above. Heap sort is great, but not stable. 835 | 836 | - [ ] [Sedgewick - Mergesort (5 videos)](https://www.youtube.com/watch?v=4nKwesx_c8E&list=PLe-ggMe31CTeunC6GZHFBmQx7EKtjbGf9) 837 | - [ ] [1. Mergesort](https://www.youtube.com/watch?v=4nKwesx_c8E&list=PLe-ggMe31CTeunC6GZHFBmQx7EKtjbGf9&index=1) 838 | - [ ] [2. Bottom up Mergesort](https://www.youtube.com/watch?v=HGOIGUYjeyk&list=PLe-ggMe31CTeunC6GZHFBmQx7EKtjbGf9&index=2) 839 | - [ ] [3. Sorting Complexity](https://www.youtube.com/watch?v=WvU_mIWo0Ac&index=3&list=PLe-ggMe31CTeunC6GZHFBmQx7EKtjbGf9) 840 | - [ ] [4. Comparators](https://www.youtube.com/watch?v=7MvC1kmBza0&index=4&list=PLe-ggMe31CTeunC6GZHFBmQx7EKtjbGf9) 841 | - [ ] [5. Stability](https://www.youtube.com/watch?v=XD_5iINB5GI&index=5&list=PLe-ggMe31CTeunC6GZHFBmQx7EKtjbGf9) 842 | 843 | - [ ] [Sedgewick - Quicksort (4 videos)](https://www.youtube.com/playlist?list=PLe-ggMe31CTeE3x2-nF1-toca1QpuXwE1) 844 | - [ ] [1. Quicksort](https://www.youtube.com/watch?v=5M5A7qPWk84&index=1&list=PLe-ggMe31CTeE3x2-nF1-toca1QpuXwE1) 845 | - [ ] [2. Selection](https://www.youtube.com/watch?v=CgVYfSyct_M&index=2&list=PLe-ggMe31CTeE3x2-nF1-toca1QpuXwE1) 846 | - [ ] [3. Duplicate Keys](https://www.youtube.com/watch?v=WBFzOYJ5ybM&index=3&list=PLe-ggMe31CTeE3x2-nF1-toca1QpuXwE1) 847 | - [ ] [4. System Sorts](https://www.youtube.com/watch?v=rejpZ2htBjE&index=4&list=PLe-ggMe31CTeE3x2-nF1-toca1QpuXwE1) 848 | 849 | - [ ] UC Berkeley: 850 | - [ ] [CS 61B Lecture 29: Sorting I (video)](https://www.youtube.com/watch?v=EiUvYS2DT6I&list=PL4BBB74C7D2A1049C&index=29) 851 | - [ ] [CS 61B Lecture 30: Sorting II (video)](https://www.youtube.com/watch?v=2hTY3t80Qsk&list=PL4BBB74C7D2A1049C&index=30) 852 | - [ ] [CS 61B Lecture 32: Sorting III (video)](https://www.youtube.com/watch?v=Y6LOLpxg6Dc&index=32&list=PL4BBB74C7D2A1049C) 853 | - [ ] [CS 61B Lecture 33: Sorting V (video)](https://www.youtube.com/watch?v=qNMQ4ly43p4&index=33&list=PL4BBB74C7D2A1049C) 854 | 855 | - [ ] [Bubble Sort (video)](https://www.youtube.com/watch?v=P00xJgWzz2c&index=1&list=PL89B61F78B552C1AB) 856 | - [ ] [Analyzing Bubble Sort (video)](https://www.youtube.com/watch?v=ni_zk257Nqo&index=7&list=PL89B61F78B552C1AB) 857 | - [ ] [Insertion Sort, Merge Sort (video)](https://www.youtube.com/watch?v=Kg4bqzAqRBM&index=3&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb) 858 | - [ ] [Insertion Sort (video)](https://www.youtube.com/watch?v=c4BRHC7kTaQ&index=2&list=PL89B61F78B552C1AB) 859 | - [ ] [Merge Sort (video)](https://www.youtube.com/watch?v=GCae1WNvnZM&index=3&list=PL89B61F78B552C1AB) 860 | - [ ] [Quicksort (video)](https://www.youtube.com/watch?v=y_G9BkAm6B8&index=4&list=PL89B61F78B552C1AB) 861 | - [ ] [Selection Sort (video)](https://www.youtube.com/watch?v=6nDMgr0-Yyo&index=8&list=PL89B61F78B552C1AB) 862 | 863 | - [ ] Merge sort code: 864 | - [ ] [Using output array (C)](http://www.cs.yale.edu/homes/aspnes/classes/223/examples/sorting/mergesort.c) 865 | - [ ] [Using output array (Python)](https://github.com/jwasham/practice-python/blob/master/merge_sort/merge_sort.py) 866 | - [ ] [In-place (C++)](https://github.com/jwasham/practice-cpp/blob/master/merge_sort/merge_sort.cc) 867 | - [ ] Quick sort code: 868 | - [ ] [Implementation (C)](http://www.cs.yale.edu/homes/aspnes/classes/223/examples/randomization/quick.c) 869 | - [ ] [Implementation (C)](https://github.com/jwasham/practice-c/blob/master/quick_sort/quick_sort.c) 870 | - [ ] [Implementation (Python)](https://github.com/jwasham/practice-python/blob/master/quick_sort/quick_sort.py) 871 | 872 | - [ ] Implement: 873 | - [ ] Mergesort: O(n log n) average and worst case 874 | - [ ] Quicksort O(n log n) average case 875 | - Selection sort and insertion sort are both O(n^2) average and worst case 876 | - For heapsort, see Heap data structure above. 877 | 878 | - [ ] Not required, but I recommended them: 879 | - [ ] [Sedgewick - Radix Sorts (6 videos)](https://www.youtube.com/playlist?list=PLe-ggMe31CTcNvUX9E3tQeM6ntrdR8e53) 880 | - [ ] [1. Strings in Java](https://www.youtube.com/watch?v=zRzU-FWsjNU&list=PLe-ggMe31CTcNvUX9E3tQeM6ntrdR8e53&index=6) 881 | - [ ] [2. Key Indexed Counting](https://www.youtube.com/watch?v=CtgKYmXs62w&list=PLe-ggMe31CTcNvUX9E3tQeM6ntrdR8e53&index=5) 882 | - [ ] [3. Least Significant Digit First String Radix Sort](https://www.youtube.com/watch?v=2pGVq_BwPKs&list=PLe-ggMe31CTcNvUX9E3tQeM6ntrdR8e53&index=4) 883 | - [ ] [4. Most Significant Digit First String Radix Sort](https://www.youtube.com/watch?v=M3cYNY90R6c&index=3&list=PLe-ggMe31CTcNvUX9E3tQeM6ntrdR8e53) 884 | - [ ] [5. 3 Way Radix Quicksort](https://www.youtube.com/watch?v=YVl58kfE6i8&index=2&list=PLe-ggMe31CTcNvUX9E3tQeM6ntrdR8e53) 885 | - [ ] [6. Suffix Arrays](https://www.youtube.com/watch?v=HKPrVm5FWvg&list=PLe-ggMe31CTcNvUX9E3tQeM6ntrdR8e53&index=1) 886 | - [ ] [Radix Sort](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#radixSort) 887 | - [ ] [Radix Sort (video)](https://www.youtube.com/watch?v=xhr26ia4k38) 888 | - [ ] [Radix Sort, Counting Sort (linear time given constraints) (video)](https://www.youtube.com/watch?v=Nz1KZXbghj8&index=7&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb) 889 | - [ ] [Randomization: Matrix Multiply, Quicksort, Freivalds' algorithm (video)](https://www.youtube.com/watch?v=cNB2lADK3_s&index=8&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp) 890 | - [ ] [Sorting in Linear Time (video)](https://www.youtube.com/watch?v=pOKy3RZbSws&list=PLUl4u3cNGP61hsJNdULdudlRL493b-XZf&index=14) 891 | 892 | If you need more detail on this subject, see "Sorting" section in [Additional Detail on Some Subjects](#additional-detail-on-some-subjects) 893 | 894 | ## Graphs 895 | 896 | Graphs can be used to represent many problems in computer science, so this section is long, like trees and sorting were. 897 | 898 | - Notes from Yegge: 899 | - There are three basic ways to represent a graph in memory: 900 | - objects and pointers 901 | - matrix 902 | - adjacency list 903 | - Familiarize yourself with each representation and its pros & cons 904 | - BFS and DFS - know their computational complexity, their tradeoffs, and how to implement them in real code 905 | - When asked a question, look for a graph-based solution first, then move on if none. 906 | 907 | - [ ] Skiena Lectures - great intro: 908 | - [ ] [CSE373 2012 - Lecture 11 - Graph Data Structures (video)](https://www.youtube.com/watch?v=OiXxhDrFruw&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=11) 909 | - [ ] [CSE373 2012 - Lecture 12 - Breadth-First Search (video)](https://www.youtube.com/watch?v=g5vF8jscteo&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=12) 910 | - [ ] [CSE373 2012 - Lecture 13 - Graph Algorithms (video)](https://www.youtube.com/watch?v=S23W6eTcqdY&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=13) 911 | - [ ] [CSE373 2012 - Lecture 14 - Graph Algorithms (con't) (video)](https://www.youtube.com/watch?v=WitPBKGV0HY&index=14&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b) 912 | - [ ] [CSE373 2012 - Lecture 15 - Graph Algorithms (con't 2) (video)](https://www.youtube.com/watch?v=ia1L30l7OIg&index=15&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b) 913 | - [ ] [CSE373 2012 - Lecture 16 - Graph Algorithms (con't 3) (video)](https://www.youtube.com/watch?v=jgDOQq6iWy8&index=16&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b) 914 | 915 | - [ ] Graphs (review and more): 916 | 917 | - [ ] [6.006 Single-Source Shortest Paths Problem (video)](https://www.youtube.com/watch?v=Aa2sqUhIn-E&index=15&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb) 918 | - [ ] [6.006 Dijkstra (video)](https://www.youtube.com/watch?v=2E7MmKv0Y24&index=16&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb) 919 | - [ ] [6.006 Bellman-Ford (video)](https://www.youtube.com/watch?v=ozsuci5pIso&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=17) 920 | - [ ] [6.006 Speeding Up Dijkstra (video)](https://www.youtube.com/watch?v=CHvQ3q_gJ7E&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=18) 921 | - [ ] [Aduni: Graph Algorithms I - Topological Sorting, Minimum Spanning Trees, Prim's Algorithm - Lecture 6 (video)]( https://www.youtube.com/watch?v=i_AQT_XfvD8&index=6&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm) 922 | - [ ] [Aduni: Graph Algorithms II - DFS, BFS, Kruskal's Algorithm, Union Find Data Structure - Lecture 7 (video)]( https://www.youtube.com/watch?v=ufj5_bppBsA&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=7) 923 | - [ ] [Aduni: Graph Algorithms III: Shortest Path - Lecture 8 (video)](https://www.youtube.com/watch?v=DiedsPsMKXc&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=8) 924 | - [ ] [Aduni: Graph Alg. IV: Intro to geometric algorithms - Lecture 9 (video)](https://www.youtube.com/watch?v=XIAQRlNkJAw&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=9) 925 | - [ ] [CS 61B 2014 (starting at 58:09) (video)](https://youtu.be/dgjX4HdMI-Q?list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd&t=3489) 926 | - [ ] [CS 61B 2014: Weighted graphs (video)](https://www.youtube.com/watch?v=aJjlQCFwylA&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd&index=19) 927 | - [ ] [Greedy Algorithms: Minimum Spanning Tree (video)](https://www.youtube.com/watch?v=tKwnms5iRBU&index=16&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp) 928 | - [ ] [Strongly Connected Components Kosaraju's Algorithm Graph Algorithm (video)](https://www.youtube.com/watch?v=RpgcYiky7uw) 929 | 930 | - Full Coursera Course: 931 | - [ ] [Algorithms on Graphs (video)](https://www.coursera.org/learn/algorithms-on-graphs/home/welcome) 932 | 933 | - Yegge: If you get a chance, try to study up on fancier algorithms: 934 | - [ ] Dijkstra's algorithm - see above - 6.006 935 | - [ ] A* 936 | - [ ] [A Search Algorithm](https://en.wikipedia.org/wiki/A*_search_algorithm) 937 | - [ ] [A* Pathfinding Tutorial (video)](https://www.youtube.com/watch?v=KNXfSOx4eEE) 938 | - [ ] [A* Pathfinding (E01: algorithm explanation) (video)](https://www.youtube.com/watch?v=-L-WgKMFuhE) 939 | 940 | - I'll implement: 941 | - [ ] DFS with adjacency list (recursive) 942 | - [ ] DFS with adjacency list (iterative with stack) 943 | - [ ] DFS with adjacency matrix (recursive) 944 | - [ ] DFS with adjacency matrix (iterative with stack) 945 | - [ ] BFS with adjacency list 946 | - [ ] BFS with adjacency matrix 947 | - [ ] single-source shortest path (Dijkstra) 948 | - [ ] minimum spanning tree 949 | - DFS-based algorithms (see Aduni videos above): 950 | - [ ] check for cycle (needed for topological sort, since we'll check for cycle before starting) 951 | - [ ] topological sort 952 | - [ ] count connected components in a graph 953 | - [ ] list strongly connected components 954 | - [ ] check for bipartite graph 955 | 956 | You'll get more graph practice in Skiena's book (see Books section below) and the interview books 957 | 958 | ## Even More Knowledge 959 | 960 | - ### Recursion 961 | - [ ] Stanford lectures on recursion & backtracking: 962 | - [ ] [Lecture 8 | Programming Abstractions (video)](https://www.youtube.com/watch?v=gl3emqCuueQ&list=PLFE6E58F856038C69&index=8) 963 | - [ ] [Lecture 9 | Programming Abstractions (video)](https://www.youtube.com/watch?v=uFJhEPrbycQ&list=PLFE6E58F856038C69&index=9) 964 | - [ ] [Lecture 10 | Programming Abstractions (video)](https://www.youtube.com/watch?v=NdF1QDTRkck&index=10&list=PLFE6E58F856038C69) 965 | - [ ] [Lecture 11 | Programming Abstractions (video)](https://www.youtube.com/watch?v=p-gpaIGRCQI&list=PLFE6E58F856038C69&index=11) 966 | - when it is appropriate to use it 967 | - how is tail recursion better than not? 968 | - [ ] [What Is Tail Recursion Why Is It So Bad?](https://www.quora.com/What-is-tail-recursion-Why-is-it-so-bad) 969 | - [ ] [Tail Recursion (video)](https://www.youtube.com/watch?v=L1jjXGfxozc) 970 | 971 | - ### Object-Oriented Programming 972 | - [ ] [Optional: UML 2.0 Series (video)](https://www.youtube.com/watch?v=OkC7HKtiZC0&list=PLGLfVvz_LVvQ5G-LdJ8RLqe-ndo7QITYc) 973 | - [ ] Object-Oriented Software Engineering: Software Dev Using UML and Java (21 videos): 974 | - Can skip this if you have a great grasp of OO and OO design practices. 975 | - [OOSE: Software Dev Using UML and Java](https://www.youtube.com/playlist?list=PLJ9pm_Rc9HesnkwKlal_buSIHA-jTZMpO) 976 | - [ ] SOLID OOP Principles: 977 | - [ ] [Bob Martin SOLID Principles of Object Oriented and Agile Design (video)](https://www.youtube.com/watch?v=TMuno5RZNeE) 978 | - [ ] [SOLID Design Patterns in C# (video)](https://www.youtube.com/playlist?list=PL8m4NUhTQU48oiGCSgCP1FiJEcg_xJzyQ) 979 | - [ ] [SOLID Principles (video)](https://www.youtube.com/playlist?list=PL4CE9F710017EA77A) 980 | - [ ] S - [Single Responsibility Principle](http://www.oodesign.com/single-responsibility-principle.html) | [Single responsibility to each Object](http://www.javacodegeeks.com/2011/11/solid-single-responsibility-principle.html) 981 | - [more flavor](https://docs.google.com/open?id=0ByOwmqah_nuGNHEtcU5OekdDMkk) 982 | - [ ] O - [Open/Closed Principal](http://www.oodesign.com/open-close-principle.html) | [On production level Objects are ready for extension for not for modification](https://en.wikipedia.org/wiki/Open/closed_principle) 983 | - [more flavor](http://docs.google.com/a/cleancoder.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BwhCYaYDn8EgN2M5MTkwM2EtNWFkZC00ZTI3LWFjZTUtNTFhZGZiYmUzODc1&hl=en) 984 | - [ ] L - [Liskov Substitution Principal](http://www.oodesign.com/liskov-s-substitution-principle.html) | [Base Class and Derived class follow ‘IS A’ principal](http://stackoverflow.com/questions/56860/what-is-the-liskov-substitution-principle) 985 | - [more flavor](http://docs.google.com/a/cleancoder.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BwhCYaYDn8EgNzAzZjA5ZmItNjU3NS00MzQ5LTkwYjMtMDJhNDU5ZTM0MTlh&hl=en) 986 | - [ ] I - [Interface segregation principle](http://www.oodesign.com/interface-segregation-principle.html) | clients should not be forced to implement interfaces they don't use 987 | - [Interface Segregation Principle in 5 minutes (video)](https://www.youtube.com/watch?v=3CtAfl7aXAQ) 988 | - [more flavor](http://docs.google.com/a/cleancoder.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BwhCYaYDn8EgOTViYjJhYzMtMzYxMC00MzFjLWJjMzYtOGJiMDc5N2JkYmJi&hl=en) 989 | - [ ] D -[Dependency Inversion principle](http://www.oodesign.com/dependency-inversion-principle.html) | Reduce the dependency In composition of objects. 990 | - [Why Is The Dependency Inversion Principle And Why Is It Important](http://stackoverflow.com/questions/62539/what-is-the-dependency-inversion-principle-and-why-is-it-important) 991 | - [more flavor](http://docs.google.com/a/cleancoder.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BwhCYaYDn8EgMjdlMWIzNGUtZTQ0NC00ZjQ5LTkwYzQtZjRhMDRlNTQ3ZGMz&hl=en) 992 | 993 | - ### Design patterns 994 | - [ ] [Quick UML review (video)](https://www.youtube.com/watch?v=3cmzqZzwNDM&list=PLGLfVvz_LVvQ5G-LdJ8RLqe-ndo7QITYc&index=3) 995 | - [ ] Learn these patterns: 996 | - [ ] strategy 997 | - [ ] singleton 998 | - [ ] adapter 999 | - [ ] prototype 1000 | - [ ] decorator 1001 | - [ ] visitor 1002 | - [ ] factory, abstract factory 1003 | - [ ] facade 1004 | - [ ] observer 1005 | - [ ] proxy 1006 | - [ ] delegate 1007 | - [ ] command 1008 | - [ ] state 1009 | - [ ] memento 1010 | - [ ] iterator 1011 | - [ ] composite 1012 | - [ ] flyweight 1013 | - [ ] [Chapter 6 (Part 1) - Patterns (video)](https://youtu.be/LAP2A80Ajrg?list=PLJ9pm_Rc9HesnkwKlal_buSIHA-jTZMpO&t=3344) 1014 | - [ ] [Chapter 6 (Part 2) - Abstraction-Occurrence, General Hierarchy, Player-Role, Singleton, Observer, Delegation (video)](https://www.youtube.com/watch?v=U8-PGsjvZc4&index=12&list=PLJ9pm_Rc9HesnkwKlal_buSIHA-jTZMpO) 1015 | - [ ] [Chapter 6 (Part 3) - Adapter, Facade, Immutable, Read-Only Interface, Proxy (video)](https://www.youtube.com/watch?v=7sduBHuex4c&index=13&list=PLJ9pm_Rc9HesnkwKlal_buSIHA-jTZMpO) 1016 | - [ ] [Series of videos (27 videos)](https://www.youtube.com/playlist?list=PLF206E906175C7E07) 1017 | - [ ] [Head First Design Patterns](https://www.amazon.com/Head-First-Design-Patterns-Freeman/dp/0596007124) 1018 | - I know the canonical book is "Design Patterns: Elements of Reusable Object-Oriented Software", but Head First is great for beginners to OO. 1019 | - [ ] [Handy reference: 101 Design Patterns & Tips for Developers](https://sourcemaking.com/design-patterns-and-tips) 1020 | 1021 | - ### Combinatorics (n choose k) & Probability 1022 | - [ ] [Math Skills: How to find Factorial, Permutation and Combination (Choose) (video)](https://www.youtube.com/watch?v=8RRo6Ti9d0U) 1023 | - [ ] [Make School: Probability (video)](https://www.youtube.com/watch?v=sZkAAk9Wwa4) 1024 | - [ ] [Make School: More Probability and Markov Chains (video)](https://www.youtube.com/watch?v=dNaJg-mLobQ) 1025 | - [ ] Khan Academy: 1026 | - Course layout: 1027 | - [ ] [Basic Theoretical Probability](https://www.khanacademy.org/math/probability/probability-and-combinatorics-topic) 1028 | - Just the videos - 41 (each are simple and each are short): 1029 | - [ ] [Probability Explained (video)](https://www.youtube.com/watch?v=uzkc-qNVoOk&list=PLC58778F28211FA19) 1030 | 1031 | - ### NP, NP-Complete and Approximation Algorithms 1032 | - Know about the most famous classes of NP-complete problems, such as traveling salesman and the knapsack problem, 1033 | and be able to recognize them when an interviewer asks you them in disguise. 1034 | - Know what NP-complete means. 1035 | - [ ] [Computational Complexity (video)](https://www.youtube.com/watch?v=moPtwq_cVH8&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=23) 1036 | - [ ] Simonson: 1037 | - [ ] [Greedy Algs. II & Intro to NP Completeness (video)](https://youtu.be/qcGnJ47Smlo?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=2939) 1038 | - [ ] [NP Completeness II & Reductions (video)](https://www.youtube.com/watch?v=e0tGC6ZQdQE&index=16&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm) 1039 | - [ ] [NP Completeness III (Video)](https://www.youtube.com/watch?v=fCX1BGT3wjE&index=17&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm) 1040 | - [ ] [NP Completeness IV (video)](https://www.youtube.com/watch?v=NKLDp3Rch3M&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=18) 1041 | - [ ] Skiena: 1042 | - [ ] [CSE373 2012 - Lecture 23 - Introduction to NP-Completeness (video)](https://youtu.be/KiK5TVgXbFg?list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&t=1508) 1043 | - [ ] [CSE373 2012 - Lecture 24 - NP-Completeness Proofs (video)](https://www.youtube.com/watch?v=27Al52X3hd4&index=24&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b) 1044 | - [ ] [CSE373 2012 - Lecture 25 - NP-Completeness Challenge (video)](https://www.youtube.com/watch?v=xCPH4gwIIXM&index=25&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b) 1045 | - [ ] [Complexity: P, NP, NP-completeness, Reductions (video)](https://www.youtube.com/watch?v=eHZifpgyH_4&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=22) 1046 | - [ ] [Complexity: Approximation Algorithms (video)](https://www.youtube.com/watch?v=MEz1J9wY2iM&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=24) 1047 | - [ ] [Complexity: Fixed-Parameter Algorithms (video)](https://www.youtube.com/watch?v=4q-jmGrmxKs&index=25&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp) 1048 | - Peter Norvig discusses near-optimal solutions to traveling salesman problem: 1049 | - [Jupyter Notebook](http://nbviewer.jupyter.org/url/norvig.com/ipython/TSP.ipynb) 1050 | - Pages 1048 - 1140 in CLRS if you have it. 1051 | 1052 | - ### Caches 1053 | - [ ] LRU cache: 1054 | - [ ] [The Magic of LRU Cache (100 Days of Google Dev) (video)](https://www.youtube.com/watch?v=R5ON3iwx78M) 1055 | - [ ] [Implementing LRU (video)](https://www.youtube.com/watch?v=bq6N7Ym81iI) 1056 | - [ ] [LeetCode - 146 LRU Cache (C++) (video)](https://www.youtube.com/watch?v=8-FZRAjR7qU) 1057 | - [ ] CPU cache: 1058 | - [ ] [MIT 6.004 L15: The Memory Hierarchy (video)](https://www.youtube.com/watch?v=vjYF_fAZI5E&list=PLrRW1w6CGAcXbMtDFj205vALOGmiRc82-&index=24) 1059 | - [ ] [MIT 6.004 L16: Cache Issues (video)](https://www.youtube.com/watch?v=ajgC3-pyGlk&index=25&list=PLrRW1w6CGAcXbMtDFj205vALOGmiRc82-) 1060 | 1061 | - ### Processes and Threads 1062 | - [ ] Computer Science 162 - Operating Systems (25 videos): 1063 | - for processes and threads see videos 1-11 1064 | - [Operating Systems and System Programming (video)](https://www.youtube.com/playlist?list=PL-XXv-cvA_iBDyz-ba4yDskqMDY6A1w_c) 1065 | - [What Is The Difference Between A Process And A Thread?](https://www.quora.com/What-is-the-difference-between-a-process-and-a-thread) 1066 | - Covers: 1067 | - Processes, Threads, Concurrency issues 1068 | - difference between processes and threads 1069 | - processes 1070 | - threads 1071 | - locks 1072 | - mutexes 1073 | - semaphores 1074 | - monitors 1075 | - how they work 1076 | - deadlock 1077 | - livelock 1078 | - CPU activity, interrupts, context switching 1079 | - Modern concurrency constructs with multicore processors 1080 | - Process resource needs (memory: code, static storage, stack, heap, and also file descriptors, i/o) 1081 | - Thread resource needs (shares above (minus stack) with other threads in the same process but each has its own pc, stack counter, registers, and stack) 1082 | - Forking is really copy on write (read-only) until the new process writes to memory, then it does a full copy. 1083 | - Context switching 1084 | - How context switching is initiated by the operating system and underlying hardware 1085 | - [ ] [threads in C++ (series - 10 videos)](https://www.youtube.com/playlist?list=PL5jc9xFGsL8E12so1wlMS0r0hTQoJL74M) 1086 | - [ ] concurrency in Python (videos): 1087 | - [ ] [Short series on threads](https://www.youtube.com/playlist?list=PL1H1sBF1VAKVMONJWJkmUh6_p8g4F2oy1) 1088 | - [ ] [Python Threads](https://www.youtube.com/watch?v=Bs7vPNbB9JM) 1089 | - [ ] [Understanding the Python GIL (2010)](https://www.youtube.com/watch?v=Obt-vMVdM8s) 1090 | - [reference](http://www.dabeaz.com/GIL) 1091 | - [ ] [David Beazley - Python Concurrency From the Ground Up: LIVE! - PyCon 2015](https://www.youtube.com/watch?v=MCs5OvhV9S4) 1092 | - [ ] [Keynote David Beazley - Topics of Interest (Python Asyncio)](https://www.youtube.com/watch?v=ZzfHjytDceU) 1093 | - [ ] [Mutex in Python](https://www.youtube.com/watch?v=0zaPs8OtyKY) 1094 | 1095 | - ### Papers 1096 | - These are Google papers and well-known papers. 1097 | - Reading all from end to end with full comprehension will likely take more time than you have. I recommend being selective on papers and their sections. 1098 | - [ ] [1978: Communicating Sequential Processes](http://spinroot.com/courses/summer/Papers/hoare_1978.pdf) 1099 | - [implemented in Go](https://godoc.org/github.com/thomas11/csp) 1100 | - [Love classic papers?](https://www.cs.cmu.edu/~crary/819-f09/) 1101 | - [ ] [2003: The Google File System](http://static.googleusercontent.com/media/research.google.com/en//archive/gfs-sosp2003.pdf) 1102 | - replaced by Colossus in 2012 1103 | - [ ] [2004: MapReduce: Simplified Data Processing on Large Clusters]( http://static.googleusercontent.com/media/research.google.com/en//archive/mapreduce-osdi04.pdf) 1104 | - mostly replaced by Cloud Dataflow? 1105 | - [ ] [2007: What Every Programmer Should Know About Memory (very long, and the author encourages skipping of some sections)](https://www.akkadia.org/drepper/cpumemory.pdf) 1106 | - [ ] [2012: Google's Colossus](https://www.wired.com/2012/07/google-colossus/) 1107 | - paper not available 1108 | - [ ] 2012: AddressSanitizer: A Fast Address Sanity Checker: 1109 | - [paper](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/37752.pdf) 1110 | - [video](https://www.usenix.org/conference/atc12/technical-sessions/presentation/serebryany) 1111 | - [ ] 2013: Spanner: Google’s Globally-Distributed Database: 1112 | - [paper](http://static.googleusercontent.com/media/research.google.com/en//archive/spanner-osdi2012.pdf) 1113 | - [video](https://www.usenix.org/node/170855) 1114 | - [ ] [2014: Machine Learning: The High-Interest Credit Card of Technical Debt](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43146.pdf) 1115 | - [ ] [2015: Continuous Pipelines at Google](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43790.pdf) 1116 | - [ ] [2015: High-Availability at Massive Scale: Building Google’s Data Infrastructure for Ads](https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/44686.pdf) 1117 | - [ ] [2015: TensorFlow: Large-Scale Machine Learning on Heterogeneous Distributed Systems](http://download.tensorflow.org/paper/whitepaper2015.pdf ) 1118 | - [ ] [2015: How Developers Search for Code: A Case Study](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43835.pdf) 1119 | - [ ] [2016: Borg, Omega, and Kubernetes](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/44843.pdf) 1120 | 1121 | - ### Testing 1122 | - To cover: 1123 | - how unit testing works 1124 | - what are mock objects 1125 | - what is integration testing 1126 | - what is dependency injection 1127 | - [ ] [Agile Software Testing with James Bach (video)](https://www.youtube.com/watch?v=SAhJf36_u5U) 1128 | - [ ] [Open Lecture by James Bach on Software Testing (video)](https://www.youtube.com/watch?v=ILkT_HV9DVU) 1129 | - [ ] [Steve Freeman - Test-Driven Development (that’s not what we meant) (video)](https://vimeo.com/83960706) 1130 | - [slides](http://gotocon.com/dl/goto-berlin-2013/slides/SteveFreeman_TestDrivenDevelopmentThatsNotWhatWeMeant.pdf) 1131 | - [ ] [TDD is dead. Long live testing.](http://david.heinemeierhansson.com/2014/tdd-is-dead-long-live-testing.html) 1132 | - [ ] [Is TDD dead? (video)](https://www.youtube.com/watch?v=z9quxZsLcfo) 1133 | - [ ] [Video series (152 videos) - not all are needed (video)](https://www.youtube.com/watch?v=nzJapzxH_rE&list=PLAwxTw4SYaPkWVHeC_8aSIbSxE_NXI76g) 1134 | - [ ] [Test-Driven Web Development with Python](http://www.obeythetestinggoat.com/pages/book.html#toc) 1135 | - [ ] Dependency injection: 1136 | - [ ] [video](https://www.youtube.com/watch?v=IKD2-MAkXyQ) 1137 | - [ ] [Tao Of Testing](http://jasonpolites.github.io/tao-of-testing/ch3-1.1.html) 1138 | - [ ] [How to write tests](http://jasonpolites.github.io/tao-of-testing/ch4-1.1.html) 1139 | 1140 | - ### Scheduling 1141 | - in an OS, how it works 1142 | - can be gleaned from Operating System videos 1143 | 1144 | - ### Implement system routines 1145 | - understand what lies beneath the programming APIs you use 1146 | - can you implement them? 1147 | 1148 | - ### String searching & manipulations 1149 | - [ ] [Sedgewick - Suffix Arrays (video)](https://www.youtube.com/watch?v=HKPrVm5FWvg) 1150 | - [ ] [Sedgewick - Substring Search (videos)](https://www.youtube.com/watch?v=2LvvVFCEIv8&list=PLe-ggMe31CTdAdjXB3lIuf2maubzo9t66&index=5) 1151 | - [ ] [1. Introduction to Substring Search](https://www.youtube.com/watch?v=2LvvVFCEIv8&list=PLe-ggMe31CTdAdjXB3lIuf2maubzo9t66&index=5) 1152 | - [ ] [2. Brute-Force Substring Search](https://www.youtube.com/watch?v=CcDXwIGEXYU&list=PLe-ggMe31CTdAdjXB3lIuf2maubzo9t66&index=4) 1153 | - [ ] [3. Knuth-Morris Pratt](https://www.youtube.com/watch?v=n-7n-FDEWzc&index=3&list=PLe-ggMe31CTdAdjXB3lIuf2maubzo9t66) 1154 | - [ ] [4. Boyer-Moore](https://www.youtube.com/watch?v=fI7Ch6pZXfM&list=PLe-ggMe31CTdAdjXB3lIuf2maubzo9t66&index=2) 1155 | - [ ] [5. Rabin-Karp](https://www.youtube.com/watch?v=QzI0p6zDjK4&index=1&list=PLe-ggMe31CTdAdjXB3lIuf2maubzo9t66) 1156 | - [ ] [Search pattern in text (video)](https://www.coursera.org/learn/data-structures/lecture/tAfHI/search-pattern-in-text) 1157 | 1158 | If you need more detail on this subject, see "String Matching" section in [Additional Detail on Some Subjects](#additional-detail-on-some-subjects) 1159 | 1160 | --- 1161 | 1162 | ## System Design, Scalability, Data Handling 1163 | - **You can expect system design questions if you have 4+ years of experience.** 1164 | - Scalability and System Design are very large topics with many topics and resources, since 1165 | there is a lot to consider when designing a software/hardware system that can scale. 1166 | Expect to spend quite a bit of time on this. 1167 | - Considerations from Yegge: 1168 | - scalability 1169 | - Distill large data sets to single values 1170 | - Transform one data set to another 1171 | - Handling obscenely large amounts of data 1172 | - system design 1173 | - features sets 1174 | - interfaces 1175 | - class hierarchies 1176 | - designing a system under certain constraints 1177 | - simplicity and robustness 1178 | - tradeoffs 1179 | - performance analysis and optimization 1180 | - [ ] **START HERE**: [System Design from HiredInTech](http://www.hiredintech.com/system-design/) 1181 | - [ ] [How Do I Prepare To Answer Design Questions In A Technical Inverview?](https://www.quora.com/How-do-I-prepare-to-answer-design-questions-in-a-technical-interview?redirected_qid=1500023) 1182 | - [ ] [8 Things You Need to Know Before a System Design Interview](http://blog.gainlo.co/index.php/2015/10/22/8-things-you-need-to-know-before-system-design-interviews/) 1183 | - [ ] [Algorithm design](http://www.hiredintech.com/algorithm-design/) 1184 | - [ ] [Database Normalization - 1NF, 2NF, 3NF and 4NF (video)](https://www.youtube.com/watch?v=UrYLYV7WSHM) 1185 | - [ ] [System Design Interview](https://github.com/checkcheckzz/system-design-interview) - There are a lot of resources in this one. Look through the articles and examples. I put some of them below. 1186 | - [ ] [How to ace a systems design interview](http://www.palantir.com/2011/10/how-to-rock-a-systems-design-interview/) 1187 | - [ ] [Numbers Everyone Should Know](http://everythingisdata.wordpress.com/2009/10/17/numbers-everyone-should-know/) 1188 | - [ ] [How long does it take to make a context switch?](http://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html) 1189 | - [ ] [Transactions Across Datacenters (video)](https://www.youtube.com/watch?v=srOgpXECblk) 1190 | - [ ] [A plain English introduction to CAP Theorem](http://ksat.me/a-plain-english-introduction-to-cap-theorem/) 1191 | - [ ] Paxos Consensus algorithm: 1192 | - [short video](https://www.youtube.com/watch?v=s8JqcZtvnsM) 1193 | - [extended video with use case and multi-paxos](https://www.youtube.com/watch?v=JEpsBg0AO6o) 1194 | - [paper](http://research.microsoft.com/en-us/um/people/lamport/pubs/paxos-simple.pdf) 1195 | - [ ] [Consistent Hashing](http://www.tom-e-white.com/2007/11/consistent-hashing.html) 1196 | - [ ] [NoSQL Patterns](http://horicky.blogspot.com/2009/11/nosql-patterns.html) 1197 | - [ ] Scalability: 1198 | - [ ] [Great overview (video)](https://www.youtube.com/watch?v=-W9F__D3oY4) 1199 | - [ ] Short series: 1200 | - [Clones](http://www.lecloud.net/post/7295452622/scalability-for-dummies-part-1-clones) 1201 | - [Database](http://www.lecloud.net/post/7994751381/scalability-for-dummies-part-2-database) 1202 | - [Cache](http://www.lecloud.net/post/9246290032/scalability-for-dummies-part-3-cache) 1203 | - [Asynchronism](http://www.lecloud.net/post/9699762917/scalability-for-dummies-part-4-asynchronism) 1204 | - [ ] [Scalable Web Architecture and Distributed Systems](http://www.aosabook.org/en/distsys.html) 1205 | - [ ] [Fallacies of Distributed Computing Explained](https://pages.cs.wisc.edu/~zuyu/files/fallacies.pdf) 1206 | - [ ] [Pragmatic Programming Techniques](http://horicky.blogspot.com/2010/10/scalable-system-design-patterns.html) 1207 | - [extra: Google Pregel Graph Processing](http://horicky.blogspot.com/2010/07/google-pregel-graph-processing.html) 1208 | - [ ] [Jeff Dean - Building Software Systems At Google and Lessons Learned (video)](https://www.youtube.com/watch?v=modXC5IWTJI) 1209 | - [ ] [Introduction to Architecting Systems for Scale](http://lethain.com/introduction-to-architecting-systems-for-scale/) 1210 | - [ ] [Scaling mobile games to a global audience using App Engine and Cloud Datastore (video)](https://www.youtube.com/watch?v=9nWyWwY2Onc) 1211 | - [ ] [How Google Does Planet-Scale Engineering for Planet-Scale Infra (video)](https://www.youtube.com/watch?v=H4vMcD7zKM0) 1212 | - [ ] [The Importance of Algorithms](https://www.topcoder.com/community/data-science/data-science-tutorials/the-importance-of-algorithms/) 1213 | - [ ] [Sharding](http://highscalability.com/blog/2009/8/6/an-unorthodox-approach-to-database-design-the-coming-of-the.html) 1214 | - [ ] [Scale at Facebook (2009)](https://www.infoq.com/presentations/Scale-at-Facebook) 1215 | - [ ] [Scale at Facebook (2012), "Building for a Billion Users" (video)](https://www.youtube.com/watch?v=oodS71YtkGU) 1216 | - [ ] [Engineering for the Long Game - Astrid Atkinson Keynote(video)](https://www.youtube.com/watch?v=p0jGmgIrf_M&list=PLRXxvay_m8gqVlExPC5DG3TGWJTaBgqSA&index=4) 1217 | - [ ] [7 Years Of YouTube Scalability Lessons In 30 Minutes](http://highscalability.com/blog/2012/3/26/7-years-of-youtube-scalability-lessons-in-30-minutes.html) 1218 | - [video](https://www.youtube.com/watch?v=G-lGCC4KKok) 1219 | - [ ] [How PayPal Scaled To Billions Of Transactions Daily Using Just 8VMs](http://highscalability.com/blog/2016/8/15/how-paypal-scaled-to-billions-of-transactions-daily-using-ju.html) 1220 | - [ ] [How to Remove Duplicates in Large Datasets](https://blog.clevertap.com/how-to-remove-duplicates-in-large-datasets/) 1221 | - [ ] [A look inside Etsy's scale and engineering culture with Jon Cowie (video)](https://www.youtube.com/watch?v=3vV4YiqKm1o) 1222 | - [ ] [What Led Amazon to its Own Microservices Architecture](http://thenewstack.io/led-amazon-microservices-architecture/) 1223 | - [ ] [To Compress Or Not To Compress, That Was Uber's Question](https://eng.uber.com/trip-data-squeeze/) 1224 | - [ ] [Asyncio Tarantool Queue, Get In The Queue](http://highscalability.com/blog/2016/3/3/asyncio-tarantool-queue-get-in-the-queue.html) 1225 | - [ ] [When Should Approximate Query Processing Be Used?](http://highscalability.com/blog/2016/2/25/when-should-approximate-query-processing-be-used.html) 1226 | - [ ] [Google's Transition From Single Datacenter, To Failover, To A Native Multihomed Architecture]( http://highscalability.com/blog/2016/2/23/googles-transition-from-single-datacenter-to-failover-to-a-n.html) 1227 | - [ ] [Spanner](http://highscalability.com/blog/2012/9/24/google-spanners-most-surprising-revelation-nosql-is-out-and.html) 1228 | - [ ] [Egnyte Architecture: Lessons Learned In Building And Scaling A Multi Petabyte Distributed System](http://highscalability.com/blog/2016/2/15/egnyte-architecture-lessons-learned-in-building-and-scaling.html) 1229 | - [ ] [Machine Learning Driven Programming: A New Programming For A New World](http://highscalability.com/blog/2016/7/6/machine-learning-driven-programming-a-new-programming-for-a.html) 1230 | - [ ] [The Image Optimization Technology That Serves Millions Of Requests Per Day](http://highscalability.com/blog/2016/6/15/the-image-optimization-technology-that-serves-millions-of-re.html) 1231 | - [ ] [A Patreon Architecture Short](http://highscalability.com/blog/2016/2/1/a-patreon-architecture-short.html) 1232 | - [ ] [Tinder: How Does One Of The Largest Recommendation Engines Decide Who You'll See Next?](http://highscalability.com/blog/2016/1/27/tinder-how-does-one-of-the-largest-recommendation-engines-de.html) 1233 | - [ ] [Design Of A Modern Cache](http://highscalability.com/blog/2016/1/25/design-of-a-modern-cache.html) 1234 | - [ ] [Live Video Streaming At Facebook Scale](http://highscalability.com/blog/2016/1/13/live-video-streaming-at-facebook-scale.html) 1235 | - [ ] [A Beginner's Guide To Scaling To 11 Million+ Users On Amazon's AWS](http://highscalability.com/blog/2016/1/11/a-beginners-guide-to-scaling-to-11-million-users-on-amazons.html) 1236 | - [ ] [How Does The Use Of Docker Effect Latency?](http://highscalability.com/blog/2015/12/16/how-does-the-use-of-docker-effect-latency.html) 1237 | - [ ] [Does AMP Counter An Existential Threat To Google?](http://highscalability.com/blog/2015/12/14/does-amp-counter-an-existential-threat-to-google.html) 1238 | - [ ] [A 360 Degree View Of The Entire Netflix Stack](http://highscalability.com/blog/2015/11/9/a-360-degree-view-of-the-entire-netflix-stack.html) 1239 | - [ ] [Latency Is Everywhere And It Costs You Sales - How To Crush It](http://highscalability.com/latency-everywhere-and-it-costs-you-sales-how-crush-it) 1240 | - [ ] [Serverless (very long, just need the gist)](http://martinfowler.com/articles/serverless.html) 1241 | - [ ] [What Powers Instagram: Hundreds of Instances, Dozens of Technologies](http://instagram-engineering.tumblr.com/post/13649370142/what-powers-instagram-hundreds-of-instances) 1242 | - [ ] [Cinchcast Architecture - Producing 1,500 Hours Of Audio Every Day](http://highscalability.com/blog/2012/7/16/cinchcast-architecture-producing-1500-hours-of-audio-every-d.html) 1243 | - [ ] [Justin.Tv's Live Video Broadcasting Architecture](http://highscalability.com/blog/2010/3/16/justintvs-live-video-broadcasting-architecture.html) 1244 | - [ ] [Playfish's Social Gaming Architecture - 50 Million Monthly Users And Growing](http://highscalability.com/blog/2010/9/21/playfishs-social-gaming-architecture-50-million-monthly-user.html) 1245 | - [ ] [TripAdvisor Architecture - 40M Visitors, 200M Dynamic Page Views, 30TB Data](http://highscalability.com/blog/2011/6/27/tripadvisor-architecture-40m-visitors-200m-dynamic-page-view.html) 1246 | - [ ] [PlentyOfFish Architecture](http://highscalability.com/plentyoffish-architecture) 1247 | - [ ] [Salesforce Architecture - How They Handle 1.3 Billion Transactions A Day](http://highscalability.com/blog/2013/9/23/salesforce-architecture-how-they-handle-13-billion-transacti.html) 1248 | - [ ] [ESPN's Architecture At Scale - Operating At 100,000 Duh Nuh Nuhs Per Second](http://highscalability.com/blog/2013/11/4/espns-architecture-at-scale-operating-at-100000-duh-nuh-nuhs.html) 1249 | - [ ] See "Messaging, Serialization, and Queueing Systems" way below for info on some of the technologies that can glue services together 1250 | - [ ] Twitter: 1251 | - [O'Reilly MySQL CE 2011: Jeremy Cole, "Big and Small Data at @Twitter" (video)](https://www.youtube.com/watch?v=5cKTP36HVgI) 1252 | - [Timelines at Scale](https://www.infoq.com/presentations/Twitter-Timeline-Scalability) 1253 | - For even more, see "Mining Massive Datasets" video series in the Video Series section. 1254 | - [ ] Practicing the system design process: Here are some ideas to try working through on paper, each with some documentation on how it was handled in the real world: 1255 | - review: [System Design from HiredInTech](http://www.hiredintech.com/system-design/) 1256 | - [cheat sheet](https://github.com/jwasham/google-interview-university/blob/master/extras/cheat%20sheets/system-design.pdf) 1257 | - flow: 1258 | 1. Understand the problem and scope: 1259 | - define the use cases, with interviewer's help 1260 | - suggest additional features 1261 | - remove items that interviewer deems out of scope 1262 | - assume high availability is required, add as a use case 1263 | 2. Think about constraints: 1264 | - ask how many requests per month 1265 | - ask how many requests per second (they may volunteer it or make you do the math) 1266 | - estimate reads vs. writes percentage 1267 | - keep 80/20 rule in mind when estimating 1268 | - how much data written per second 1269 | - total storage required over 5 years 1270 | - how much data read per second 1271 | 3. Abstract design: 1272 | - layers (service, data, caching) 1273 | - infrastructure: load balancing, messaging 1274 | - rough overview of any key algorithm that drives the service 1275 | - consider bottlenecks and determine solutions 1276 | - Exercises: 1277 | - [Design a CDN network: old article](http://repository.cmu.edu/cgi/viewcontent.cgi?article=2112&context=compsci) 1278 | - [Design a random unique ID generation system](https://blog.twitter.com/2010/announcing-snowflake) 1279 | - [Design an online multiplayer card game](http://www.indieflashblog.com/how-to-create-an-asynchronous-multiplayer-game.html) 1280 | - [Design a key-value database](http://www.slideshare.net/dvirsky/introduction-to-redis) 1281 | - [Design a function to return the top k requests during past time interval]( https://icmi.cs.ucsb.edu/research/tech_reports/reports/2005-23.pdf) 1282 | - [Design a picture sharing system](http://highscalability.com/blog/2011/12/6/instagram-architecture-14-million-users-terabytes-of-photos.html) 1283 | - [Design a recommendation system](http://ijcai13.org/files/tutorial_slides/td3.pdf) 1284 | - [Design a URL-shortener system: copied from above](http://www.hiredintech.com/system-design/the-system-design-process/) 1285 | - [Design a cache system](https://www.adayinthelifeof.nl/2011/02/06/memcache-internals/) 1286 | 1287 | --- 1288 | 1289 | ## Final Review 1290 | 1291 | This section will have shorter videos that can you watch pretty quickly to review most of the important concepts. 1292 | It's nice if you want a refresher often. 1293 | 1294 | - [ ] Series of 2-3 minutes short subject videos (23 videos) 1295 | - [Videos](https://www.youtube.com/watch?v=r4r1DZcx1cM&list=PLmVb1OknmNJuC5POdcDv5oCS7_OUkDgpj&index=22) 1296 | - [ ] Series of 2-5 minutes short subject videos - Michael Sambol (18 videos): 1297 | - [Videos](https://www.youtube.com/channel/UCzDJwLWoYCUQowF_nG3m5OQ) 1298 | - [ ] [Sedgewick Videos - Algorithms I](https://www.youtube.com/user/algorithmscourses/playlists?shelf_id=2&view=50&sort=dd) 1299 | - [ ] [01. Union-Find](https://www.youtube.com/watch?v=8mYfZeHtdNc&list=PLe-ggMe31CTexoNYnMhbHaWhQ0dvcy43t) 1300 | - [ ] [02. Analysis of Algorithms](https://www.youtube.com/watch?v=ZN-nFW0mEpg&list=PLe-ggMe31CTf0_bkOhh7sa5uqeppp3Sr0) 1301 | - [ ] [03. Stacks and Queues](https://www.youtube.com/watch?v=TIC1gappbP8&list=PLe-ggMe31CTe-9jhnj3P_3mmrCh0A7iHh) 1302 | - [ ] [04. Elementary Sorts](https://www.youtube.com/watch?v=CD2AL6VO0ak&list=PLe-ggMe31CTe_5WhGV0F--7CK8MoRUqBd) 1303 | - [ ] [05. Mergesort](https://www.youtube.com/watch?v=4nKwesx_c8E&list=PLe-ggMe31CTeunC6GZHFBmQx7EKtjbGf9) 1304 | - [ ] [06. Quicksort](https://www.youtube.com/watch?v=5M5A7qPWk84&list=PLe-ggMe31CTeE3x2-nF1-toca1QpuXwE1) 1305 | - [ ] [07. Priority Queues](https://www.youtube.com/watch?v=G9TMe0KC0w0&list=PLe-ggMe31CTducy9LDiGVkdSv0NfiRwn5) 1306 | - [ ] [08. Elementary Symbol Tables](https://www.youtube.com/watch?v=up_nlilw3ac&list=PLe-ggMe31CTc3a8nKRDxFZZrWrBvkc9SG) 1307 | - [ ] [09. Balanced Search Trees](https://www.youtube.com/watch?v=qC1BLLPK_5w&list=PLe-ggMe31CTf7jHH_mFT50kayjCEA6Rhu) 1308 | - [ ] [10. Geometric Applications of BST](https://www.youtube.com/watch?v=Wl30aGAp6TY&list=PLe-ggMe31CTdBsRIw0hXln0hilRs-DqAx) 1309 | - [ ] [11. Hash Tables](https://www.youtube.com/watch?v=QA8fJGO-i9o&list=PLe-ggMe31CTcKxIRGqqThMts2eHtSrf11) 1310 | - [ ] [Sedgewick Videos - Algorithms II](https://www.youtube.com/user/algorithmscourses/playlists?flow=list&shelf_id=3&view=50) 1311 | - [ ] [01. Undirected Graphs](https://www.youtube.com/watch?v=GmVhD-mmMBg&list=PLe-ggMe31CTc0zDzANxl4I2MhMoRVlbRM) 1312 | - [ ] [02. Directed Graphs](https://www.youtube.com/watch?v=_z-JsVaUS40&list=PLe-ggMe31CTcEwaU8a1P1Gd95A77HV85K) 1313 | - [ ] [03. Minimum Spanning Trees](https://www.youtube.com/watch?v=t8fNk9tfVYY&list=PLe-ggMe31CTceUZxDesGfHGLE7kcSafqj) 1314 | - [ ] [04. Shortest Paths](https://www.youtube.com/watch?v=HoGSiB7tSeI&list=PLe-ggMe31CTePpG3jbeOTsnGUGZDKxgZD) 1315 | - [ ] [05. Maximum Flow](https://www.youtube.com/watch?v=rYIKlFstBqE&list=PLe-ggMe31CTduQ68XQ-sVj32wYJIspTma) 1316 | - [ ] [06. Radix Sorts](https://www.youtube.com/watch?v=HKPrVm5FWvg&list=PLe-ggMe31CTcNvUX9E3tQeM6ntrdR8e53) 1317 | - [ ] [07. Tries](https://www.youtube.com/watch?v=00YaFPcC65g&list=PLe-ggMe31CTe9IyG9MB8vt5xUJeYgOYRQ) 1318 | - [ ] [08. Substring Search](https://www.youtube.com/watch?v=QzI0p6zDjK4&list=PLe-ggMe31CTdAdjXB3lIuf2maubzo9t66) 1319 | - [ ] [09. Regular Expressions](https://www.youtube.com/watch?v=TQWNQsJSPnk&list=PLe-ggMe31CTetTlJWouM42fyttyKPgSDh) 1320 | - [ ] [10. Data Compression](https://www.youtube.com/watch?v=at9tjpxcBh8&list=PLe-ggMe31CTciifRRo6yY0Yt0mzgIXXVZ) 1321 | - [ ] [11. Reductions](https://www.youtube.com/watch?v=Ow5x-ooMGv8&list=PLe-ggMe31CTe_yliW5vc3yO-dj1LSSDyF) 1322 | - [ ] [12. Linear Programming](https://www.youtube.com/watch?v=rWhcLyiLZLA&list=PLe-ggMe31CTdy6dKzMgkWFuTTN1H8B-E1) 1323 | - [ ] [13. Intractability](https://www.youtube.com/watch?v=6qcaaDp4cdQ&list=PLe-ggMe31CTcZCjluBHw53e_ek2k9Kn-S) 1324 | 1325 | --- 1326 | 1327 | ## Coding Question Practice 1328 | 1329 | Now that you know all the computer science topics above, it's time to practice answering coding problems. 1330 | 1331 | **Coding question practice is not about memorizing answers to programming problems.** 1332 | 1333 | Why you need to practice doing programming problems: 1334 | - problem recognition, and where the right data structures and algorithms fit in 1335 | - gathering requirements for the problem 1336 | - talking your way through the problem like you will in the interview 1337 | - coding on a whiteboard or paper, not a computer 1338 | - coming up with time and space complexity for your solutions 1339 | - testing your solutions 1340 | 1341 | There is a great intro for methodical, communicative problem solving in an interview. You'll get this from the programming 1342 | interview books, too, but I found this outstanding: 1343 | [Algorithm design canvas](http://www.hiredintech.com/algorithm-design/) 1344 | 1345 | [My Process for Coding Interview (Book) Exercises](https://googleyasheck.com/my-process-for-coding-interview-exercises/) 1346 | 1347 | No whiteboard at home? That makes sense. I'm a weirdo and have a big whiteboard. Instead of a whiteboard, pick up a 1348 | large drawing pad from an art store. You can sit on the couch and practice. This is my "sofa whiteboard". 1349 | I added the pen in the photo for scale. If you use a pen, you'll wish you could erase. Gets messy quick. 1350 | 1351 | ![my sofa whiteboard](https://dng5l3qzreal6.cloudfront.net/2016/Oct/art_board_sm_2-1476233630368.jpg) 1352 | 1353 | Supplemental: 1354 | 1355 | - [Mathematics for Topcoders](https://www.topcoder.com/community/data-science/data-science-tutorials/mathematics-for-topcoders/) 1356 | - [Dynamic Programming – From Novice to Advanced](https://www.topcoder.com/community/data-science/data-science-tutorials/dynamic-programming-from-novice-to-advanced/) 1357 | - [MIT Interview Materials](https://web.archive.org/web/20160906124824/http://courses.csail.mit.edu/iap/interview/materials.php) 1358 | - [Exercises for getting better at a given language](http://exercism.io/languages) 1359 | 1360 | **Read and Do Programming Problems (in this order):** 1361 | 1362 | - [ ] [Programming Interviews Exposed: Secrets to Landing Your Next Job, 2nd Edition](http://www.wiley.com/WileyCDA/WileyTitle/productCd-047012167X.html) 1363 | - answers in C, C++ and Java 1364 | - [ ] [Cracking the Coding Interview, 6th Edition](http://www.amazon.com/Cracking-Coding-Interview-6th-Programming/dp/0984782850/) 1365 | - answers in Java 1366 | 1367 | See [Book List above](#book-list) 1368 | 1369 | ## Coding exercises/challenges 1370 | 1371 | Once you've learned your brains out, put those brains to work. 1372 | Take coding challenges every day, as many as you can. 1373 | 1374 | - [ ] [How to Find a Solution](https://www.topcoder.com/community/data-science/data-science-tutorials/how-to-find-a-solution/) 1375 | - [ ] [How to Dissect a Topcoder Problem Statement](https://www.topcoder.com/community/data-science/data-science-tutorials/how-to-dissect-a-topcoder-problem-statement/) 1376 | 1377 | Challenge sites: 1378 | - [LeetCode](https://leetcode.com/) 1379 | - [TopCoder](https://www.topcoder.com/) 1380 | - [Project Euler (math-focused)](https://projecteuler.net/index.php?section=problems) 1381 | - [Codewars](http://www.codewars.com) 1382 | - [HackerRank](https://www.hackerrank.com/) 1383 | - [Codility](https://codility.com/programmers/) 1384 | - [InterviewCake](https://www.interviewcake.com/) 1385 | - [Geeks for Geeks](http://www.geeksforgeeks.org/) 1386 | - [InterviewBit](https://www.interviewbit.com/invite/icjf) 1387 | 1388 | Maybe: 1389 | - [Mock interviewers from big companies](http://www.gainlo.co/) 1390 | 1391 | ## Once you're closer to the interview 1392 | 1393 | - [ ] Cracking The Coding Interview Set 2 (videos): 1394 | - [Cracking The Code Interview](https://www.youtube.com/watch?v=4NIb9l3imAo) 1395 | - [Cracking the Coding Interview - Fullstack Speaker Series](https://www.youtube.com/watch?v=Eg5-tdAwclo) 1396 | - [Ask Me Anything: Gayle Laakmann McDowell (author of Cracking the Coding Interview)](https://www.youtube.com/watch?v=1fqxMuPmGak) 1397 | 1398 | ## Your Resume 1399 | 1400 | - [Ten Tips for a (Slightly) Less Awful Resume](http://steve-yegge.blogspot.co.uk/2007_09_01_archive.html) 1401 | - See Resume prep items in Cracking The Coding Interview and back of Programming Interviews Exposed 1402 | 1403 | 1404 | ## Be thinking of for when the interview comes 1405 | 1406 | Think of about 20 interview questions you'll get, along with the lines of the items below. Have 2-3 answers for each. 1407 | Have a story, not just data, about something you accomplished. 1408 | 1409 | - Why do you want this job? 1410 | - What's a tough problem you've solved? 1411 | - Biggest challenges faced? 1412 | - Best/worst designs seen? 1413 | - Ideas for improving an existing Google product. 1414 | - How do you work best, as an individual and as part of a team? 1415 | - Which of your skills or experiences would be assets in the role and why? 1416 | - What did you most enjoy at [job x / project y]? 1417 | - What was the biggest challenge you faced at [job x / project y]? 1418 | - What was the hardest bug you faced at [job x / project y]? 1419 | - What did you learn at [job x / project y]? 1420 | - What would you have done better at [job x / project y]? 1421 | 1422 | ## Have questions for the interviewer 1423 | 1424 | Some of mine (I already may know answer to but want their opinion or team perspective): 1425 | 1426 | - How large is your team? 1427 | - What does your dev cycle look like? Do you do waterfall/sprints/agile? 1428 | - Are rushes to deadlines common? Or is there flexibility? 1429 | - How are decisions made in your team? 1430 | - How many meetings do you have per week? 1431 | - Do you feel your work environment helps you concentrate? 1432 | - What are you working on? 1433 | - What do you like about it? 1434 | - What is the work life like? 1435 | 1436 | ## Once You've Got The Job 1437 | 1438 | Congratulations! 1439 | 1440 | - [10 things I wish I knew on my first day at Google](https://medium.com/@moonstorming/10-things-i-wish-i-knew-on-my-first-day-at-google-107581d87286#.livxn7clw) 1441 | 1442 | Keep learning. 1443 | 1444 | You're never really done. 1445 | 1446 | --- 1447 | 1448 | ***************************************************************************************************** 1449 | ***************************************************************************************************** 1450 | 1451 | Everything below this point is optional. These are my recommendations, not Google's. 1452 | By studying these, you'll get greater exposure to more CS concepts, and will be better prepared for 1453 | any software engineering job. You'll be a much more well-rounded software engineer. 1454 | 1455 | ***************************************************************************************************** 1456 | ***************************************************************************************************** 1457 | 1458 | --- 1459 | 1460 | ## Additional Books 1461 | 1462 | - [ ] [The Unix Programming Environment](http://product.half.ebay.com/The-UNIX-Programming-Environment-by-Brian-W-Kernighan-and-Rob-Pike-1983-Other/54385&tg=info) 1463 | - an oldie but a goodie 1464 | - [ ] [The Linux Command Line: A Complete Introduction](https://www.amazon.com/dp/1593273894/) 1465 | - a modern option 1466 | - [ ] [TCP/IP Illustrated Series](https://en.wikipedia.org/wiki/TCP/IP_Illustrated) 1467 | - [ ] [Head First Design Patterns](https://www.amazon.com/gp/product/0596007124/) 1468 | - a gentle introduction to design patterns 1469 | - [ ] [Design Patterns: Elements of Reusable Object-Oriente​d Software](https://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612) 1470 | - aka the "Gang Of Four" book, or GOF 1471 | - the canonical design patterns book 1472 | - [ ] [Site Reliability Engineering](https://landing.google.com/sre/book.html) 1473 | - [Site Reliability Engineering: How Google Runs Production Systems](https://landing.google.com/sre/) 1474 | - [ ] [UNIX and Linux System Administration Handbook, 4th Edition](https://www.amazon.com/UNIX-Linux-System-Administration-Handbook/dp/0131480057/) 1475 | 1476 | ## Additional Learning 1477 | 1478 | - ### Dynamic Programming 1479 | - 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. 1480 | - I suggest looking at many examples of DP problems until you have a solid understanding of the pattern involved. 1481 | - [ ] Videos: 1482 | - the Skiena videos can be hard to follow since he sometimes uses the whiteboard, which is too small to see 1483 | - [ ] [Skiena: CSE373 2012 - Lecture 19 - Introduction to Dynamic Programming (video)](https://youtu.be/Qc2ieXRgR0k?list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&t=1718) 1484 | - [ ] [Skiena: CSE373 2012 - Lecture 20 - Edit Distance (video)](https://youtu.be/IsmMhMdyeGY?list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&t=2749) 1485 | - [ ] [Skiena: CSE373 2012 - Lecture 21 - Dynamic Programming Examples (video)](https://youtu.be/o0V9eYF4UI8?list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&t=406) 1486 | - [ ] [Skiena: CSE373 2012 - Lecture 22 - Applications of Dynamic Programming (video)](https://www.youtube.com/watch?v=dRbMC1Ltl3A&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=22) 1487 | - [ ] [Simonson: Dynamic Programming 0 (starts at 59:18) (video)](https://youtu.be/J5aJEcOr6Eo?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=3558) 1488 | - [ ] [Simonson: Dynamic Programming I - Lecture 11 (video)](https://www.youtube.com/watch?v=0EzHjQ_SOeU&index=11&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm) 1489 | - [ ] [Simonson: Dynamic programming II - Lecture 12 (video)](https://www.youtube.com/watch?v=v1qiRwuJU7g&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=12) 1490 | - [ ] List of individual DP problems (each is short): 1491 | [Dynamic Programming (video)](https://www.youtube.com/playlist?list=PLrmLmBdmIlpsHaNTPP_jHHDx_os9ItYXr) 1492 | - [ ] Yale Lecture notes: 1493 | - [ ] [Dynamic Programming](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#dynamicProgramming) 1494 | - [ ] Coursera: 1495 | - [ ] [The RNA secondary structure problem (video)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/80RrW/the-rna-secondary-structure-problem) 1496 | - [ ] [A dynamic programming algorithm (video)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/PSonq/a-dynamic-programming-algorithm) 1497 | - [ ] [Illustrating the DP algorithm (video)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/oUEK2/illustrating-the-dp-algorithm) 1498 | - [ ] [Running time of the DP algorithm (video)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/nfK2r/running-time-of-the-dp-algorithm) 1499 | - [ ] [DP vs. recursive implementation (video)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/M999a/dp-vs-recursive-implementation) 1500 | - [ ] [Global pairwise sequence alignment (video)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/UZ7o6/global-pairwise-sequence-alignment) 1501 | - [ ] [Local pairwise sequence alignment (video)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/WnNau/local-pairwise-sequence-alignment) 1502 | 1503 | - ### Compilers 1504 | - [ ] [How a Compiler Works in ~1 minute (video)](https://www.youtube.com/watch?v=IhC7sdYe-Jg) 1505 | - [ ] [Harvard CS50 - Compilers (video)](https://www.youtube.com/watch?v=CSZLNYF4Klo) 1506 | - [ ] [C++ (video)](https://www.youtube.com/watch?v=twodd1KFfGk) 1507 | - [ ] [Understanding Compiler Optimization (C++) (video)](https://www.youtube.com/watch?v=FnGCDLhaxKU) 1508 | 1509 | - ### Floating Point Numbers 1510 | - [ ] simple 8-bit: [Representation of Floating Point Numbers - 1 (video - there is an error in calculations - see video description)](https://www.youtube.com/watch?v=ji3SfClm8TU) 1511 | - [ ] 32 bit: [IEEE754 32-bit floating point binary (video)](https://www.youtube.com/watch?v=50ZYcZebIec) 1512 | 1513 | - ### Unicode 1514 | - [ ] [The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets]( http://www.joelonsoftware.com/articles/Unicode.html) 1515 | - [ ] [What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text](http://kunststube.net/encoding/) 1516 | 1517 | - ### Endianness 1518 | - [ ] [Big And Little Endian](https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html) 1519 | - [ ] [Big Endian Vs Little Endian (video)](https://www.youtube.com/watch?v=JrNF0KRAlyo) 1520 | - [ ] [Big And Little Endian Inside/Out (video)](https://www.youtube.com/watch?v=oBSuXP-1Tc0) 1521 | - Very technical talk for kernel devs. Don't worry if most is over your head. 1522 | - The first half is enough. 1523 | 1524 | - ### Emacs and vi(m) 1525 | - suggested by Yegge, from an old Amazon recruiting post: Familiarize yourself with a unix-based code editor 1526 | - vi(m): 1527 | - [Editing With vim 01 - Installation, Setup, and The Modes (video)](https://www.youtube.com/watch?v=5givLEMcINQ&index=1&list=PL13bz4SHGmRxlZVmWQ9DvXo1fEg4UdGkr) 1528 | - [VIM Adventures](http://vim-adventures.com/) 1529 | - set of 4 videos: 1530 | - [The vi/vim editor - Lesson 1](https://www.youtube.com/watch?v=SI8TeVMX8pk) 1531 | - [The vi/vim editor - Lesson 2](https://www.youtube.com/watch?v=F3OO7ZIOaJE) 1532 | - [The vi/vim editor - Lesson 3](https://www.youtube.com/watch?v=ZYEccA_nMaI) 1533 | - [The vi/vim editor - Lesson 4](https://www.youtube.com/watch?v=1lYD5gwgZIA) 1534 | - [Using Vi Instead of Emacs](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#Using_Vi_instead_of_Emacs) 1535 | - emacs: 1536 | - [Basics Emacs Tutorial (video)](https://www.youtube.com/watch?v=hbmV1bnQ-i0) 1537 | - set of 3 (videos): 1538 | - [Emacs Tutorial (Beginners) -Part 1- File commands, cut/copy/paste, cursor commands](https://www.youtube.com/watch?v=ujODL7MD04Q) 1539 | - [Emacs Tutorial (Beginners) -Part 2- Buffer management, search, M-x grep and rgrep modes](https://www.youtube.com/watch?v=XWpsRupJ4II) 1540 | - [Emacs Tutorial (Beginners) -Part 3- Expressions, Statements, ~/.emacs file and packages](https://www.youtube.com/watch?v=paSgzPso-yc) 1541 | - [Evil Mode: Or, How I Learned to Stop Worrying and Love Emacs (video)](https://www.youtube.com/watch?v=JWD1Fpdd4Pc) 1542 | - [Writing C Programs With Emacs](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#Writing_C_programs_with_Emacs) 1543 | - [(maybe) Org Mode In Depth: Managing Structure (video)](https://www.youtube.com/watch?v=nsGYet02bEk) 1544 | 1545 | - ### Unix command line tools 1546 | - suggested by Yegge, from an old Amazon recruiting post. I filled in the list below from good tools. 1547 | - [ ] bash 1548 | - [ ] cat 1549 | - [ ] grep 1550 | - [ ] sed 1551 | - [ ] awk 1552 | - [ ] curl or wget 1553 | - [ ] sort 1554 | - [ ] tr 1555 | - [ ] uniq 1556 | - [ ] [strace](https://en.wikipedia.org/wiki/Strace) 1557 | - [ ] [tcpdump](https://danielmiessler.com/study/tcpdump/) 1558 | 1559 | - ### Information theory (videos) 1560 | - [ ] [Khan Academy](https://www.khanacademy.org/computing/computer-science/informationtheory) 1561 | - [ ] more about Markov processes: 1562 | - [ ] [Core Markov Text Generation](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/waxgx/core-markov-text-generation) 1563 | - [ ] [Core Implementing Markov Text Generation](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/gZhiC/core-implementing-markov-text-generation) 1564 | - [ ] [Project = Markov Text Generation Walk Through](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/EUjrq/project-markov-text-generation-walk-through) 1565 | - See more in MIT 6.050J Information and Entropy series below. 1566 | 1567 | - ### Parity & Hamming Code (videos) 1568 | - [ ] [Intro](https://www.youtube.com/watch?v=q-3BctoUpHE) 1569 | - [ ] [Parity](https://www.youtube.com/watch?v=DdMcAUlxh1M) 1570 | - [ ] Hamming Code: 1571 | - [Error detection](https://www.youtube.com/watch?v=1A_NcXxdoCc) 1572 | - [Error correction](https://www.youtube.com/watch?v=JAMLuxdHH8o) 1573 | - [ ] [Error Checking](https://www.youtube.com/watch?v=wbH2VxzmoZk) 1574 | 1575 | - ### Entropy 1576 | - also see videos below 1577 | - make sure to watch information theory videos first 1578 | - [ ] [Information Theory, Claude Shannon, Entropy, Redundancy, Data Compression & Bits (video)](https://youtu.be/JnJq3Py0dyM?t=176) 1579 | 1580 | - ### Cryptography 1581 | - also see videos below 1582 | - make sure to watch information theory videos first 1583 | - [ ] [Khan Academy Series](https://www.khanacademy.org/computing/computer-science/cryptography) 1584 | - [ ] [Cryptography: Hash Functions](https://www.youtube.com/watch?v=KqqOXndnvic&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=30) 1585 | - [ ] [Cryptography: Encryption](https://www.youtube.com/watch?v=9TNI2wHmaeI&index=31&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp) 1586 | 1587 | - ### Compression 1588 | - make sure to watch information theory videos first 1589 | - [ ] Computerphile (videos): 1590 | - [ ] [Compression](https://www.youtube.com/watch?v=Lto-ajuqW3w) 1591 | - [ ] [Entropy in Compression](https://www.youtube.com/watch?v=M5c_RFKVkko) 1592 | - [ ] [Upside Down Trees (Huffman Trees)](https://www.youtube.com/watch?v=umTbivyJoiI) 1593 | - [ ] [EXTRA BITS/TRITS - Huffman Trees](https://www.youtube.com/watch?v=DV8efuB3h2g) 1594 | - [ ] [Elegant Compression in Text (The LZ 77 Method)](https://www.youtube.com/watch?v=goOa3DGezUA) 1595 | - [ ] [Text Compression Meets Probabilities](https://www.youtube.com/watch?v=cCDCfoHTsaU) 1596 | - [ ] [Compressor Head videos](https://www.youtube.com/playlist?list=PLOU2XLYxmsIJGErt5rrCqaSGTMyyqNt2H) 1597 | - [ ] [(optional) Google Developers Live: GZIP is not enough!](https://www.youtube.com/watch?v=whGwm0Lky2s) 1598 | 1599 | - ### Networking 1600 | - **if you have networking experience or want to be a systems engineer, expect questions** 1601 | - otherwise, this is just good to know 1602 | - [ ] [Khan Academy](https://www.khanacademy.org/computing/computer-science/internet-intro) 1603 | - [ ] [UDP and TCP: Comparison of Transport Protocols](https://www.youtube.com/watch?v=Vdc8TCESIg8) 1604 | - [ ] [TCP/IP and the OSI Model Explained!](https://www.youtube.com/watch?v=e5DEVa9eSN0) 1605 | - [ ] [Packet Transmission across the Internet. Networking & TCP/IP tutorial.](https://www.youtube.com/watch?v=nomyRJehhnM) 1606 | - [ ] [HTTP](https://www.youtube.com/watch?v=WGJrLqtX7As) 1607 | - [ ] [SSL and HTTPS](https://www.youtube.com/watch?v=S2iBR2ZlZf0) 1608 | - [ ] [SSL/TLS](https://www.youtube.com/watch?v=Rp3iZUvXWlM) 1609 | - [ ] [HTTP 2.0](https://www.youtube.com/watch?v=E9FxNzv1Tr8) 1610 | - [ ] [Video Series (21 videos)](https://www.youtube.com/playlist?list=PLEbnTDJUr_IegfoqO4iPnPYQui46QqT0j) 1611 | - [ ] [Subnetting Demystified - Part 5 CIDR Notation](https://www.youtube.com/watch?v=t5xYI0jzOf4) 1612 | 1613 | - ### Computer Security 1614 | - [MIT (23 videos)](https://www.youtube.com/playlist?list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh) 1615 | - [ ] [Introduction, Threat Models](https://www.youtube.com/watch?v=GqmQg-cszw4&index=1&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh) 1616 | - [ ] [Control Hijacking Attacks](https://www.youtube.com/watch?v=6bwzNg5qQ0o&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh&index=2) 1617 | - [ ] [Buffer Overflow Exploits and Defenses](https://www.youtube.com/watch?v=drQyrzRoRiA&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh&index=3) 1618 | - [ ] [Privilege Separation](https://www.youtube.com/watch?v=6SIJmoE9L9g&index=4&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh) 1619 | - [ ] [Capabilities](https://www.youtube.com/watch?v=8VqTSY-11F4&index=5&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh) 1620 | - [ ] [Sandboxing Native Code](https://www.youtube.com/watch?v=VEV74hwASeU&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh&index=6) 1621 | - [ ] [Web Security Model](https://www.youtube.com/watch?v=chkFBigodIw&index=7&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh) 1622 | - [ ] [Securing Web Applications](https://www.youtube.com/watch?v=EBQIGy1ROLY&index=8&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh) 1623 | - [ ] [Symbolic Execution](https://www.youtube.com/watch?v=yRVZPvHYHzw&index=9&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh) 1624 | - [ ] [Network Security](https://www.youtube.com/watch?v=SIEVvk3NVuk&index=11&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh) 1625 | - [ ] [Network Protocols](https://www.youtube.com/watch?v=QOtA76ga_fY&index=12&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh) 1626 | - [ ] [Side-Channel Attacks](https://www.youtube.com/watch?v=PuVMkSEcPiI&index=15&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh) 1627 | 1628 | - ### Garbage collection 1629 | - [ ] [Garbage collection (Java); Augmenting data str (video)](https://www.youtube.com/watch?v=StdfeXaKGEc&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd&index=25) 1630 | - [ ] [Compilers (video)](https://www.youtube.com/playlist?list=PLO9y7hOkmmSGTy5z6HZ-W4k2y8WXF7Bff) 1631 | - [ ] [GC in Python (video)](https://www.youtube.com/watch?v=iHVs_HkjdmI) 1632 | - [ ] [Deep Dive Java: Garbage Collection is Good!](https://www.infoq.com/presentations/garbage-collection-benefits) 1633 | - [ ] [Deep Dive Python: Garbage Collection in CPython (video)](https://www.youtube.com/watch?v=P-8Z0-MhdQs&list=PLdzf4Clw0VbOEWOS_sLhT_9zaiQDrS5AR&index=3) 1634 | 1635 | - ### Parallel Programming 1636 | - [ ] [Coursera (Scala)](https://www.coursera.org/learn/parprog1/home/week/1) 1637 | - [ ] [Efficient Python for High Performance Parallel Computing (video)](https://www.youtube.com/watch?v=uY85GkaYzBk) 1638 | 1639 | - ### Messaging, Serialization, and Queueing Systems 1640 | - [ ] [Thrift](https://thrift.apache.org/) 1641 | - [Tutorial](http://thrift-tutorial.readthedocs.io/en/latest/intro.html) 1642 | - [ ] [Protocol Buffers](https://developers.google.com/protocol-buffers/) 1643 | - [Tutorials](https://developers.google.com/protocol-buffers/docs/tutorials) 1644 | - [ ] [gRPC](http://www.grpc.io/) 1645 | - [gRPC 101 for Java Developers (video)](https://www.youtube.com/watch?v=5tmPvSe7xXQ&list=PLcTqM9n_dieN0k1nSeN36Z_ppKnvMJoly&index=1) 1646 | - [ ] [Redis](http://redis.io/) 1647 | - [Tutorial](http://try.redis.io/) 1648 | - [ ] [Amazon SQS (queue)](https://aws.amazon.com/sqs/) 1649 | - [ ] [Amazon SNS (pub-sub)](https://aws.amazon.com/sns/) 1650 | - [ ] [RabbitMQ](https://www.rabbitmq.com/) 1651 | - [Get Started](https://www.rabbitmq.com/getstarted.html) 1652 | - [ ] [Celery](http://www.celeryproject.org/) 1653 | - [First Steps With Celery](http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html) 1654 | - [ ] [ZeroMQ](http://zeromq.org/) 1655 | - [Intro - Read The Manual](http://zeromq.org/intro:read-the-manual) 1656 | - [ ] [ActiveMQ](http://activemq.apache.org/) 1657 | - [ ] [Kafka](http://kafka.apache.org/documentation.html#introduction) 1658 | - [ ] [MessagePack](http://msgpack.org/index.html) 1659 | - [ ] [Avro](https://avro.apache.org/) 1660 | 1661 | - ### Fast Fourier Transform 1662 | - [ ] [An Interactive Guide To The Fourier Transform](https://betterexplained.com/articles/an-interactive-guide-to-the-fourier-transform/) 1663 | - [ ] [What is a Fourier transform? What is it used for?](http://www.askamathematician.com/2012/09/q-what-is-a-fourier-transform-what-is-it-used-for/) 1664 | - [ ] [What is the Fourier Transform? (video)](https://www.youtube.com/watch?v=Xxut2PN-V8Q) 1665 | - [ ] [Divide & Conquer: FFT (video)](https://www.youtube.com/watch?v=iTMn0Kt18tg&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=4) 1666 | - [ ] [Understanding The FFT](http://jakevdp.github.io/blog/2013/08/28/understanding-the-fft/) 1667 | 1668 | - ### Bloom Filter 1669 | - Given a Bloom filter with m bits and k hashing functions, both insertion and membership testing are O(k) 1670 | - [Bloom Filters](https://www.youtube.com/watch?v=-SuTGoFYjZs) 1671 | - [Bloom Filters | Mining of Massive Datasets | Stanford University](https://www.youtube.com/watch?v=qBTdukbzc78) 1672 | - [Tutorial](http://billmill.org/bloomfilter-tutorial/) 1673 | - [How To Write A Bloom Filter App](http://blog.michaelschmatz.com/2016/04/11/how-to-write-a-bloom-filter-cpp/) 1674 | 1675 | - ### HyperLogLog 1676 | - [How To Count A Billion Distinct Objects Using Only 1.5KB Of Memory](http://highscalability.com/blog/2012/4/5/big-data-counting-how-to-count-a-billion-distinct-objects-us.html) 1677 | 1678 | - ### Locality-Sensitive Hashing 1679 | - used to determine the similarity of documents 1680 | - the opposite of MD5 or SHA which are used to determine if 2 documents/strings are exactly the same. 1681 | - [Simhashing (hopefully) made simple](http://ferd.ca/simhashing-hopefully-made-simple.html) 1682 | 1683 | - ### van Emde Boas Trees 1684 | - [ ] [Divide & Conquer: van Emde Boas Trees (video)](https://www.youtube.com/watch?v=hmReJCupbNU&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=6) 1685 | - [ ] [MIT Lecture Notes](https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-046j-design-and-analysis-of-algorithms-spring-2012/lecture-notes/MIT6_046JS12_lec15.pdf) 1686 | 1687 | - ### Augmented Data Structures 1688 | - [ ] [CS 61B Lecture 39: Augmenting Data Structures](https://youtu.be/zksIj9O8_jc?list=PL4BBB74C7D2A1049C&t=950) 1689 | 1690 | - ### Tries 1691 | - Note there are different kinds of tries. Some have prefixes, some don't, and some use string instead of bits 1692 | to track the path. 1693 | - I read through code, but will not implement. 1694 | - [ ] [Sedgewick - Tries (3 videos)](https://www.youtube.com/playlist?list=PLe-ggMe31CTe9IyG9MB8vt5xUJeYgOYRQ) 1695 | - [ ] [1. R Way Tries](https://www.youtube.com/watch?v=buq2bn8x3Vo&index=3&list=PLe-ggMe31CTe9IyG9MB8vt5xUJeYgOYRQ) 1696 | - [ ] [2. Ternary Search Tries](https://www.youtube.com/watch?v=LelV-kkYMIg&index=2&list=PLe-ggMe31CTe9IyG9MB8vt5xUJeYgOYRQ) 1697 | - [ ] [3. Character Based Operations](https://www.youtube.com/watch?v=00YaFPcC65g&list=PLe-ggMe31CTe9IyG9MB8vt5xUJeYgOYRQ&index=1) 1698 | - [ ] [Notes on Data Structures and Programming Techniques](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#Tries) 1699 | - [ ] Short course videos: 1700 | - [ ] [Introduction To Tries (video)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/08Xyf/core-introduction-to-tries) 1701 | - [ ] [Performance Of Tries (video)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/PvlZW/core-performance-of-tries) 1702 | - [ ] [Implementing A Trie (video)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/DFvd3/core-implementing-a-trie) 1703 | - [ ] [The Trie: A Neglected Data Structure](https://www.toptal.com/java/the-trie-a-neglected-data-structure) 1704 | - [ ] [TopCoder - Using Tries](https://www.topcoder.com/community/data-science/data-science-tutorials/using-tries/) 1705 | - [ ] [Stanford Lecture (real world use case) (video)](https://www.youtube.com/watch?v=TJ8SkcUSdbU) 1706 | - [ ] [MIT, Advanced Data Structures, Strings (can get pretty obscure about halfway through)](https://www.youtube.com/watch?v=NinWEPPrkDQ&index=16&list=PLUl4u3cNGP61hsJNdULdudlRL493b-XZf) 1707 | 1708 | - ### Balanced search trees 1709 | - Know least one type of balanced binary tree (and know how it's implemented): 1710 | - "Among balanced search trees, AVL and 2/3 trees are now passé, and red-black trees seem to be more popular. 1711 | A particularly interesting self-organizing data structure is the splay tree, which uses rotations 1712 | to move any accessed key to the root." - Skiena 1713 | - Of these, I chose to implement a splay tree. From what I've read, you won't implement a 1714 | balanced search tree in your interview. But I wanted exposure to coding one up 1715 | and let's face it, splay trees are the bee's knees. I did read a lot of red-black tree code. 1716 | - splay tree: insert, search, delete functions 1717 | If you end up implementing red/black tree try just these: 1718 | - search and insertion functions, skipping delete 1719 | - I want to learn more about B-Tree since it's used so widely with very large data sets. 1720 | - [ ] [Self-balancing binary search tree](https://en.wikipedia.org/wiki/Self-balancing_binary_search_tree) 1721 | 1722 | - [ ] **AVL trees** 1723 | - In practice: 1724 | From what I can tell, these aren't used much in practice, but I could see where they would be: 1725 | The AVL tree is another structure supporting O(log n) search, insertion, and removal. It is more rigidly 1726 | balanced than red–black trees, leading to slower insertion and removal but faster retrieval. This makes it 1727 | attractive for data structures that may be built once and loaded without reconstruction, such as language 1728 | dictionaries (or program dictionaries, such as the opcodes of an assembler or interpreter). 1729 | - [ ] [MIT AVL Trees / AVL Sort (video)](https://www.youtube.com/watch?v=FNeL18KsWPc&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=6) 1730 | - [ ] [AVL Trees (video)](https://www.coursera.org/learn/data-structures/lecture/Qq5E0/avl-trees) 1731 | - [ ] [AVL Tree Implementation (video)](https://www.coursera.org/learn/data-structures/lecture/PKEBC/avl-tree-implementation) 1732 | - [ ] [Split And Merge](https://www.coursera.org/learn/data-structures/lecture/22BgE/split-and-merge) 1733 | 1734 | - [ ] **Splay trees** 1735 | - In practice: 1736 | Splay trees are typically used in the implementation of caches, memory allocators, routers, garbage collectors, 1737 | data compression, ropes (replacement of string used for long text strings), in Windows NT (in the virtual memory, 1738 | networking and file system code) etc. 1739 | - [ ] [CS 61B: Splay Trees (video)](https://www.youtube.com/watch?v=Najzh1rYQTo&index=23&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd) 1740 | - [ ] MIT Lecture: Splay Trees: 1741 | - Gets very mathy, but watch the last 10 minutes for sure. 1742 | - [Video](https://www.youtube.com/watch?v=QnPl_Y6EqMo) 1743 | 1744 | - [ ] **Red/black trees** 1745 | - these are a translation of a 2-3 tree (see below) 1746 | - In practice: 1747 | Red–black trees offer worst-case guarantees for insertion time, deletion time, and search time. 1748 | Not only does this make them valuable in time-sensitive applications such as real-time applications, 1749 | but it makes them valuable building blocks in other data structures which provide worst-case guarantees; 1750 | for example, many data structures used in computational geometry can be based on red–black trees, and 1751 | the Completely Fair Scheduler used in current Linux kernels uses red–black trees. In the version 8 of Java, 1752 | the Collection HashMap has been modified such that instead of using a LinkedList to store identical elements with poor 1753 | hashcodes, a Red-Black tree is used. 1754 | - [ ] [Aduni - Algorithms - Lecture 4 (link jumps to starting point) (video)](https://youtu.be/1W3x0f_RmUo?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=3871) 1755 | - [ ] [Aduni - Algorithms - Lecture 5 (video)](https://www.youtube.com/watch?v=hm2GHwyKF1o&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=5) 1756 | - [ ] [Black Tree](https://en.wikipedia.org/wiki/Red%E2%80%93black_tree) 1757 | - [ ] [An Introduction To Binary Search And Red Black Tree](https://www.topcoder.com/community/data-science/data-science-tutorials/an-introduction-to-binary-search-and-red-black-trees/) 1758 | 1759 | - [ ] **2-3 search trees** 1760 | - In practice: 1761 | 2-3 trees have faster inserts at the expense of slower searches (since height is more compared to AVL trees). 1762 | - You would use 2-3 tree very rarely because its implementation involves different types of nodes. Instead, people use Red Black trees. 1763 | - [ ] [23-Tree Intuition and Definition (video)](https://www.youtube.com/watch?v=C3SsdUqasD4&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6&index=2) 1764 | - [ ] [Binary View of 23-Tree](https://www.youtube.com/watch?v=iYvBtGKsqSg&index=3&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6) 1765 | - [ ] [2-3 Trees (student recitation) (video)](https://www.youtube.com/watch?v=TOb1tuEZ2X4&index=5&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp) 1766 | 1767 | - [ ] **2-3-4 Trees (aka 2-4 trees)** 1768 | - In practice: 1769 | For every 2-4 tree, there are corresponding red–black trees with data elements in the same order. The insertion and deletion 1770 | operations on 2-4 trees are also equivalent to color-flipping and rotations in red–black trees. This makes 2-4 trees an 1771 | important tool for understanding the logic behind red–black trees, and this is why many introductory algorithm texts introduce 1772 | 2-4 trees just before red–black trees, even though **2-4 trees are not often used in practice**. 1773 | - [ ] [CS 61B Lecture 26: Balanced Search Trees (video)](https://www.youtube.com/watch?v=zqrqYXkth6Q&index=26&list=PL4BBB74C7D2A1049C) 1774 | - [ ] [Bottom Up 234-Trees (video)](https://www.youtube.com/watch?v=DQdMYevEyE4&index=4&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6) 1775 | - [ ] [Top Down 234-Trees (video)](https://www.youtube.com/watch?v=2679VQ26Fp4&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6&index=5) 1776 | 1777 | - [ ] **N-ary (K-ary, M-ary) trees** 1778 | - note: the N or K is the branching factor (max branches) 1779 | - binary trees are a 2-ary tree, with branching factor = 2 1780 | - 2-3 trees are 3-ary 1781 | - [ ] [K-Ary Tree](https://en.wikipedia.org/wiki/K-ary_tree) 1782 | 1783 | - [ ] **B-Trees** 1784 | - fun fact: it's a mystery, but the B could stand for Boeing, Balanced, or Bayer (co-inventor) 1785 | - In Practice: 1786 | B-Trees are widely used in databases. Most modern filesystems use B-trees (or Variants). In addition to 1787 | its use in databases, the B-tree is also used in filesystems to allow quick random access to an arbitrary 1788 | block in a particular file. The basic problem is turning the file block i address into a disk block 1789 | (or perhaps to a cylinder-head-sector) address. 1790 | - [ ] [B-Tree](https://en.wikipedia.org/wiki/B-tree) 1791 | - [ ] [Introduction to B-Trees (video)](https://www.youtube.com/watch?v=I22wEC1tTGo&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6&index=6) 1792 | - [ ] [B-Tree Definition and Insertion (video)](https://www.youtube.com/watch?v=s3bCdZGrgpA&index=7&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6) 1793 | - [ ] [B-Tree Deletion (video)](https://www.youtube.com/watch?v=svfnVhJOfMc&index=8&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6) 1794 | - [ ] [MIT 6.851 - Memory Hierarchy Models (video)](https://www.youtube.com/watch?v=V3omVLzI0WE&index=7&list=PLUl4u3cNGP61hsJNdULdudlRL493b-XZf) 1795 | - covers cache-oblivious B-Trees, very interesting data structures 1796 | - the first 37 minutes are very technical, may be skipped (B is block size, cache line size) 1797 | 1798 | 1799 | - ### k-D Trees 1800 | - great for finding number of points in a rectangle or higher dimension object 1801 | - a good fit for k-nearest neighbors 1802 | - [ ] [Kd Trees (video)](https://www.youtube.com/watch?v=W94M9D_yXKk) 1803 | - [ ] [kNN K-d tree algorithm (video)](https://www.youtube.com/watch?v=Y4ZgLlDfKDg) 1804 | 1805 | - ### Skip lists 1806 | - "These are somewhat of a cult data structure" - Skiena 1807 | - [ ] [Randomization: Skip Lists (video)](https://www.youtube.com/watch?v=2g9OSRKJuzM&index=10&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp) 1808 | - [ ] [For animations and a little more detail](https://en.wikipedia.org/wiki/Skip_list) 1809 | 1810 | - ### Network Flows 1811 | - [ ] [Ford-Fulkerson in 5 minutes (video)](https://www.youtube.com/watch?v=v1VgJmkEJW0) 1812 | - [ ] [Ford-Fulkerson Algorithm (video)](https://www.youtube.com/watch?v=v1VgJmkEJW0) 1813 | - [ ] [Network Flows (video)](https://www.youtube.com/watch?v=2vhN4Ice5jI) 1814 | 1815 | - ### Disjoint Sets & Union Find 1816 | - [ ] [UCB 61B - Disjoint Sets; Sorting & selection (video)](https://www.youtube.com/watch?v=MAEGXTwmUsI&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd&index=21) 1817 | - [ ] [Sedgewick Algorithms - Union-Find (6 videos)](https://www.youtube.com/watch?v=8mYfZeHtdNc&list=PLe-ggMe31CTexoNYnMhbHaWhQ0dvcy43t) 1818 | 1819 | - ### Math for Fast Processing 1820 | - [ ] [Integer Arithmetic, Karatsuba Multiplication (video)](https://www.youtube.com/watch?v=eCaXlAaN2uE&index=11&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb) 1821 | - [ ] [The Chinese Remainder Theorem (used in cryptography) (video)](https://www.youtube.com/watch?v=ru7mWZJlRQg) 1822 | 1823 | - ### Treap 1824 | - Combination of a binary search tree and a heap 1825 | - [ ] [Treap](https://en.wikipedia.org/wiki/Treap) 1826 | - [ ] [Data Structures: Treaps explained (video)](https://www.youtube.com/watch?v=6podLUYinH8) 1827 | - [ ] [Applications in set operations](https://www.cs.cmu.edu/~scandal/papers/treaps-spaa98.pdf) 1828 | 1829 | - ### Linear Programming (videos) 1830 | - [ ] [Linear Programming](https://www.youtube.com/watch?v=M4K6HYLHREQ) 1831 | - [ ] [Finding minimum cost](https://www.youtube.com/watch?v=2ACJ9ewUC6U) 1832 | - [ ] [Finding maximum value](https://www.youtube.com/watch?v=8AA_81xI3ik) 1833 | - [ ] [Solve Linear Equations with Python - Simplex Algorithm](https://www.youtube.com/watch?v=44pAWI7v5Zk) 1834 | 1835 | - ### Geometry, Convex hull (videos) 1836 | - [ ] [Graph Alg. IV: Intro to geometric algorithms - Lecture 9](https://youtu.be/XIAQRlNkJAw?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=3164) 1837 | - [ ] [Geometric Algorithms: Graham & Jarvis - Lecture 10](https://www.youtube.com/watch?v=J5aJEcOr6Eo&index=10&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm) 1838 | - [ ] [Divide & Conquer: Convex Hull, Median Finding](https://www.youtube.com/watch?v=EzeYI7p9MjU&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=2) 1839 | 1840 | - ### Discrete math 1841 | - see videos below 1842 | 1843 | - ### Machine Learning 1844 | - [ ] Why ML? 1845 | - [ ] [How Google Is Remaking Itself As A Machine Learning First Company](https://backchannel.com/how-google-is-remaking-itself-as-a-machine-learning-first-company-ada63defcb70) 1846 | - [ ] [Large-Scale Deep Learning for Intelligent Computer Systems (video)](https://www.youtube.com/watch?v=QSaZGT4-6EY) 1847 | - [ ] [Deep Learning and Understandability versus Software Engineering and Verification by Peter Norvig](https://www.youtube.com/watch?v=X769cyzBNVw) 1848 | - [ ] [Google's Cloud Machine learning tools (video)](https://www.youtube.com/watch?v=Ja2hxBAwG_0) 1849 | - [ ] [Google Developers' Machine Learning Recipes (Scikit Learn & Tensorflow) (video)](https://www.youtube.com/playlist?list=PLOU2XLYxmsIIuiBfYad6rFYQU_jL2ryal) 1850 | - [ ] [Tensorflow (video)](https://www.youtube.com/watch?v=oZikw5k_2FM) 1851 | - [ ] [Tensorflow Tutorials](https://www.tensorflow.org/versions/r0.11/tutorials/index.html) 1852 | - [ ] [Practical Guide to implementing Neural Networks in Python (using Theano)](http://www.analyticsvidhya.com/blog/2016/04/neural-networks-python-theano/) 1853 | - Courses: 1854 | - [Great starter course: Machine Learning](https://www.coursera.org/learn/machine-learning) 1855 | - [videos only](https://www.youtube.com/playlist?list=PLZ9qNFMHZ-A4rycgrgOYma6zxF4BZGGPW) 1856 | - see videos 12-18 for a review of linear algebra (14 and 15 are duplicates) 1857 | - [Neural Networks for Machine Learning](https://www.coursera.org/learn/neural-networks) 1858 | - [Google's Deep Learning Nanodegree](https://www.udacity.com/course/deep-learning--ud730) 1859 | - [Google/Kaggle Machine Learning Engineer Nanodegree](https://www.udacity.com/course/machine-learning-engineer-nanodegree-by-google--nd009) 1860 | - [Self-Driving Car Engineer Nanodegree](https://www.udacity.com/drive) 1861 | - [Metis Online Course ($99 for 2 months)](http://www.thisismetis.com/explore-data-science) 1862 | - Resources: 1863 | - Books: 1864 | - [Python Machine Learning](https://www.amazon.com/Python-Machine-Learning-Sebastian-Raschka/dp/1783555130/) 1865 | - [Data Science from Scratch: First Principles with Python](https://www.amazon.com/Data-Science-Scratch-Principles-Python/dp/149190142X) 1866 | - [Introduction to Machine Learning with Python](https://www.amazon.com/Introduction-Machine-Learning-Python-Scientists/dp/1449369413/) 1867 | - [Machine Learning for Software Engineers](https://github.com/ZuzooVn/machine-learning-for-software-engineers) 1868 | - Data School: http://www.dataschool.io/ 1869 | 1870 | - ### Go 1871 | - [ ] Videos: 1872 | - [ ] [Why Learn Go?](https://www.youtube.com/watch?v=FTl0tl9BGdc) 1873 | - [ ] [Go Programming](https://www.youtube.com/watch?v=CF9S4QZuV30) 1874 | - [ ] [A Tour of Go](https://www.youtube.com/watch?v=ytEkHepK08c) 1875 | - [ ] Books: 1876 | - [ ] [An Introduction to Programming in Go (read free online)](https://www.golang-book.com/books/intro) 1877 | - [ ] [The Go Programming Language (Donovan & Kernighan)](https://www.amazon.com/Programming-Language-Addison-Wesley-Professional-Computing/dp/0134190440) 1878 | - [ ] [Bootcamp](https://www.golang-book.com/guides/bootcamp) 1879 | 1880 | -- 1881 | 1882 | ## Additional Detail on Some Subjects 1883 | 1884 | I added these to reinforce some ideas already presented above, but didn't want to include them 1885 | above because it's just too much. It's easy to overdo it on a subject. 1886 | You want to get hired in this century, right? 1887 | 1888 | - [ ] **Union-Find** 1889 | - [ ] [Overview](https://www.coursera.org/learn/data-structures/lecture/JssSY/overview) 1890 | - [ ] [Naive Implementation](https://www.coursera.org/learn/data-structures/lecture/EM5D0/naive-implementations) 1891 | - [ ] [Trees](https://www.coursera.org/learn/data-structures/lecture/Mxu0w/trees) 1892 | - [ ] [Union By Rank](https://www.coursera.org/learn/data-structures/lecture/qb4c2/union-by-rank) 1893 | - [ ] [Path Compression](https://www.coursera.org/learn/data-structures/lecture/Q9CVI/path-compression) 1894 | - [ ] [Analysis Options](https://www.coursera.org/learn/data-structures/lecture/GQQLN/analysis-optional) 1895 | 1896 | - [ ] **More Dynamic Programming** (videos) 1897 | - [ ] [6.006: Dynamic Programming I: Fibonacci, Shortest Paths](https://www.youtube.com/watch?v=OQ5jsbhAv_M&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=19) 1898 | - [ ] [6.006: Dynamic Programming II: Text Justification, Blackjack](https://www.youtube.com/watch?v=ENyox7kNKeY&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=20) 1899 | - [ ] [6.006: DP III: Parenthesization, Edit Distance, Knapsack](https://www.youtube.com/watch?v=ocZMDMZwhCY&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=21) 1900 | - [ ] [6.006: DP IV: Guitar Fingering, Tetris, Super Mario Bros.](https://www.youtube.com/watch?v=tp4_UXaVyx8&index=22&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb) 1901 | - [ ] [6.046: Dynamic Programming & Advanced DP](https://www.youtube.com/watch?v=Tw1k46ywN6E&index=14&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp) 1902 | - [ ] [6.046: Dynamic Programming: All-Pairs Shortest Paths](https://www.youtube.com/watch?v=NzgFUwOaoIw&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=15) 1903 | - [ ] [6.046: Dynamic Programming (student recitation)](https://www.youtube.com/watch?v=krZI60lKPek&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=12) 1904 | 1905 | - [ ] **Advanced Graph Processing** (videos) 1906 | - [ ] [Synchronous Distributed Algorithms: Symmetry-Breaking. Shortest-Paths Spanning Trees](https://www.youtube.com/watch?v=mUBmcbbJNf4&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=27) 1907 | - [ ] [Asynchronous Distributed Algorithms: Shortest-Paths Spanning Trees](https://www.youtube.com/watch?v=kQ-UQAzcnzA&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=28) 1908 | 1909 | - [ ] MIT **Probability** (mathy, and go slowly, which is good for mathy things) (videos): 1910 | - [ ] [MIT 6.042J - Probability Introduction](https://www.youtube.com/watch?v=SmFwFdESMHI&index=18&list=PLB7540DEDD482705B) 1911 | - [ ] [MIT 6.042J - Conditional Probability](https://www.youtube.com/watch?v=E6FbvM-FGZ8&index=19&list=PLB7540DEDD482705B) 1912 | - [ ] [MIT 6.042J - Independence](https://www.youtube.com/watch?v=l1BCv3qqW4A&index=20&list=PLB7540DEDD482705B) 1913 | - [ ] [MIT 6.042J - Random Variables](https://www.youtube.com/watch?v=MOfhhFaQdjw&list=PLB7540DEDD482705B&index=21) 1914 | - [ ] [MIT 6.042J - Expectation I](https://www.youtube.com/watch?v=gGlMSe7uEkA&index=22&list=PLB7540DEDD482705B) 1915 | - [ ] [MIT 6.042J - Expectation II](https://www.youtube.com/watch?v=oI9fMUqgfxY&index=23&list=PLB7540DEDD482705B) 1916 | - [ ] [MIT 6.042J - Large Deviations](https://www.youtube.com/watch?v=q4mwO2qS2z4&index=24&list=PLB7540DEDD482705B) 1917 | - [ ] [MIT 6.042J - Random Walks](https://www.youtube.com/watch?v=56iFMY8QW2k&list=PLB7540DEDD482705B&index=25) 1918 | 1919 | - [ ] [Simonson: Approximation Algorithms (video)](https://www.youtube.com/watch?v=oDniZCmNmNw&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=19) 1920 | 1921 | - [ ] **String Matching** 1922 | - [ ] Rabin-Karp (videos): 1923 | - [Rabin Karps Algorithm](https://www.coursera.org/learn/data-structures/lecture/c0Qkw/rabin-karps-algorithm) 1924 | - [Precomputing](https://www.coursera.org/learn/data-structures/lecture/nYrc8/optimization-precomputation) 1925 | - [Optimization: Implementation and Analysis](https://www.coursera.org/learn/data-structures/lecture/h4ZLc/optimization-implementation-and-analysis) 1926 | - [Table Doubling, Karp-Rabin](https://www.youtube.com/watch?v=BRO7mVIFt08&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=9) 1927 | - [Rolling Hashes, Amortized Analysis](https://www.youtube.com/watch?v=w6nuXg0BISo&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=32) 1928 | - [ ] Knuth-Morris-Pratt (KMP): 1929 | - [TThe Knuth-Morris-Pratt (KMP) String Matching Algorithm](https://www.youtube.com/watch?v=5i7oKodCRJo) 1930 | - [ ] Boyer–Moore string search algorithm 1931 | - [Boyer-Moore String Search Algorithm](https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm) 1932 | - [Advanced String Searching Boyer-Moore-Horspool Algorithms (video)](https://www.youtube.com/watch?v=QDZpzctPf10) 1933 | - [ ] [Coursera: Algorithms on Strings](https://www.coursera.org/learn/algorithms-on-strings/home/week/1) 1934 | - starts off great, but by the time it gets past KMP it gets more complicated than it needs to be 1935 | - nice explanation of tries 1936 | - can be skipped 1937 | 1938 | - [ ] **Sorting** 1939 | 1940 | - [ ] Stanford lectures on sorting: 1941 | - [ ] [Lecture 15 | Programming Abstractions (video)](https://www.youtube.com/watch?v=ENp00xylP7c&index=15&list=PLFE6E58F856038C69) 1942 | - [ ] [Lecture 16 | Programming Abstractions (video)](https://www.youtube.com/watch?v=y4M9IVgrVKo&index=16&list=PLFE6E58F856038C69) 1943 | - [ ] Shai Simonson, [Aduni.org](http://www.aduni.org/): 1944 | - [ ] [Algorithms - Sorting - Lecture 2 (video)](https://www.youtube.com/watch?v=odNJmw5TOEE&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=2) 1945 | - [ ] [Algorithms - Sorting II - Lecture 3 (video)](https://www.youtube.com/watch?v=hj8YKFTFKEE&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=3) 1946 | - [ ] Steven Skiena lectures on sorting: 1947 | - [ ] [lecture begins at 26:46 (video)](https://youtu.be/ute-pmMkyuk?list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&t=1600) 1948 | - [ ] [lecture begins at 27:40 (video)](https://www.youtube.com/watch?v=yLvp-pB8mak&index=8&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b) 1949 | - [ ] [lecture begins at 35:00 (video)](https://www.youtube.com/watch?v=q7K9otnzlfE&index=9&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b) 1950 | - [ ] [lecture begins at 23:50 (video)](https://www.youtube.com/watch?v=TvqIGu9Iupw&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=10) 1951 | 1952 | ## Video Series 1953 | 1954 | Sit back and enjoy. "Netflix and skill" :P 1955 | 1956 | - [ ] [List of individual Dynamic Programming problems (each is short)](https://www.youtube.com/playlist?list=PLrmLmBdmIlpsHaNTPP_jHHDx_os9ItYXr) 1957 | 1958 | - [ ] [x86 Architecture, Assembly, Applications (11 videos)](https://www.youtube.com/playlist?list=PL038BE01D3BAEFDB0) 1959 | 1960 | - [ ] [MIT 18.06 Linear Algebra, Spring 2005 (35 videos)](https://www.youtube.com/playlist?list=PLE7DDD91010BC51F8) 1961 | 1962 | - [ ] [Excellent - MIT Calculus Revisited: Single Variable Calculus](https://www.youtube.com/playlist?list=PL3B08AE665AB9002A) 1963 | 1964 | - [ ] [Computer Science 70, 001 - Spring 2015 - Discrete Mathematics and Probability Theory](https://www.youtube.com/playlist?list=PL-XXv-cvA_iD8wQm8U0gG_Z1uHjImKXFy) 1965 | 1966 | - [ ] [Discrete Mathematics by Shai Simonson (19 videos)](https://www.youtube.com/playlist?list=PL3o9D4Dl2FJ9q0_gtFXPh_H4POI5dK0yG) 1967 | 1968 | - [ ] [Discrete Mathematics Part 1 by Sarada Herke (5 videos)](https://www.youtube.com/playlist?list=PLGxuz-nmYlQPOc4w1Kp2MZrdqOOm4Jxeo) 1969 | 1970 | - [ ] CSE373 - Analysis of Algorithms (25 videos) 1971 | - [Skiena lectures from Algorithm Design Manual](https://www.youtube.com/watch?v=ZFjhkohHdAA&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=1) 1972 | 1973 | - [ ] [UC Berkeley 61B (Spring 2014): Data Structures (25 videos)](https://www.youtube.com/watch?v=mFPmKGIrQs4&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd) 1974 | 1975 | - [ ] [UC Berkeley 61B (Fall 2006): Data Structures (39 videos)](https://www.youtube.com/playlist?list=PL4BBB74C7D2A1049C) 1976 | 1977 | - [ ] [UC Berkeley 61C: Machine Structures (26 videos)](https://www.youtube.com/watch?v=gJJeUFyuvvg&list=PL-XXv-cvA_iCl2-D-FS5mk0jFF6cYSJs_) 1978 | 1979 | - [ ] [OOSE: Software Dev Using UML and Java (21 videos)](https://www.youtube.com/playlist?list=PLJ9pm_Rc9HesnkwKlal_buSIHA-jTZMpO) 1980 | 1981 | - [ ] [UC Berkeley CS 152: Computer Architecture and Engineering (20 videos)](https://www.youtube.com/watch?v=UH0QYvtP7Rk&index=20&list=PLkFD6_40KJIwEiwQx1dACXwh-2Fuo32qr) 1982 | 1983 | - [ ] [MIT 6.004: Computation Structures (49 videos)](https://www.youtube.com/playlist?list=PLrRW1w6CGAcXbMtDFj205vALOGmiRc82-) 1984 | 1985 | - [ ] [Carnegie Mellon - Computer Architecture Lectures (39 videos)](https://www.youtube.com/playlist?list=PL5PHm2jkkXmi5CxxI7b3JCL1TWybTDtKq) 1986 | 1987 | - [ ] [MIT 6.006: Intro to Algorithms (47 videos)](https://www.youtube.com/watch?v=HtSuA80QTyo&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&nohtml5=False) 1988 | 1989 | - [ ] [MIT 6.033: Computer System Engineering (22 videos)](https://www.youtube.com/watch?v=zm2VP0kHl1M&list=PL6535748F59DCA484) 1990 | 1991 | - [ ] [MIT 6.034 Artificial Intelligence, Fall 2010 (30 videos)](https://www.youtube.com/playlist?list=PLUl4u3cNGP63gFHB6xb-kVBiQHYe_4hSi) 1992 | 1993 | - [ ] [MIT 6.042J: Mathematics for Computer Science, Fall 2010 (25 videos)](https://www.youtube.com/watch?v=L3LMbpZIKhQ&list=PLB7540DEDD482705B) 1994 | 1995 | - [ ] [MIT 6.046: Design and Analysis of Algorithms (34 videos)](https://www.youtube.com/watch?v=2P-yW7LQr08&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp) 1996 | 1997 | - [ ] [MIT 6.050J: Information and Entropy, Spring 2008 (19 videos)](https://www.youtube.com/watch?v=phxsQrZQupo&list=PL_2Bwul6T-A7OldmhGODImZL8KEVE38X7) 1998 | 1999 | - [ ] [MIT 6.851: Advanced Data Structures (22 videos)](https://www.youtube.com/watch?v=T0yzrZL1py0&list=PLUl4u3cNGP61hsJNdULdudlRL493b-XZf&index=1) 2000 | 2001 | - [ ] [MIT 6.854: Advanced Algorithms, Spring 2016 (24 videos)](https://www.youtube.com/playlist?list=PL6ogFv-ieghdoGKGg2Bik3Gl1glBTEu8c) 2002 | 2003 | - [ ] [Harvard COMPSCI 224: Advanced Algorithms (25 videos)](https://www.youtube.com/playlist?list=PL2SOU6wwxB0uP4rJgf5ayhHWgw7akUWSf) 2004 | 2005 | - [ ] [MIT 6.858 Computer Systems Security, Fall 2014](https://www.youtube.com/watch?v=GqmQg-cszw4&index=1&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh) 2006 | 2007 | - [ ] [Stanford: Programming Paradigms (27 videos)](https://www.youtube.com/view_play_list?p=9D558D49CA734A02) 2008 | 2009 | - [ ] [Introduction to Cryptography by Christof Paar](https://www.youtube.com/playlist?list=PL6N5qY2nvvJE8X75VkXglSrVhLv1tVcfy) 2010 | - [Course Website along with Slides and Problem Sets](http://www.crypto-textbook.com/) 2011 | 2012 | - [ ] [Mining Massive Datasets - Stanford University (94 videos)](https://www.youtube.com/playlist?list=PLLssT5z_DsK9JDLcT8T62VtzwyW9LNepV) 2013 | 2014 | - [ ] [Graph Theory by Sarada Herke (67 videos)](https://www.youtube.com/user/DrSaradaHerke/playlists?shelf_id=5&view=50&sort=dd) 2015 | 2016 | ## Computer Science Courses 2017 | 2018 | - [Directory of Online CS Courses](https://github.com/open-source-society/computer-science) 2019 | - [Directory of CS Courses (many with online lectures)](https://github.com/prakhar1989/awesome-courses) 2020 | --------------------------------------------------------------------------------