├── .github ├── FUNDING.yml └── workflows │ └── links_checker.yml ├── .gitignore ├── LICENSE.txt ├── README.md ├── extras └── cheat sheets │ ├── C Reference Card (ANSI) 2.2.pdf │ ├── Coding Interview Python Language Essentials.pdf │ ├── Cpp_reference.pdf │ ├── Java Fundamentals Cheatsheet.pdf │ ├── STL Quick Reference 1.29.pdf │ ├── big-o-cheatsheet.pdf │ ├── bits-cheat-sheet.pdf │ ├── git-cheat-sheet-education.pdf │ ├── python-cheat-sheet-v1.pdf │ └── system-design.pdf ├── programming-language-resources.md └── translations ├── README-af.md ├── README-ar.md ├── README-bg.md ├── README-bn.md ├── README-cn.md ├── README-de.md ├── README-el.md ├── README-es.md ├── README-fa.md ├── README-fr.md ├── README-he.md ├── README-hi.md ├── README-id.md ├── README-it.md ├── README-ja.md ├── README-kh.md ├── README-ko.md ├── README-pl.md ├── README-ptbr.md ├── README-ru.md ├── README-th.md ├── README-tr.md ├── README-tw.md ├── README-uk.md ├── README-ur.md ├── README-uz.md ├── README-vi.md └── how-to.md /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: jwasham 2 | -------------------------------------------------------------------------------- /.github/workflows/links_checker.yml: -------------------------------------------------------------------------------- 1 | name: Links Checker 2 | 3 | on: 4 | ## Allow triggering this workflow manually via GitHub CLI/web 5 | workflow_dispatch: 6 | 7 | ## Run this workflow automatically every month 8 | schedule: 9 | - cron: '0 0 1 * *' 10 | 11 | jobs: 12 | link_checker: 13 | name: Check links and create automated issue if needed 14 | runs-on: ubuntu-latest 15 | env: 16 | REPORT_FILE: links-report 17 | steps: 18 | ## Check out code using Git 19 | - uses: actions/checkout@v3 20 | 21 | - name: Check all links at README.md but skips translations files 22 | id: lychee 23 | uses: lycheeverse/lychee-action@v1.4.1 24 | with: 25 | output: ${{ env.REPORT_FILE }} 26 | format: markdown 27 | ## Do not fail this step on broken links 28 | fail: false 29 | ## Allow pages replying with 200 (Ok), 204 (No Content), 30 | ## 206 (Partial Content) in at most 20 seconds with HTML content. 31 | args: >- 32 | --verbose 33 | --accept 200,204,206 34 | --headers "accept=text/html" 35 | --timeout 20 36 | --max-concurrency 10 37 | --no-progress 38 | README.md 39 | env: 40 | ## Avoid rate limiting when checking github.com links 41 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 42 | 43 | - name: Lychee's exit code 44 | ## https://github.com/lycheeverse/lychee#exit-codes 45 | run: echo Lychee exit with ${{ steps.lychee.outputs.exit_code }} 46 | 47 | - name: Find the last report issue open 48 | uses: micalevisk/last-issue-action@v1.2 49 | id: last_issue 50 | with: 51 | state: open 52 | labels: | 53 | report 54 | automated issue 55 | env: 56 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 57 | 58 | - name: Create issue from report file 59 | if: ${{ steps.last_issue.outputs.has_found == 'false' }} 60 | uses: peter-evans/create-issue-from-file@v4 61 | with: 62 | title: Link checker report 63 | content-filepath: ${{ env.REPORT_FILE }} 64 | issue-number: ${{ steps.last_issue.outputs.issue_number }} 65 | labels: | 66 | report 67 | automated issue 68 | 69 | - name: Update last report open issue created 70 | if: ${{ steps.last_issue.outputs.has_found == 'true' }} 71 | uses: peter-evans/create-issue-from-file@v4 72 | with: 73 | title: Link checker report 74 | content-filepath: ${{ env.REPORT_FILE }} 75 | issue-number: ${{ steps.last_issue.outputs.issue_number }} 76 | labels: | 77 | report 78 | automated issue 79 | 80 | - name: Close last report open issue 81 | if: ${{ steps.lychee.outputs.exit_code == 0 }} 82 | uses: peter-evans/close-issue@v2 83 | with: 84 | issue-number: ${{ steps.last_issue.outputs.issue_number }} 85 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | *.iml 3 | personal-9894.md 4 | 5 | # Targets Windows & Unix temporary files 6 | ~$* 7 | *~ 8 | 9 | # OS generated files # 10 | ###################### 11 | .DS_Store 12 | .DS_Store? 13 | ._* 14 | .Spotlight-V100 15 | .Trashes 16 | ehthumbs.db 17 | Thumbs.db 18 | 19 | # Sublime Files 20 | .sublime -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Attribution-ShareAlike 4.0 International 2 | 3 | ======================================================================= 4 | 5 | Creative Commons Corporation ("Creative Commons") is not a law firm and 6 | does not provide legal services or legal advice. Distribution of 7 | Creative Commons public licenses does not create a lawyer-client or 8 | other relationship. Creative Commons makes its licenses and related 9 | information available on an "as-is" basis. Creative Commons gives no 10 | warranties regarding its licenses, any material licensed under their 11 | terms and conditions, or any related information. Creative Commons 12 | disclaims all liability for damages resulting from their use to the 13 | fullest extent possible. 14 | 15 | Using Creative Commons Public Licenses 16 | 17 | Creative Commons public licenses provide a standard set of terms and 18 | conditions that creators and other rights holders may use to share 19 | original works of authorship and other material subject to copyright 20 | and certain other rights specified in the public license below. The 21 | following considerations are for informational purposes only, are not 22 | exhaustive, and do not form part of our licenses. 23 | 24 | Considerations for licensors: Our public licenses are 25 | intended for use by those authorized to give the public 26 | permission to use material in ways otherwise restricted by 27 | copyright and certain other rights. Our licenses are 28 | irrevocable. Licensors should read and understand the terms 29 | and conditions of the license they choose before applying it. 30 | Licensors should also secure all rights necessary before 31 | applying our licenses so that the public can reuse the 32 | material as expected. Licensors should clearly mark any 33 | material not subject to the license. This includes other CC- 34 | licensed material, or material used under an exception or 35 | limitation to copyright. More considerations for licensors: 36 | wiki.creativecommons.org/Considerations_for_licensors 37 | 38 | Considerations for the public: By using one of our public 39 | licenses, a licensor grants the public permission to use the 40 | licensed material under specified terms and conditions. If 41 | the licensor's permission is not necessary for any reason--for 42 | example, because of any applicable exception or limitation to 43 | copyright--then that use is not regulated by the license. Our 44 | licenses grant only permissions under copyright and certain 45 | other rights that a licensor has authority to grant. Use of 46 | the licensed material may still be restricted for other 47 | reasons, including because others have copyright or other 48 | rights in the material. A licensor may make special requests, 49 | such as asking that all changes be marked or described. 50 | Although not required by our licenses, you are encouraged to 51 | respect those requests where reasonable. More_considerations 52 | for the public: 53 | wiki.creativecommons.org/Considerations_for_licensees 54 | 55 | ======================================================================= 56 | 57 | Creative Commons Attribution-ShareAlike 4.0 International Public 58 | License 59 | 60 | By exercising the Licensed Rights (defined below), You accept and agree 61 | to be bound by the terms and conditions of this Creative Commons 62 | Attribution-ShareAlike 4.0 International Public License ("Public 63 | License"). To the extent this Public License may be interpreted as a 64 | contract, You are granted the Licensed Rights in consideration of Your 65 | acceptance of these terms and conditions, and the Licensor grants You 66 | such rights in consideration of benefits the Licensor receives from 67 | making the Licensed Material available under these terms and 68 | conditions. 69 | 70 | 71 | Section 1 -- Definitions. 72 | 73 | a. Adapted Material means material subject to Copyright and Similar 74 | Rights that is derived from or based upon the Licensed Material 75 | and in which the Licensed Material is translated, altered, 76 | arranged, transformed, or otherwise modified in a manner requiring 77 | permission under the Copyright and Similar Rights held by the 78 | Licensor. For purposes of this Public License, where the Licensed 79 | Material is a musical work, performance, or sound recording, 80 | Adapted Material is always produced where the Licensed Material is 81 | synched in timed relation with a moving image. 82 | 83 | b. Adapter's License means the license You apply to Your Copyright 84 | and Similar Rights in Your contributions to Adapted Material in 85 | accordance with the terms and conditions of this Public License. 86 | 87 | c. BY-SA Compatible License means a license listed at 88 | creativecommons.org/compatiblelicenses, approved by Creative 89 | Commons as essentially the equivalent of this Public License. 90 | 91 | d. Copyright and Similar Rights means copyright and/or similar rights 92 | closely related to copyright including, without limitation, 93 | performance, broadcast, sound recording, and Sui Generis Database 94 | Rights, without regard to how the rights are labeled or 95 | categorized. For purposes of this Public License, the rights 96 | specified in Section 2(b)(1)-(2) are not Copyright and Similar 97 | Rights. 98 | 99 | e. Effective Technological Measures means those measures that, in the 100 | absence of proper authority, may not be circumvented under laws 101 | fulfilling obligations under Article 11 of the WIPO Copyright 102 | Treaty adopted on December 20, 1996, and/or similar international 103 | agreements. 104 | 105 | f. Exceptions and Limitations means fair use, fair dealing, and/or 106 | any other exception or limitation to Copyright and Similar Rights 107 | that applies to Your use of the Licensed Material. 108 | 109 | g. License Elements means the license attributes listed in the name 110 | of a Creative Commons Public License. The License Elements of this 111 | Public License are Attribution and ShareAlike. 112 | 113 | h. Licensed Material means the artistic or literary work, database, 114 | or other material to which the Licensor applied this Public 115 | License. 116 | 117 | i. Licensed Rights means the rights granted to You subject to the 118 | terms and conditions of this Public License, which are limited to 119 | all Copyright and Similar Rights that apply to Your use of the 120 | Licensed Material and that the Licensor has authority to license. 121 | 122 | j. Licensor means the individual(s) or entity(ies) granting rights 123 | under this Public License. 124 | 125 | k. Share means to provide material to the public by any means or 126 | process that requires permission under the Licensed Rights, such 127 | as reproduction, public display, public performance, distribution, 128 | dissemination, communication, or importation, and to make material 129 | available to the public including in ways that members of the 130 | public may access the material from a place and at a time 131 | individually chosen by them. 132 | 133 | l. Sui Generis Database Rights means rights other than copyright 134 | resulting from Directive 96/9/EC of the European Parliament and of 135 | the Council of 11 March 1996 on the legal protection of databases, 136 | as amended and/or succeeded, as well as other essentially 137 | equivalent rights anywhere in the world. 138 | 139 | m. You means the individual or entity exercising the Licensed Rights 140 | under this Public License. Your has a corresponding meaning. 141 | 142 | 143 | Section 2 -- Scope. 144 | 145 | a. License grant. 146 | 147 | 1. Subject to the terms and conditions of this Public License, 148 | the Licensor hereby grants You a worldwide, royalty-free, 149 | non-sublicensable, non-exclusive, irrevocable license to 150 | exercise the Licensed Rights in the Licensed Material to: 151 | 152 | a. reproduce and Share the Licensed Material, in whole or 153 | in part; and 154 | 155 | b. produce, reproduce, and Share Adapted Material. 156 | 157 | 2. Exceptions and Limitations. For the avoidance of doubt, where 158 | Exceptions and Limitations apply to Your use, this Public 159 | License does not apply, and You do not need to comply with 160 | its terms and conditions. 161 | 162 | 3. Term. The term of this Public License is specified in Section 163 | 6(a). 164 | 165 | 4. Media and formats; technical modifications allowed. The 166 | Licensor authorizes You to exercise the Licensed Rights in 167 | all media and formats whether now known or hereafter created, 168 | and to make technical modifications necessary to do so. The 169 | Licensor waives and/or agrees not to assert any right or 170 | authority to forbid You from making technical modifications 171 | necessary to exercise the Licensed Rights, including 172 | technical modifications necessary to circumvent Effective 173 | Technological Measures. For purposes of this Public License, 174 | simply making modifications authorized by this Section 2(a) 175 | (4) never produces Adapted Material. 176 | 177 | 5. Downstream recipients. 178 | 179 | a. Offer from the Licensor -- Licensed Material. Every 180 | recipient of the Licensed Material automatically 181 | receives an offer from the Licensor to exercise the 182 | Licensed Rights under the terms and conditions of this 183 | Public License. 184 | 185 | b. Additional offer from the Licensor -- Adapted Material. 186 | Every recipient of Adapted Material from You 187 | automatically receives an offer from the Licensor to 188 | exercise the Licensed Rights in the Adapted Material 189 | under the conditions of the Adapter's License You apply. 190 | 191 | c. No downstream restrictions. You may not offer or impose 192 | any additional or different terms or conditions on, or 193 | apply any Effective Technological Measures to, the 194 | Licensed Material if doing so restricts exercise of the 195 | Licensed Rights by any recipient of the Licensed 196 | Material. 197 | 198 | 6. No endorsement. Nothing in this Public License constitutes or 199 | may be construed as permission to assert or imply that You 200 | are, or that Your use of the Licensed Material is, connected 201 | with, or sponsored, endorsed, or granted official status by, 202 | the Licensor or others designated to receive attribution as 203 | provided in Section 3(a)(1)(A)(i). 204 | 205 | b. Other rights. 206 | 207 | 1. Moral rights, such as the right of integrity, are not 208 | licensed under this Public License, nor are publicity, 209 | privacy, and/or other similar personality rights; however, to 210 | the extent possible, the Licensor waives and/or agrees not to 211 | assert any such rights held by the Licensor to the limited 212 | extent necessary to allow You to exercise the Licensed 213 | Rights, but not otherwise. 214 | 215 | 2. Patent and trademark rights are not licensed under this 216 | Public License. 217 | 218 | 3. To the extent possible, the Licensor waives any right to 219 | collect royalties from You for the exercise of the Licensed 220 | Rights, whether directly or through a collecting society 221 | under any voluntary or waivable statutory or compulsory 222 | licensing scheme. In all other cases the Licensor expressly 223 | reserves any right to collect such royalties. 224 | 225 | 226 | Section 3 -- License Conditions. 227 | 228 | Your exercise of the Licensed Rights is expressly made subject to the 229 | following conditions. 230 | 231 | a. Attribution. 232 | 233 | 1. If You Share the Licensed Material (including in modified 234 | form), You must: 235 | 236 | a. retain the following if it is supplied by the Licensor 237 | with the Licensed Material: 238 | 239 | i. identification of the creator(s) of the Licensed 240 | Material and any others designated to receive 241 | attribution, in any reasonable manner requested by 242 | the Licensor (including by pseudonym if 243 | designated); 244 | 245 | ii. a copyright notice; 246 | 247 | iii. a notice that refers to this Public License; 248 | 249 | iv. a notice that refers to the disclaimer of 250 | warranties; 251 | 252 | v. a URI or hyperlink to the Licensed Material to the 253 | extent reasonably practicable; 254 | 255 | b. indicate if You modified the Licensed Material and 256 | retain an indication of any previous modifications; and 257 | 258 | c. indicate the Licensed Material is licensed under this 259 | Public License, and include the text of, or the URI or 260 | hyperlink to, this Public License. 261 | 262 | 2. You may satisfy the conditions in Section 3(a)(1) in any 263 | reasonable manner based on the medium, means, and context in 264 | which You Share the Licensed Material. For example, it may be 265 | reasonable to satisfy the conditions by providing a URI or 266 | hyperlink to a resource that includes the required 267 | information. 268 | 269 | 3. If requested by the Licensor, You must remove any of the 270 | information required by Section 3(a)(1)(A) to the extent 271 | reasonably practicable. 272 | 273 | b. ShareAlike. 274 | 275 | In addition to the conditions in Section 3(a), if You Share 276 | Adapted Material You produce, the following conditions also apply. 277 | 278 | 1. The Adapter's License You apply must be a Creative Commons 279 | license with the same License Elements, this version or 280 | later, or a BY-SA Compatible License. 281 | 282 | 2. You must include the text of, or the URI or hyperlink to, the 283 | Adapter's License You apply. You may satisfy this condition 284 | in any reasonable manner based on the medium, means, and 285 | context in which You Share Adapted Material. 286 | 287 | 3. You may not offer or impose any additional or different terms 288 | or conditions on, or apply any Effective Technological 289 | Measures to, Adapted Material that restrict exercise of the 290 | rights granted under the Adapter's License You apply. 291 | 292 | 293 | Section 4 -- Sui Generis Database Rights. 294 | 295 | Where the Licensed Rights include Sui Generis Database Rights that 296 | apply to Your use of the Licensed Material: 297 | 298 | a. for the avoidance of doubt, Section 2(a)(1) grants You the right 299 | to extract, reuse, reproduce, and Share all or a substantial 300 | portion of the contents of the database; 301 | 302 | b. if You include all or a substantial portion of the database 303 | contents in a database in which You have Sui Generis Database 304 | Rights, then the database in which You have Sui Generis Database 305 | Rights (but not its individual contents) is Adapted Material, 306 | 307 | including for purposes of Section 3(b); and 308 | c. You must comply with the conditions in Section 3(a) if You Share 309 | all or a substantial portion of the contents of the database. 310 | 311 | For the avoidance of doubt, this Section 4 supplements and does not 312 | replace Your obligations under this Public License where the Licensed 313 | Rights include other Copyright and Similar Rights. 314 | 315 | 316 | Section 5 -- Disclaimer of Warranties and Limitation of Liability. 317 | 318 | a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE 319 | EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS 320 | AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF 321 | ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, 322 | IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, 323 | WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR 324 | PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, 325 | ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT 326 | KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT 327 | ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. 328 | 329 | b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE 330 | TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, 331 | NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, 332 | INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, 333 | COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR 334 | USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN 335 | ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR 336 | DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR 337 | IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. 338 | 339 | c. The disclaimer of warranties and limitation of liability provided 340 | above shall be interpreted in a manner that, to the extent 341 | possible, most closely approximates an absolute disclaimer and 342 | waiver of all liability. 343 | 344 | 345 | Section 6 -- Term and Termination. 346 | 347 | a. This Public License applies for the term of the Copyright and 348 | Similar Rights licensed here. However, if You fail to comply with 349 | this Public License, then Your rights under this Public License 350 | terminate automatically. 351 | 352 | b. Where Your right to use the Licensed Material has terminated under 353 | Section 6(a), it reinstates: 354 | 355 | 1. automatically as of the date the violation is cured, provided 356 | it is cured within 30 days of Your discovery of the 357 | violation; or 358 | 359 | 2. upon express reinstatement by the Licensor. 360 | 361 | For the avoidance of doubt, this Section 6(b) does not affect any 362 | right the Licensor may have to seek remedies for Your violations 363 | of this Public License. 364 | 365 | c. For the avoidance of doubt, the Licensor may also offer the 366 | Licensed Material under separate terms or conditions or stop 367 | distributing the Licensed Material at any time; however, doing so 368 | will not terminate this Public License. 369 | 370 | d. Sections 1, 5, 6, 7, and 8 survive termination of this Public 371 | License. 372 | 373 | 374 | Section 7 -- Other Terms and Conditions. 375 | 376 | a. The Licensor shall not be bound by any additional or different 377 | terms or conditions communicated by You unless expressly agreed. 378 | 379 | b. Any arrangements, understandings, or agreements regarding the 380 | Licensed Material not stated herein are separate from and 381 | independent of the terms and conditions of this Public License. 382 | 383 | 384 | Section 8 -- Interpretation. 385 | 386 | a. For the avoidance of doubt, this Public License does not, and 387 | shall not be interpreted to, reduce, limit, restrict, or impose 388 | conditions on any use of the Licensed Material that could lawfully 389 | be made without permission under this Public License. 390 | 391 | b. To the extent possible, if any provision of this Public License is 392 | deemed unenforceable, it shall be automatically reformed to the 393 | minimum extent necessary to make it enforceable. If the provision 394 | cannot be reformed, it shall be severed from this Public License 395 | without affecting the enforceability of the remaining terms and 396 | conditions. 397 | 398 | c. No term or condition of this Public License will be waived and no 399 | failure to comply consented to unless expressly agreed to by the 400 | Licensor. 401 | 402 | d. Nothing in this Public License constitutes or may be interpreted 403 | as a limitation upon, or waiver of, any privileges and immunities 404 | that apply to the Licensor or You, including from the legal 405 | processes of any jurisdiction or authority. 406 | 407 | 408 | ======================================================================= 409 | 410 | Creative Commons is not a party to its public 411 | licenses. Notwithstanding, Creative Commons may elect to apply one of 412 | its public licenses to material it publishes and in those instances 413 | will be considered the “Licensor.” The text of the Creative Commons 414 | public licenses is dedicated to the public domain under the CC0 Public 415 | Domain Dedication. Except for the limited purpose of indicating that 416 | material is shared under a Creative Commons public license or as 417 | otherwise permitted by the Creative Commons policies published at 418 | creativecommons.org/policies, Creative Commons does not authorize the 419 | use of the trademark "Creative Commons" or any other trademark or logo 420 | of Creative Commons without its prior written consent including, 421 | without limitation, in connection with any unauthorized modifications 422 | to any of its public licenses or any other arrangements, 423 | understandings, or agreements concerning use of licensed material. For 424 | the avoidance of doubt, this paragraph does not form part of the 425 | public licenses. 426 | 427 | Creative Commons may be contacted at creativecommons.org. -------------------------------------------------------------------------------- /extras/cheat sheets/C Reference Card (ANSI) 2.2.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tssovi/coding-interview-university/56387ecb5fd90b965edfbdc5c9a3ddafaa395358/extras/cheat sheets/C Reference Card (ANSI) 2.2.pdf -------------------------------------------------------------------------------- /extras/cheat sheets/Coding Interview Python Language Essentials.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tssovi/coding-interview-university/56387ecb5fd90b965edfbdc5c9a3ddafaa395358/extras/cheat sheets/Coding Interview Python Language Essentials.pdf -------------------------------------------------------------------------------- /extras/cheat sheets/Cpp_reference.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tssovi/coding-interview-university/56387ecb5fd90b965edfbdc5c9a3ddafaa395358/extras/cheat sheets/Cpp_reference.pdf -------------------------------------------------------------------------------- /extras/cheat sheets/Java Fundamentals Cheatsheet.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tssovi/coding-interview-university/56387ecb5fd90b965edfbdc5c9a3ddafaa395358/extras/cheat sheets/Java Fundamentals Cheatsheet.pdf -------------------------------------------------------------------------------- /extras/cheat sheets/STL Quick Reference 1.29.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tssovi/coding-interview-university/56387ecb5fd90b965edfbdc5c9a3ddafaa395358/extras/cheat sheets/STL Quick Reference 1.29.pdf -------------------------------------------------------------------------------- /extras/cheat sheets/big-o-cheatsheet.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tssovi/coding-interview-university/56387ecb5fd90b965edfbdc5c9a3ddafaa395358/extras/cheat sheets/big-o-cheatsheet.pdf -------------------------------------------------------------------------------- /extras/cheat sheets/bits-cheat-sheet.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tssovi/coding-interview-university/56387ecb5fd90b965edfbdc5c9a3ddafaa395358/extras/cheat sheets/bits-cheat-sheet.pdf -------------------------------------------------------------------------------- /extras/cheat sheets/git-cheat-sheet-education.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tssovi/coding-interview-university/56387ecb5fd90b965edfbdc5c9a3ddafaa395358/extras/cheat sheets/git-cheat-sheet-education.pdf -------------------------------------------------------------------------------- /extras/cheat sheets/python-cheat-sheet-v1.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tssovi/coding-interview-university/56387ecb5fd90b965edfbdc5c9a3ddafaa395358/extras/cheat sheets/python-cheat-sheet-v1.pdf -------------------------------------------------------------------------------- /extras/cheat sheets/system-design.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tssovi/coding-interview-university/56387ecb5fd90b965edfbdc5c9a3ddafaa395358/extras/cheat sheets/system-design.pdf -------------------------------------------------------------------------------- /programming-language-resources.md: -------------------------------------------------------------------------------- 1 | ## Programming Language Resources 2 | 3 | - C 4 | - [ANSI C Cheat Sheet]() 5 | - [K&R C book (ANSI C)](https://www.amazon.com/Programming-Language-2nd-Brian-Kernighan/dp/0131103628) 6 | - [Make, Clang (video)](https://www.youtube.com/watch?v=U3zCxnj2w8M) 7 | - [Top C Programming Interview Questions](https://www.interviewbit.com/c-interview-questions) 8 | - GDB: 9 | - [Harvard CS50 - GDB (video)](https://www.youtube.com/watch?v=USPvePv1uzE) 10 | - [Harvard CS50 - GDB (video)](https://www.youtube.com/watch?v=y5JmQItfFck) 11 | - [Valgrind (video)](https://www.youtube.com/watch?v=fvTsFjDuag8) 12 | - [Let us C](https://books.google.co.in/books/about/Let_Us_C.html?id=7HrjAAAACAAJ) 13 | - [Complete C programming for beginners](https://youtu.be/KJgsSFOSQv0) 14 | - [Learn C in Detail](https://www.scaler.com/topics/c/) 15 | 16 | - C++ 17 | - [C++ Cheat Sheet](https://github.com/jwasham/coding-interview-university/blob/main/extras/cheat%20sheets/Cpp_reference.pdf) 18 | - [STL Cheat Sheet](https://github.com/jwasham/coding-interview-university/blob/main/extras/cheat%20sheets/STL%20Quick%20Reference%201.29.pdf) 19 | - [basics](https://www.tutorialspoint.com/cplusplus/cpp_basic_syntax.htm) 20 | - [pointers](https://www.cprogramming.com/tutorial/lesson6.html) 21 | - [class and object](https://www.cprogramming.com/tutorial/lesson12.html) 22 | - [functions](https://www.cprogramming.com/tutorial/lesson4.html) 23 | - [references](https://www.geeksforgeeks.org/references-in-c/) 24 | - [templates](https://www.cprogramming.com/tutorial/templates.html) 25 | - [compilation](https://www.youtube.com/watch?v=ZTu0kf-7h08) 26 | - [scope & linkage](https://www.learncpp.com/cpp-tutorial/scope-duration-and-linkage-summary/) 27 | - [namespaces](https://www.tutorialspoint.com/cplusplus/cpp_namespaces.htm) 28 | - [OOP](https://www.geeksforgeeks.org/object-oriented-programming-in-cpp/) 29 | - [STL](https://www.hackerearth.com/practice/notes/standard-template-library/) 30 | - [functors](http://www.cprogramming.com/tutorial/functors-function-objects-in-c++.html) 31 | - [C++ at Google (video)](https://www.youtube.com/watch?v=NOCElcMcFik) 32 | - [Google C++ Style Guide](https://google.github.io/styleguide/cppguide.html) 33 | - Google uses clang-format (there is a command line "style" argument: -style=google) 34 | - [Efficiency with Algorithms, Performance with Data Structures (video)](https://youtu.be/fHNmRkzxHWs) 35 | - [Review of C++ concepts (video)](https://www.youtube.com/watch?v=Rub-JsjMhWY) 36 | - [Let us C++](https://books.google.co.in/books/about/Let_Us_C++.html?id=6HrjAAAACAAJ) 37 | - [C++ Primer](https://books.google.co.in/books/about/C++_Primer.html?id=J1HMLyxqJfgC&redir_esc=y) 38 | - [C++ Tutorial for Beginners](https://www.youtube.com/watch?v=vLnPwxZdW4Y) 39 | - [C++ Interview Questions](https://www.interviewbit.com/cpp-interview-questions) 40 | - Python 41 | - [Python Cheat Sheet](https://github.com/jwasham/coding-interview-university/blob/main/extras/cheat%20sheets/python-cheat-sheet-v1.pdf) 42 | - [Python in One Video](https://www.youtube.com/watch?v=N4mEzFDjqtA) 43 | - [Series on 3.4 (video)](https://www.youtube.com/playlist?list=PL6gx4Cwl9DGAcbMi1sH6oAMk4JHw91mC_) 44 | - [Statistics for Hackers (video)](https://www.youtube.com/watch?v=Iq9DzN6mvYA) 45 | - [Faster Python (video)](https://www.youtube.com/watch?v=JDSGVvMwNM8) 46 | - [CPython Walk (video)](https://www.youtube.com/watch?v=LhadeL7_EIU&list=PLzV58Zm8FuBL6OAv1Yu6AwXZrnsFbbR0S&index=6) 47 | - [10 Tips for Pythonic Code (video)](https://www.youtube.com/watch?v=_O23jIXsshs) 48 | - [Beyond PEP 8 -- Best practices for beautiful intelligible code (video)](https://www.youtube.com/watch?v=wf-BqAjZb8M) 49 | - [Automate the Boring Stuff with Python](https://automatetheboringstuff.com/) 50 | - [Coding Interview Essentials](https://github.com/jwasham/coding-interview-university/blob/main/extras/cheat%20sheets/Coding%20Interview%20Python%20Language%20Essentials.pdf) 51 | - [Data Structures And Algorithms in Python](https://www.youtube.com/watch?v=kQDxmjfkIKY) 52 | - [Python Programming Tutorial](https://www.scaler.com/topics/python/) 53 | - [Python Interview Questions](https://www.interviewbit.com/python-interview-questions) 54 | - [Python Guide for Beginners](https://wiingy.com/learn/python/python-tutorial/) 55 | - Java 56 | - [Stanford CS106A - Programming Methodology (video)](https://see.stanford.edu/Course/CS106A) 57 | - [Java Cheat Sheet](https://www.interviewbit.com/java-cheat-sheet) 58 | - [Introduction To Programming In Java](http://introcs.cs.princeton.edu/java/home/) 59 | - [Algorithms 4th Ed - Algorithm Book In Java](http://algs4.cs.princeton.edu/home/) 60 | - [Effective Java 3rd Edition](https://www.amazon.com/Effective-Java-Joshua-Bloch-ebook/dp/B078H61SCH) 61 | - [Data Structures Easy to Advanced Course - Full Tutorial from a Google Engineer](https://www.youtube.com/watch?v=RBSGKlAvoiM&t=1744s) 62 | - [Top Java Interview Questions and Answers](https://www.interviewbit.com/java-interview-questions) 63 | - [Data Structures in Java](https://www.youtube.com/playlist?list=PL9gnSGHSqcnr_DxHsP7AW9ftq0AtAyYqJ) 64 | - Go 65 | - [The Go programming Language](https://golang.org/) 66 | - [The Go programming Language (book)](http://www.gopl.io/) 67 | - [A Tour of Go](https://tour.golang.org/) 68 | - [Effective Go](https://golang.org/doc/effective_go.html) 69 | - [Go Wiki](https://golang.org/wiki) 70 | - [Go at Google: Language Design in the Service of Software Engineering](https://talks.golang.org/2012/splash.article) 71 | - [Go Proverbs](http://go-proverbs.github.io/) 72 | - [Go Proverbs - Rob Pike (video)](https://www.youtube.com/watch?v=PAAkCSZUG1c) 73 | - [Gophercises - Free course on Coding Exercises in Go](https://gophercises.com) 74 | - HTML 75 | - [HTML Cheat Sheet](https://www.interviewbit.com/html-cheat-sheet) 76 | - [Quick HTML Tutorial for Beginners](https://www.youtube.com/playlist?list=PLr6-GrHUlVf_ZNmuQSXdS197Oyr1L9sPB) 77 | - [HTML Crash Course for Beginners (1 hr)](https://www.youtube.com/watch?v=UB1O30fR-EE) 78 | - [Learn HTML in Detail](https://www.scaler.com/topics/html/) 79 | - [Basic HTML and HTML5](https://www.freecodecamp.org/learn/responsive-web-design/basic-html-and-html5/) 80 | - [W3 Schools](https://www.w3schools.com/html/) 81 | - [Html Interview Questions](https://www.interviewbit.com/html-interview-questions) 82 | - CSS 83 | - [Quick CSS Tutorial for Beginners](https://www.youtube.com/playlist?list=PLr6-GrHUlVf8JIgLcu3sHigvQjTw_aC9C) 84 | - [CSS Crash Course for absolute Beginners](https://www.youtube.com/watch?v=yfoY53QXEnI) 85 | - [Basic CSS](https://www.freecodecamp.org/learn/responsive-web-design/basic-css/) 86 | - [W3 Schools](https://www.w3schools.com/css/) 87 | - [Top 30+ CSS Interview Questions](https://www.interviewbit.com/css-interview-questions) 88 | - Javascript 89 | - [JavaScript Cheat Sheet](https://www.interviewbit.com/javascript-cheat-sheet) 90 | - [Learn Javascript in 12 minutes](https://www.youtube.com/watch?v=Ukg_U3CnJWI) 91 | - [Javascript Beginner Tutorials](https://www.youtube.com/playlist?list=PL41lfR-6DnOrwYi5d824q9-Y6z3JdSgQa) 92 | - [Javascript Algorithms and Data Structures](https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/basic-javascript/) 93 | - [Javascript Algorithms With Explanations](https://github.com/trekhleb/javascript-algorithms) 94 | - [Javascript Tutorial - Learn From Scratch](https://www.scaler.com/topics/javascript/) 95 | - [Javascript Interview Questions and Answers](https://www.interviewbit.com/javascript-interview-questions) 96 | - Rust 97 | - [The Rust Programming Language](https://doc.rust-lang.org/book/title-page.html) 98 | - [Rust by Example](https://doc.rust-lang.org/stable/rust-by-example/) 99 | - [Rust Tutorial by Doug Milford from Lambda Valley](https://www.youtube.com/playlist?list=PLLqEtX6ql2EyPAZ1M2_C0GgVd4A-_L4_5) 100 | - [Introduction - Easy Rust](https://www.youtube.com/playlist?list=PLLqEtX6ql2EyPAZ1M2_C0GgVd4A-_L4_5) 101 | - [Rust overview](https://learning-rust.github.io/docs/index.html) 102 | - [A Gentle Introduction to Rust](https://stevedonovan.github.io/rust-gentle-intro/readme.html) 103 | 104 | - Ruby 105 | 106 | - [The Ruby Programming Language](https://book4you.org/book/1219034/7c9a4b) 107 | - [Polished Ruby Programming](https://book4you.org/book/16678106/f61159) 108 | - [Ruby Fu](https://rubyfu.net/) 109 | - [Ruby Koans](http://rubykoans.com/) 110 | 111 | - Other Language 2 112 | - etc 113 | -------------------------------------------------------------------------------- /translations/README-cn.md: -------------------------------------------------------------------------------- 1 | # 编程面试大学 2 | 3 | > 原先我为了成为一个软件工程师而建立这份简单的学习主题清单, 但这份清单随着时间的推移而膨胀成今天这样。在做完这份清单上的每个目标后,[我成为了 Amazon 的软件开发工程师](https://startupnextdoor.com/ive-been-acquired-by-amazon/?src=ciu)! 你或许不需要像我一样学习这么多。但是,让你成为一位称职工程师所需要的知识都在这里了。 4 | > 5 | >我每天自学8~12小时,这样持续了好几个月。这是我的故事:[为什么我为了 Google 面试而自学了8个月](https://medium.freecodecamp.org/why-i-studied-full-time-for-8-months-for-a-google-interview-cc662ce9bb13)。 6 | > 7 | > **请注意:** 你不需要像我一样那么努力学习。我在一些不必要的事情上浪费了很多时间。关于这个问题下面有更多信息。我会帮助你节省宝贵的时间,让你达到目标。 8 | > 在这份清单内的主题会让你拥有足够的知识去面对几乎每家软件公司的技术面试,包括科技巨头:Amazon、Facebook、Google,以及 Microsoft。 9 | > 10 | > **祝你好运!** 11 | 12 |
13 |
14 |

15 | 成为赞助商 并支持编程大学! 16 |

17 |
18 |
19 | 20 | ## 这是? 21 | 22 | ![白板上编程 ———— 来自 HBO 频道的剧集,“硅谷”](https://d3j2pkmjtin6ou.cloudfront.net/coding-at-the-whiteboard-silicon-valley.png) 23 | 24 | 这是我为成为一家大公司的软件工程师制定的多月学习计划。 25 | 26 | **要求:** 27 | * 一点编程经验(变量、循环、方法/函数等) 28 | * 耐心 29 | * 时间 30 | 31 | 注意,这是一份关于 **软件工程** 的学习计划,而不是前端工程或全栈开发。 32 | 这些职业路径有很多详细的路线图和课程资料可以在其他地方找到(请参阅 https://roadmap.sh/ 获取更多信息)。 33 | 34 | 在大学计算机科学专业中,有很多知识需要学习,但是只掌握大约75%的内容就足够应对面试了,这也是我在这里涵盖的内容。 35 | 如果你想进行完整的自学计算机科学项目,可以参考Kamran Ahmed的计算机科学路线图:https://roadmap.sh/computer-science 36 | 37 | --- 38 | 39 | ## 目录 40 | 41 | ### 学习计划 42 | 43 | - [这是?](#这是) 44 | - [为何要用到它?](#为何要用到它) 45 | - [如何使用它](#如何使用它) 46 | - [不要觉得自己不够聪明](#不要觉得自己不够聪明) 47 | - [相关视频资源](#相关视频资源) 48 | - [选择编程语言](#选择编程语言) 49 | - [数据结构和算法的书籍](#数据结构和算法的书籍) 50 | - [面试准备书籍](#面试准备书籍) 51 | - [不要犯我的错误](#不要犯我的错误) 52 | - [没有包含的内容](#没有包含的内容) 53 | - [日常计划](#日常计划) 54 | - [编程问题练习](#编程问题练习) 55 | - [编程问题](#编程问题) 56 | 57 | ### 学习的主题 58 | 59 | - [算法复杂度 / Big-O / 渐进分析法](#算法复杂度--big-o--渐进分析法) 60 | - [数据结构](#数据结构) 61 | - [数组(Arrays)](#数组arrays) 62 | - [链表(Linked Lists)](#链表linked-lists) 63 | - [堆栈(Stack)](#堆栈stack) 64 | - [队列(Queue)](#队列queue) 65 | - [哈希表(Hash table)](#哈希表hash-table) 66 | - [更多的知识](#更多的知识) 67 | - [二分查找(Binary search)](#二分查找binary-search) 68 | - [按位运算(Bitwise operations)](#按位运算bitwise-operations) 69 | - [树(Trees)](#树trees) 70 | - [树-介绍](#树-介绍) 71 | - [二叉查找树(Binary search trees):BSTs](#二叉查找树binary-search-treesbsts) 72 | - [堆(Heap) / 优先级队列(Priority Queue) / 二叉堆(Binary Heap)](#堆heap--优先级队列priority-queue--二叉堆binary-heap) 73 | - 平衡搜索树 (总体概念,不涉及细节) 74 | - 遍历:前序、中序、后序、BFS、DFS 75 | - [排序](#排序sorting) 76 | - 选择排序(selection) 77 | - 插入排序(insertion) 78 | - 堆排序(heapsort) 79 | - 快速排序(quicksort) 80 | - 归并排序(merge sort) 81 | - [图(Graphs)](#图graphs) 82 | - 有向图(directed) 83 | - 无向图(undirected) 84 | - 邻接矩阵(adjacency matrix) 85 | - 邻接表(adjacency list) 86 | - 遍历:广度优先(BFS), 深度优先(DFS) 87 | - [更多知识](#更多知识) 88 | - [递归](#递归recursion) 89 | - [动态规划](#动态规划dynamic-programming) 90 | - [设计模式](#设计模式) 91 | - [组合 & 概率](#组合combinatorics-n-中选-k-个--概率probability) 92 | - [NP, NP-完全和近似算法](#np-np-完全和近似算法) 93 | - [缓存](#缓存cache) 94 | - [进程和线程](#进程processe和线程thread) 95 | - [测试](#测试) 96 | - [调度](#调度) 97 | - [字符串搜索和操作](#字符串搜索和操作) 98 | - [字典树(Tries)](#字典树tries) 99 | - [浮点数](#浮点数) 100 | - [Unicode](#unicode) 101 | - [字节顺序](#字节序Endianness) 102 | - [网络](#网络视频) 103 | - [最终复习](#最终复习) 104 | 105 | ### 获得工作机会 106 | 107 | - [更新你的简历](#更新你的简历) 108 | - [找工作](#找工作) 109 | - [面试流程与一般面试准备](#面试流程与一般面试准备) 110 | - [当面试来临的时候](#当面试来临的时候) 111 | - [问面试官的问题](#问面试官的问题) 112 | - [当你获得了梦想的职位](#当你获得了梦想的职位) 113 | 114 | **---------------- 以下所有内容均为可选项 ----------------** 115 | 116 | ### 可选的额外主题和资源 117 | 118 | - [额外书籍](#额外书籍) 119 | - [系统设计、可扩展性和数据处理](#系统设计、可扩展性和数据处理) 120 | - [附加学习](#附加学习) 121 | - [编译器](#编译器) 122 | - [Emacs and vi(m)](#emacs-and-vim) 123 | - [Unix 命令行工具](#unix-命令行工具) 124 | - [信息论](#信息论-视频) 125 | - [奇偶校验位 & 汉明码 (视频)](#奇偶校验位--汉明码-视频) 126 | - [系统熵值](#系统熵值Entropy) 127 | - [密码学](#密码学) 128 | - [压缩](#压缩) 129 | - [计算机安全](#计算机安全) 130 | - [垃圾回收](#垃圾回收) 131 | - [并行编程](#并行编程) 132 | - [消息传递,序列化和队列化的系统](#消息传递序列化和队列系统) 133 | - [A*搜索算法](#a*搜索算法) 134 | - [快速傅里叶变换](#快速傅里叶变换) 135 | - [布隆过滤器](#布隆过滤器) 136 | - [HyperLogLog](#hyperloglog) 137 | - [局部敏感哈希](#局部敏感哈希) 138 | - [van Emde Boas 树](#van-emde-boas-树) 139 | - [增强数据结构](#增强数据结构) 140 | - [平衡查找树](#平衡查找树balanced-search-trees) 141 | - AVL 树 142 | - 伸缩树(Splay tree) 143 | - 红黑树 144 | - 2-3 查找树 145 | - 2-3-4 树(也称 2-4 树) 146 | - N-ary (K-ary, M-ary)树 147 | - B 树 148 | - [k-D 树](#k-d树) 149 | - [跳表](#跳表) 150 | - [网络流](#网络流) 151 | - [不相交集 & 联合查找](#不相交集--联合查找) 152 | - [快速处理的数学](#快速处理的数学) 153 | - [树堆 (Treap)](#树堆-treap) 154 | - [线性规划](#线性规划linear-programming视频) 155 | - [几何:凸包(Geometry, Convex hull)](#几何凸包geometry-convex-hull视频) 156 | - [离散数学](#离散数学) 157 | - [一些主题的额外内容](#一些主题的额外内容) 158 | - [视频系列](#视频系列) 159 | - [计算机科学课程](#计算机科学课程) 160 | - [论文](#论文) 161 | 162 | --- 163 | 164 | ## 为何要用到它? 165 | 166 | 如果你想在一家大公司担任软件工程师,这些是你必须了解的事情。 167 | 168 | 如果你错过了计算机科学的学位,就像我一样,这将帮助你迎头赶上,并节省四年的时间。 169 | 170 | 当我开始这个项目时,我对堆栈和堆没有任何了解, 171 | 也不知道大O表示法或者关于树的任何东西,也不知道如何遍历图形。 172 | 如果让我编写一个排序算法,相信我它会很糟糕。 173 | 我曾经使用过的每种数据结构都是内置在语言中的,并且我完全不知道它们在底层是如何工作的。 174 | 除非运行中的进程出现“内存不足”错误,否则我从来没有管理过内存,并且那时候就需要找到一种解决方法。 175 | 在我的生活中,我使用过一些多维数组和成千上万个关联数组,但从未从头开始创建数据结构。 176 | 177 | 这是一个漫长的计划,以至于花费了我数月的时间。若你早已熟悉大部分的知识,那么也许能节省大量的时间。 178 | 179 | ## 如何使用它 180 | 181 | 下面所有的东西都只是一个概述。因此,你需要由上而下逐一地去处理它。 182 | 183 | 在学习过程中,我使用 GitHub 特殊语法的 Markdown 去检查计划的进展,包括使用包含任务进度的任务列表。 184 | - [更多关于 Github-flavored Markdown 的详情](https://guides.github.com/features/mastering-markdown/#GitHub-flavored-markdown) 185 | 186 | ### 如果你不想使用 Git 187 | 188 | 在该页面上,单击顶部附近的 Code 按钮,然后单击“Download ZIP”。解压文件,就可以使用文本文件了。 189 | 190 | 如果你打开一个代码编辑器,你会看到所有格式都很好。 191 | 192 | ![How to download the repo as a zip file](https://d3j2pkmjtin6ou.cloudfront.net/how-to-download-as-zip.png) 193 | 194 | ### 如果你不介意 Git 195 | 196 | 创建一个新的分支,这样你就可以检查类似这样的项目了,只需在方括号中放入一个x:[x] 197 | 198 | 1. 在 GitHub 上 Fork 该仓库: 点击 Fork 按钮,将 `https://github.com/jwasham/coding-interview-university` 仓库复制到你的 GitHub 账号中。 199 | 200 | ![Fork the GitHub repo](https://d3j2pkmjtin6ou.cloudfront.net/fork-button.png) 201 | 202 | 2. 克隆项目到本地: 203 | 204 | ``` 205 | git clone git@github.com:/coding-interview-university.git 206 | cd coding-interview-university 207 | git remote add upstream https://github.com/jwasham/coding-interview-university 208 | git remote set-url --push upstream DISABLE # 这样你就不会将个人进展推回到原始仓库了。 209 | ``` 210 | 211 | 3. 在你完成了一些修改后,在框框中打 x: 212 | 213 | ``` 214 | git commit -am "Marked personal progress" 215 | git pull upstream main # 将您的分支与原始仓库中的更改保持最新 216 | 217 | git push # just pushes to your fork 218 | ``` 219 | 220 | ## 不要觉得自己不够聪明 221 | 222 | - 大多数成功的软件工程师都非常聪明,但他们都有一种觉得自己不够聪明的不安全感。 223 | - 下面的视频可以帮助你克服这种不安全感: 224 | - [天才程序员的神话](https://www.youtube.com/watch?v=0SARbwvhupQ) 225 | - [不要单打独斗:面对技术中的隐形怪物](https://www.youtube.com/watch?v=1i8ylq4j_EY) 226 | 227 | ## 相关视频资源 228 | 229 | 部分视频只能通过在 Coursera 或者 Edx 课程上注册登录才能观看。 230 | 这些视频被称为网络公开课程(MOOC)。有时候某些课程需要等待好几个月才能获取,这期间你无法观看这些课程的影片。 231 | 232 | 很感谢你能帮我把网络公开课程的视频链接转换成公开的,可持续访问的视频源, 233 | 比如 YouTube 视频,以代替那些在线课程的视频。 234 | 此外,一些大学的讲座视频也是我所青睐的。 235 | 236 | ## 选择编程语言 237 | 238 | 你需要为你做的编程面试选择一种编程语言, 239 | 但你也需要找到一种可以用来学习计算机科学概念的语言。 240 | 241 | 最好是同一种语言,这样你只需精通其中一种。 242 | 243 | ### 对于这个学习计划 244 | 245 | 在这个学习计划中,我主要使用了两种编程语言:C和Python。 246 | 247 | * C: 非常底层。它允许你处理指针和内存的分配与释放,因此你能够深入理解数据结构和算法。 248 | 在像Python或Java这样的高级语言中,这些细节被隐藏起来。在日常工作中,这是很好的, 249 | 但当你学习这些底层数据结构时,感受它们与计算机硬件的联系也是非常有益的。 250 | - C 语言无处不在。在你学习的过程中,你会在书籍、讲座、视频以及**任何地方**看到C语言的例子。 251 | - [《C程序设计语言(第2版)》](https://www.amazon.com/Programming-Language-Brian-W-Kernighan/dp/0131103628) 252 | - 这是一本简短的书,但它会让你很好地掌握C语言,只要稍微练习一下, 253 | 你很快就能熟练使用。理解C语言有助于你了解程序和内存是如何工作的。 254 | - 你不需要深入研究这本书(甚至不用读完它)。只要阅读到你感觉舒服,并能写一些C语言的代码就可以了。 255 | - [书中问题的答案](https://github.com/lekkas/c-algorithms) 256 | * Python: 现代且非常灵活,我学习它是因为它非常实用,同时在面试中也能让我写更少的代码。 257 | 258 | 这是我的个人喜好,当然你可以根据自己的偏好来选择。 259 | 260 | 也许你并不需要,但以下是一些学习新编程语言的网站: 261 | - [Exercism](https://exercism.org/tracks) 262 | - [Codewars](http://www.codewars.com) 263 | - [HackerEarth](https://www.hackerearth.com/for-developers/) 264 | - [Scaler Topics (Java, C++)](https://www.scaler.com/topics/) 265 | 266 | ### 对于你的编程面试 267 | 268 | 你可以在编程这一环节,使用一种自己用起来较为舒适的语言去完成编程,但对于大公司,你只有三种固定的选择: 269 | 270 | - C++ 271 | - Java 272 | - Python 273 | 274 | 你也可以使用下面两种编程语言,但可能会有某些限制,你需要事先查明: 275 | 276 | - JavaScript 277 | - Ruby 278 | 279 | 这是我写的一篇关于选择面试语言的文章: 280 | [为编程面试选择一种语言](https://startupnextdoor.com/important-pick-one-language-for-the-coding-interview/)。 281 | 这是我发布帖子所基于的原始文章: [Choosing a Programming Language for Interviews](https://web.archive.org/web/20210516054124/http://blog.codingforinterviews.com/best-programming-language-jobs/) 282 | 283 | 你需要对你所选择的语言感到非常舒适且足够了解。 284 | 285 | 更多关于语言选择的阅读: 286 | - [选择适合你的编程面试的语言](http://www.byte-by-byte.com/choose-the-right-language-for-your-coding-interview/) 287 | 288 | [在此查看相关语言的资源](../programming-language-resources.md) 289 | 290 | ## 数据结构和算法的书籍 291 | 292 | 这本书将为你的计算机科学打下基础。 293 | 294 | 只需选择一种你感到舒适的语言。你将会进行大量阅读和编码工作。 295 | 296 | ### C 297 | 298 | - [C语言中的算法,第1-5部分(捆绑包),第3版](https://www.amazon.com/Algorithms-Parts-1-5-Bundle-Fundamentals/dp/0201756080) 299 | - 基础知识,数据结构,排序,搜索和图算法 300 | 301 | ### Python 302 | 303 | - [ ] [Python数据结构和算法](https://www.amazon.com/Structures-Algorithms-Python-Michael-Goodrich/dp/1118290275/) 304 | - 作者:Goodrich、Tamassia、Goldwasser 305 | - 我非常喜爱这本书,它包含了所有东西 306 | - 很 Python 的代码 307 | - 我的读书报告:https://startupnextdoor.com/book-report-data-structures-and-algorithms-in-python/ 308 | 309 | ### Java 310 | 311 | 你的选择: 312 | 313 | - Goodrich, Tamassia, Goldwasser 314 | - [Java数据结构与算法](https://www.amazon.com/Data-Structures-Algorithms-Michael-Goodrich/dp/1118771338/) 315 | - Sedgewick and Wayne: 316 | - [算法(第4版)](https://www.amazon.com/Algorithms-4th-Robert-Sedgewick/dp/032157351X/) 317 | - 免费Coursera课程,涵盖该书内容(由作者授课!): 318 | - [算法I](https://www.coursera.org/learn/algorithms-part1) 319 | - [算法II](https://www.coursera.org/learn/algorithms-part2) 320 | 321 | ### C++ 322 | 323 | 你的选择: 324 | 325 | - Goodrich, Tamassia, and Mount 326 | - [C++数据结构与算法(第2版)](https://www.amazon.com/Data-Structures-Algorithms-Michael-Goodrich/dp/0470383275) 327 | - Sedgewick and Wayne 328 | - [C++算法(第1-4部分):基础知识,数据结构,排序,搜索](https://www.amazon.com/Algorithms-Parts-1-4-Fundamentals-Structure/dp/0201350882/) 329 | - [C++算法第5部分:图算法](https://www.amazon.com/Algorithms-Part-Graph-3rd-Pt-5/dp/0201361183/) 330 | 331 | ## 面试准备书籍 332 | 333 | 你不需要买一堆这些。老实说,《破解编程面试》可能已经足够了, 334 | 但我买了更多来给自己更多的练习。但我总是做得太多。 335 | 336 | 这两个都是我买的,他们给了我大量的练习。 337 | 338 | - [Programming Interviews Exposed: Coding Your Way Through the Interview, 4th Edition](https://www.amazon.com/Programming-Interviews-Exposed-Through-Interview/dp/111941847X/) 339 | - 提供C++和Java语言的答案 340 | - 这本书是准备《Cracking the Coding Interview》的很好热身书 341 | - 难度适中。大多数问题可能比实际面试中遇到的问题要简单(根据我所读的内容) 342 | - [Cracking the Coding Interview, 6th Edition](http://www.amazon.com/Cracking-Coding-Interview-6th-Programming/dp/0984782850/) 343 | - 提供Java语言的答案 344 | 345 | ### 如果你有很多额外的时间: 346 | 347 | 选择一个: 348 | 349 | - [Elements of Programming Interviews (C++ version)](https://www.amazon.com/Elements-Programming-Interviews-Insiders-Guide/dp/1479274836) 350 | - [Elements of Programming Interviews in Python](https://www.amazon.com/Elements-Programming-Interviews-Python-Insiders/dp/1537713949/) 351 | - [Elements of Programming Interviews (Java version)](https://www.amazon.com/Elements-Programming-Interviews-Java-Insiders/dp/1517435803/) 352 | - [配套项目-本书中每个问题的方法存根和测试用例](https://github.com/gardncl/elements-of-programming-interviews) 353 | 354 | ## 不要犯我的错误 355 | 356 | 这个列表在很多个月里不断增长,是的,它变得失控了。 357 | 358 | 以下是我犯过的一些错误,这样你就能有更好的体验。而且你将节省数月时间。 359 | 360 | ### 1. 你不可能把所有的东西都记住 361 | 362 | 我看了数小时的视频并做了大量笔记,几个月后有很多东西我都不记得了。 363 | 我花了三天时间浏览我的笔记并制作闪卡,以便进行复习。其实,并不需要那么多知识。 364 | 365 | 请阅读以下的文章以免重蹈覆辙: 366 | 367 | [记住计算机科学知识](https://startupnextdoor.com/retaining-computer-science-knowledge/)。 368 | 369 | ### 2. 使用抽认卡 370 | 371 | 为了解决善忘的问题,我制作了一个抽认卡的网页,用于添加两种抽认卡:一般的及带有代码的。每种卡都会有不同的格式设计。 372 | 而且,我还以移动设备为先去设计这些网页,以使得在任何地方,我都能通过我的手机及平板去回顾知识。 373 | 374 | 你也可以免费制作属于你自己的抽认卡网站: 375 | 376 | - [抽认卡页面的代码仓库](https://github.com/jwasham/computer-science-flash-cards) 377 | 378 | **我不建议使用我的闪卡**。它们太多了,而且大部分都是你不需要的琐事。 379 | 380 | 但是如果你不想听我的话,那就随你吧: 381 | - [我的抽认卡数据库 ── 旧 1200 张](https://github.com/jwasham/computer-science-flash-cards/blob/main/cards-jwasham.db) 382 | - [我的抽认卡数据库 ── 新 1800 张](https://github.com/jwasham/computer-science-flash-cards/blob/main/cards-jwasham-extreme.db) 383 | 384 | 有一点需要记住的是,我做事有点过头,以至于卡片都覆盖到所有的东西上,从汇编语言和 Python 的细枝末节,到机器学习和统计都被覆盖到卡片上。 385 | 而这种做法,对于要求来说是多余的。 386 | 387 | **在抽认卡上做笔记:** 若你第一次发现你知道问题的答案时,先不要急着把其标注成“已知”。 388 | 反复复习这张抽认卡,直到每次都能答对后才是真正学会了这个问题。 389 | 反复地问答可帮助你深刻记住该知识点。 390 | 391 | 这里有个替代我抽认卡的网站 [Anki](http://ankisrs.net/),很多人向我推荐过它。 392 | 这个网站用同一个字卡重复出现的方式让你牢牢地记住知识。 393 | 这个网站非常容易使用,支持多平台,并且有云端同步功能。在 iOS 平台上收费25美金,其他平台免费。 394 | 395 | 这是我用 Anki 这个网站里的格式所储存的抽认卡资料库: https://ankiweb.net/shared/info/25173560 (感谢 [@xiewenya](https://github.com/xiewenya))。 396 | 397 | 一些学生提到了关于空白间距的格式问题,可以通过以下方法进行修复:打开卡片组,编辑卡片,点击"卡片"选项,选择"样式"单选按钮,在卡片类中添加成员 "white-space: pre;"。 398 | 399 | ### 3. 在学习过程中做编程面试题 400 | 401 | **这非常重要。** 402 | 403 | 在学习数据结构和算法的同时,开始做编程面试题。 404 | 405 | 你需要将所学知识应用于解决问题,否则你会忘记。我曾经犯过这个错误。 406 | 407 | 一旦你学完一个主题,并且对它有了一定的掌握,比如 **链表(linked lists)**: 408 | 1. 打开其中一本[编程面试书籍](#interview-prep-books)(或下方列出的编程问题网站之一)。 409 | 1. 关于链表的问题,请提出2或3个。 410 | 1. 继续学习下一个主题。 411 | 1. 稍后,回来再做另外2或3个链表问题。 412 | 1. 使用这种方法来学习每个新主题。 413 | 414 | **在学习这些内容的过程中不断做问题,而不是之后。** 415 | 416 | 你被雇佣的不是因为你的知识,而是因为你如何应用这些知识。 417 | 418 | 下面列出了许多资源供你参考。继续前进吧。 419 | 420 | ### 4. 专注 421 | 422 | 在学习的过程中,往往会有许多令人分心的事占据着我们宝贵的时间。 423 | 因此,专注和集中注意力是非常困难的。放点纯音乐能帮上一些忙。 424 | 425 | ## 没有包含的内容 426 | 427 | 有一些熟悉且普遍的技术在此未被谈及到: 428 | 429 | - Javascript 430 | - HTML,CSS和其他前端技术 431 | - SQL 432 | 433 | ## 日常计划 434 | 435 | 这门课涵盖了很多主题。每个主题可能需要你几天的时间,甚至可能需要一周或更长时间。这取决于你的日程安排。 436 | 437 | 每天,按照列表中的下一个主题,观看一些关于该主题的视频, 438 | 然后用你选择的语言为这门课程编写该数据结构或算法的实现。 439 | 440 | 在这里你可以查看到我的代码: 441 | - [C](https://github.com/jwasham/practice-c) 442 | - [C++](https://github.com/jwasham/practice-cpp) 443 | - [Python](https://github.com/jwasham/practice-python) 444 | 445 | 你不需要记住每个算法。你只需要能够理解它,以便能够编写自己的实现即可。 446 | 447 | ## 编程问题练习 448 | 449 | 这是为什么?我还没有准备好面试。 450 | 451 | [那就回去阅读这部分。](#3-do-coding-interview-questions-while-youre-learning) 452 | 453 | 为什么你需要练习编程问题: 454 | - 识别问题,并确定合适的数据结构和算法 455 | - 收集问题的要求 456 | - 像在面试中那样口头表达解决问题的过程 457 | - 在白板或纸上编写代码,而不是在计算机上 458 | - 为您的解决方案确定时间和空间复杂度(参见下文中的大O表示法)。 459 | - 对你的解决方案进行测试 460 | 461 | 在面试中,有一种方法论的、有交流的问题解决方法。你可以从编程面试书籍中了解这些, 462 | 但我发现下面这个网站也非常出色: 463 | [算法设计画布](http://www.hiredintech.com/algorithm-design/) 464 | 465 | 在白板或纸上写代码,而不是在计算机上。使用一些样例输入进行测试。然后在计算机上键入并进行测试。 466 | 467 | 如果家里没有白板,请从艺术用品店购买一个大型的绘图本。 468 | 你可以坐在沙发上练习。这就是我的"沙发白板"。照片中我加了一支笔来衡量尺寸。如果你使用钢笔,你会希望能擦除。 469 | 会很快变得凌乱, **我用铅笔和橡皮擦。** 470 | 471 | ![my sofa whiteboard](https://d3j2pkmjtin6ou.cloudfront.net/art_board_sm_2.jpg) 472 | 473 | **编程问题练习并不是为了记住解决编程问题的答案。** 474 | 475 | ## 编程问题 476 | 477 | 别忘了参考你的主要编程面试书籍[这里](#interview-prep-books). 478 | 479 | 解决问题: 480 | - [如何找到解决方案](https://www.topcoder.com/thrive/articles/How%20To%20Find%20a%20Solution) 481 | - [如何分析Topcoder问题陈述](https://www.topcoder.com/thrive/articles/How%20To%20Dissect%20a%20Topcoder%20Problem%20Statement%20Content) 482 | 483 | 编程面试问题视频: 484 | - [IDeserve(88个视频)](https://www.youtube.com/playlist?list=PLamzFoFxwoNjPfxzaWqs7cZGsPYy0x_gI) 485 | - [Tushar Roy(5个播放列表)](https://www.youtube.com/user/tusharroy2525/playlists?shelf_id=2&view=50&sort=dd) 486 | - 非常适合问题解决方案的演示 487 | - [Nick White - LeetCode解答(187个视频)](https://www.youtube.com/playlist?list=PLU_sdQYzUj2keVENTP0a5rdykRSgg9Wp-) 488 | - 解释解决方案和代码的很好 489 | - 你可以在短时间内观看多个视频 490 | - [FisherCoder - LeetCode解答](https://youtube.com/FisherCoder) 491 | 492 | 挑战/练习网站: 493 | - [LeetCode](https://leetcode.com/) 494 | - 我最喜欢的编程问题网站。对于你准备的1-2个月时间,订阅会费是值得的。 495 | - 观看上面提到的Nick White和FisherCoder的视频,可以帮助你理解代码解决方案。 496 | - [HackerRank](https://www.hackerrank.com/) 497 | - [TopCoder](https://www.topcoder.com/) 498 | - [Codeforces](https://codeforces.com/) 499 | - [Codility](https://codility.com/programmers/) 500 | - [Geeks for Geeks](https://practice.geeksforgeeks.org/explore/?page=1) 501 | - [AlgoExpert](https://www.algoexpert.io/product) 502 | - 由谷歌工程师创建,也是提高你技能的优秀资源。 503 | - [Project Euler](https://projecteuler.net/) 504 | - 主要关注数学问题,并不完全适合编程面试。 505 | 506 | ## 让我们开始吧 507 | 508 | 好了,说得够多了,让我们学习吧! 509 | 510 | 但在学习的同时,不要忘记做上面的编码问题! 511 | 512 | ## 算法复杂度 / Big-O / 渐进分析法 513 | 514 | - 这里没有什么需要实施的,你只是在观看视频并记笔记!耶! 515 | - 这里有很多视频,只要看到你理解为止就好了,你随时可以回来复习。 516 | - 如果你不理解背后的所有数学,不要担心。 517 | - 你只需要理解如何用大O表示法来表达算法的复杂度。 518 | - [ ] [哈佛大学CS50 - 渐进符号(视频)](https://www.youtube.com/watch?v=iOq5kSKqeR4) 519 | - [ ] [大O符号(通用快速教程)(视频)](https://www.youtube.com/watch?v=V6mKVRU1evU) 520 | - [ ] [大O符号(以及Ω和Θ)- 最佳数学解释(视频)](https://www.youtube.com/watch?v=ei-A_wy5Yxw&index=2&list=PL1BaGV1cIH4UhkL8a9bJGG356covJ76qN) 521 | - [ ] [Skiena(视频)](https://www.youtube.com/watch?v=z1mkCe3kVUA) 522 | - [ ] [加州大学伯克利分校关于大O符号(视频)](https://archive.org/details/ucberkeley_webcast_VIS4YDpuP98) 523 | - [ ] [摊还分析(视频)](https://www.youtube.com/watch?v=B3SpQZaAZP4&index=10&list=PL1BaGV1cIH4UhkL8a9bJGG356covJ76qN) 524 | - [ ] TopCoder(包括递归关系和主定理): 525 | - [计算复杂性:第1部分](https://www.topcoder.com/thrive/articles/Computational%20Complexity%20part%20one) 526 | - [计算复杂性:第2部分](https://www.topcoder.com/thrive/articles/Computational%20Complexity%20part%20two) 527 | - [ ] [速查表](http://bigocheatsheet.com/) 528 | - [ ] [[Review] Analyzing Algorithms (playlist) in 18 minutes (video)](https://www.youtube.com/playlist?list=PL9xmBV_5YoZMxejjIyFHWa-4nKg6sdoIv) 529 | 530 | 好吧,差不多就到这里了。 531 | 532 | 当你阅读《破解编程面试》时,有一个章节专门讲述此事,并在最后进行了一次测验, 533 | 以测试你是否能够确定不同算法的运行时间复杂度。这是一个非常全面的复习和测试。 534 | 535 | ## 数据结构 536 | 537 | - ### 数组(Arrays) 538 | - [ ] 介绍: 539 | - [数组 CS50 哈佛大学](https://www.youtube.com/watch?v=tI_tIZFyKBw&t=3009s) 540 | - [数组(视频)](https://www.coursera.org/lecture/data-structures/arrays-OsBSF) 541 | - [加州大学伯克利分校CS61B - 线性和多维数组(视频)](https://archive.org/details/ucberkeley_webcast_Wp8oiO_CZZE)(从15分32秒开始) 542 | - [动态数组(视频)](https://www.coursera.org/lecture/data-structures/dynamic-arrays-EwbnV) 543 | - [嵌套数组(视频)](https://www.youtube.com/watch?v=1jtrQqYpt7g) 544 | - [ ] 实现一个动态数组(可自动调整大小的可变数组): 545 | - [ ] 练习使用数组和指针去编码,并且指针是通过计算去跳转而不是使用索引 546 | - [ ] 通过分配内存来新建一个原生数据型数组 547 | - 可以使用 int 类型的数组,但不能使用其语法特性 548 | - 从大小为16或更大的数(使用2的倍数 —— 16、32、64、128)开始编写 549 | - [ ] size() —— 数组元素的个数 550 | - [ ] capacity() —— 可容纳元素的个数 551 | - [ ] is_empty() 552 | - [ ] at(index) —— 返回对应索引的元素,且若索引越界则愤然报错 553 | - [ ] push(item) 554 | - [ ] insert(index, item) —— 在指定索引中插入元素,并把后面的元素依次后移 555 | - [ ] prepend(item) —— 可以使用上面的 insert 函数,传参 index 为 0 556 | - [ ] pop() —— 删除在数组末端的元素,并返回其值 557 | - [ ] delete(index) —— 删除指定索引的元素,并把后面的元素依次前移 558 | - [ ] remove(item) —— 删除指定值的元素,并返回其索引(即使有多个元素) 559 | - [ ] find(item) —— 寻找指定值的元素并返回其中第一个出现的元素其索引,若未找到则返回 -1 560 | - [ ] resize(new_capacity) // 私有函数 561 | - 若数组的大小到达其容积,则变大一倍 562 | - 获取元素后,若数组大小为其容积的1/4,则缩小一半 563 | - [ ] 时间复杂度 564 | - 在数组末端增加/删除、定位、更新元素,只允许占 O(1) 的时间复杂度(平摊(amortized)去分配内存以获取更多空间) 565 | - 在数组任何地方插入/移除元素,只允许 O(n) 的时间复杂度 566 | - [ ] 空间复杂度 567 | - 因为在内存中分配的空间邻近,所以有助于提高性能 568 | - 空间需求 = (大于或等于 n 的数组容积)* 元素的大小。即便空间需求为 2n,其空间复杂度仍然是 O(n) 569 | 570 | - ### 链表(Linked Lists) 571 | - [ ] 介绍: 572 | - [ ] [链表 CS50 哈佛大学](https://www.youtube.com/watch?v=2T-A_GFuoTo&t=650s) - 这样建立了直观感。 573 | - [ ] [单链表(视频)](https://www.coursera.org/lecture/data-structures/singly-linked-lists-kHhgK) 574 | - [ ] [CS 61B - 链表1(视频)](https://archive.org/details/ucberkeley_webcast_htzJdKoEmO0) 575 | - [ ] [CS 61B - 链表 2(视频)](https://archive.org/details/ucberkeley_webcast_-c4I3gFYe3w) 576 | - [ ] [[复习] 4分钟了解链表(视频)](https://youtu.be/F8AbOfQwl1c) 577 | - [ ] [C代码(视频)](https://www.youtube.com/watch?v=QN6FPiD0Gzo) 578 | - 不是整个视频,只是关于Node结构和内存分配的部分。 579 | - [ ] 链表 vs 数组: 580 | - [核心链表与数组(视频)](https://www.coursera.org/lecture/data-structures-optimizing-performance/core-linked-lists-vs-arrays-rjBs9) 581 | - [在现实世界中,链表与数组的比较(视频)](https://www.coursera.org/lecture/data-structures-optimizing-performance/in-the-real-world-lists-vs-arrays-QUaUd) 582 | - [ ] [为什么你需要避免使用链表(视频)](https://www.youtube.com/watch?v=YQs6IC-vgmo) 583 | - [ ] 的确:你需要关于“指向指针的指针”的相关知识:(因为当你传递一个指针到一个函数时, 584 | 该函数可能会改变指针所指向的地址)该页只是为了让你了解“指向指针的指针”这一概念。 585 | 但我并不推荐这种链式遍历的风格。因为,这种风格的代码,其可读性和可维护性太低。 586 | - [指向指针的指针](https://www.eskimo.com/~scs/cclass/int/sx8.html) 587 | - [ ] 实现(我实现了使用尾指针以及没有使用尾指针这两种情况): 588 | - [ ] size() —— 返回链表中数据元素的个数 589 | - [ ] empty() —— 若链表为空则返回一个布尔值 true 590 | - [ ] value_at(index) —— 返回第 n 个元素的值(从0开始计算) 591 | - [ ] push_front(value) —— 添加元素到链表的首部 592 | - [ ] pop_front() —— 删除首部元素并返回其值 593 | - [ ] push_back(value) —— 添加元素到链表的尾部 594 | - [ ] pop_back() —— 删除尾部元素并返回其值 595 | - [ ] front() —— 返回首部元素的值 596 | - [ ] back() —— 返回尾部元素的值 597 | - [ ] insert(index, value) —— 插入值到指定的索引,并把当前索引的元素指向到新的元素 598 | - [ ] erase(index) —— 删除指定索引的节点 599 | - [ ] value_n_from_end(n) —— 返回倒数第 n 个节点的值 600 | - [ ] reverse() —— 逆序链表 601 | - [ ] remove_value(value) —— 删除链表中指定值的第一个元素 602 | - [ ] 双向链表 603 | - [介绍(视频)](https://www.coursera.org/learn/data-structures/lecture/jpGKD/doubly-linked-lists) 604 | - 并不需要实现 605 | 606 | - ### 堆栈(Stack) 607 | - [ ] [堆栈(视频)](https://www.coursera.org/learn/data-structures/lecture/UdKzQ/stacks) 608 | - [ ] [[Review] Stacks in 3 minutes (video)](https://youtu.be/KcT3aVgrrpU) 609 | - [ ] 可以不实现,因为使用数组来实现是微不足道的事 610 | 611 | - ### 队列(Queue) 612 | - [ ] [队列(视频)](https://www.coursera.org/learn/data-structures/lecture/EShpq/queue) 613 | - [ ] [原型队列/先进先出(FIFO)](https://en.wikipedia.org/wiki/Circular_buffer) 614 | - [ ] [[Review] Queues in 3 minutes (video)](https://youtu.be/D6gu-_tmEpQ) 615 | - [ ] 使用含有尾部指针的链表来实现: 616 | - enqueue(value) —— 在尾部添加值 617 | - dequeue() —— 删除最早添加的元素并返回其值(首部元素) 618 | - empty() 619 | - [ ] 使用固定大小的数组实现: 620 | - enqueue(value) —— 在可容的情况下添加元素到尾部 621 | - dequeue() —— 删除最早添加的元素并返回其值 622 | - empty() 623 | - full() 624 | - [ ] 花销: 625 | - 在糟糕的实现情况下,使用链表所实现的队列,其入列和出列的时间复杂度将会是 O(n)。 626 | 因为,你需要找到下一个元素,以致循环整个队列 627 | - enqueue:O(1)(平摊(amortized)、链表和数组 [探测(probing)]) 628 | - dequeue:O(1)(链表和数组) 629 | - empty:O(1)(链表和数组) 630 | 631 | - ### 哈希表(Hash table) 632 | - [ ] 视频: 633 | - [ ] [链式哈希表(视频)](https://www.youtube.com/watch?v=0M_kIqhwbFo&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=8) 634 | - [ ] [Table Doubling 和 Karp-Rabin(视频)](https://www.youtube.com/watch?v=BRO7mVIFt08&index=9&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb) 635 | - [ ] [Open Addressing 和密码型哈希(Cryptographic Hashing)(视频)](https://www.youtube.com/watch?v=rvdJDijO2Ro&index=10&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb) 636 | - [ ] [PyCon 2010:强大的字典(视频)](https://www.youtube.com/watch?v=C4Kc8xzcA68) 637 | - [ ] [PyCon 2017:字典更强大(视频)](https://www.youtube.com/watch?v=66P5FMkWoVU) 638 | - [ ] [(高级) 随机化:通用和完美哈希(视频)](https://www.youtube.com/watch?v=z0lJ2k0sl1g&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=11) 639 | - [ ] [(进阶)完美哈希(Perfect hashing)(视频)](https://www.youtube.com/watch?v=N0COwN14gt0&list=PL2B4EEwhKD-NbwZ4ezj7gyc_3yNrojKM9&index=4) 640 | - [ ] [[复习]4分钟了解哈希表(视频)](https://youtu.be/knV86FlSXJ8) 641 | 642 | - [ ] 在线课程: 643 | - [ ] [核心哈希表(视频)](https://www.coursera.org/lecture/data-structures-optimizing-performance/core-hash-tables-m7UuP) 644 | - [ ] [数据结构(视频)](https://www.coursera.org/learn/data-structures/home/week/4) 645 | - [ ] [电话簿问题(视频)](https://www.coursera.org/lecture/data-structures/phone-book-problem-NYZZP) 646 | - [ ] 分布式哈希表: 647 | - [Dropbox中的即时上传和存储优化(视频)](https://www.coursera.org/lecture/data-structures/instant-uploads-and-storage-optimization-in-dropbox-DvaIb) 648 | - [分布式哈希表(视频)](https://www.coursera.org/lecture/data-structures/distributed-hash-tables-tvH8H) 649 | 650 | - [ ] 使用线性探测法的数组实现 651 | - hash(k, m) - m是哈希表的大小 652 | - add(key, value) - 如果键已存在,则更新值 653 | - exists(key) - 检查键是否存在 654 | - get(key) - 获取给定键的值 655 | - remove(key) - 删除给定键的值 656 | 657 | ## 更多的知识 658 | 659 | - ### 二分查找(Binary search) 660 | - [ ] [二分查找(视频)](https://www.youtube.com/watch?v=D5SrAga1pno) 661 | - [ ] [二分查找(视频)](https://www.khanacademy.org/computing/computer-science/algorithms/binary-search/a/binary-search) 662 | - [ ] [详情](https://www.topcoder.com/community/data-science/data-science-tutorials/binary-search/) 663 | - [ ] [蓝图](https://leetcode.com/discuss/general-discussion/786126/python-powerful-ultimate-binary-search-template-solved-many-problems) 664 | - [ ] [【复习】四分钟二分查找(视频)](https://youtu.be/fDKIpRe8GW4) 665 | - [ ] 实现: 666 | - 二分查找(在一个已排序好的整型数组中查找) 667 | - 迭代式二分查找 668 | 669 | - ### 按位运算(Bitwise operations) 670 | - [ ] [Bits 速查表](https://github.com/jwasham/coding-interview-university/blob/main/extras/cheat%20sheets/bits-cheat-sheet.pdf) ── 你需要知道大量2的幂数值(从2^1 到 2^16 及 2^32) 671 | - [ ] 好好理解位操作符的含义:&、|、^、~、>>、<< 672 | - [ ] [字码(words)](https://en.wikipedia.org/wiki/Word_(computer_architecture)) 673 | - [ ] 好的介绍: 674 | [位操作(视频)](https://www.youtube.com/watch?v=7jkIUgLC29I) 675 | - [ ] [C 语言编程教程 2-10:按位运算(视频)](https://www.youtube.com/watch?v=d0AwjSpNXR0) 676 | - [ ] [位操作](https://en.wikipedia.org/wiki/Bit_manipulation) 677 | - [ ] [按位运算](https://en.wikipedia.org/wiki/Bitwise_operation) 678 | - [ ] [Bithacks](https://graphics.stanford.edu/~seander/bithacks.html) 679 | - [ ] [位元抚弄者(The Bit Twiddler)](http://bits.stephan-brumme.com/) 680 | - [ ] [交互式位元抚弄者(The Bit Twiddler Interactive)](http://bits.stephan-brumme.com/interactive.html) 681 | - [ ] [位操作技巧(Bit Hacks)(视频)](https://www.youtube.com/watch?v=ZusiKXcz_ac) 682 | - [ ] [练习位操作](https://pconrad.github.io/old_pconrad_cs16/topics/bitOps/) 683 | - [ ] 一补数和补码 684 | - [二进制:利 & 弊(为什么我们要使用补码)(视频)](https://www.youtube.com/watch?v=lKTsv6iVxV4) 685 | - [一补数(1s Complement)](https://en.wikipedia.org/wiki/Ones%27_complement) 686 | - [补码(2s Complement)](https://en.wikipedia.org/wiki/Two%27s_complement) 687 | - [ ] 计算置位(Set Bits) 688 | - [计算一个字节中置位(Set Bits)的四种方式(视频)](https://youtu.be/Hzuzo9NJrlc) 689 | - [计算比特位](https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan) 690 | - [如何在一个 32 位的整型中计算置位(Set Bits)的数量](http://stackoverflow.com/questions/109023/how-to-count-the-number-of-set-bits-in-a-32-bit-integer) 691 | - [ ] 交换值: 692 | - [交换(Swap)](http://bits.stephan-brumme.com/swap.html) 693 | - [ ] 绝对值: 694 | - [绝对整型(Absolute Integer)](http://bits.stephan-brumme.com/absInteger.html) 695 | 696 | ## 树(Trees) 697 | 698 | - ### 树-介绍 699 | - [ ] [树的介绍(视频)](https://www.coursera.org/learn/data-structures/lecture/95qda/trees) 700 | - [ ] [树遍历(视频)](https://www.coursera.org/lecture/data-structures/tree-traversal-fr51b) 701 | - [ ] [BFS(广度优先搜索)和DFS(深度优先搜索)(视频)](https://www.youtube.com/watch?v=uWL6FJhq5fM) 702 | - BFS 笔记 703 | - 层次遍历(BFS,使用队列) 704 | - 时间复杂度: O(n) 705 | - 空间复杂度:最佳情况:O(1),最坏情况:O(n/2)=O(n) 706 | - DFS 笔记: 707 | - 时间复杂度:O(n) 708 | - 空间复杂度: 709 | - 最好情况:O(log n) - 树的平均高度 710 | - 最坏情况:O(n) 711 | - 中序遍历(DFS:左、节点本身、右) 712 | - 后序遍历(DFS:左、右、节点本身) 713 | - 先序遍历(DFS:节点本身、左、右) 714 | - [ ] [[复习]4分钟内的广度优先搜索(视频)](https://youtu.be/HZ5YTanv5QE) 715 | - [ ] [[复习] 4分钟内的深度优先搜索(视频)](https://youtu.be/Urx87-NMm6c) 716 | - [ ] [[复习]11分钟内的树遍历(播放列表)(视频)](https://www.youtube.com/playlist?list=PL9xmBV_5YoZO1JC2RgEi04nLy6D-rKk6b) 717 | 718 | - ### 二叉查找树(Binary search trees):BSTs 719 | - [ ] [二叉搜索树复习(视频)](https://www.youtube.com/watch?v=x6At0nzX92o&index=1&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6) 720 | - [ ] [介绍(视频)](https://www.coursera.org/learn/data-structures/lecture/E7cXP/introduction) 721 | - [ ] [MIT(视频)](https://www.youtube.com/watch?v=9Jry5-82I68) 722 | - C/C++: 723 | - [ ] [二叉查找树 —— 在 C/C++ 中实现(视频)](https://www.youtube.com/watch?v=COZK7NATh4k&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P&index=28) 724 | - [ ] [BST 的实现 —— 在堆栈和堆中的内存分配(视频)](https://www.youtube.com/watch?v=hWokyBoo0aI&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P&index=29) 725 | - [ ] [在二叉查找树中找到最小和最大的元素(视频)](https://www.youtube.com/watch?v=Ut90klNN264&index=30&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P) 726 | - [ ] [寻找二叉树的高度(视频)](https://www.youtube.com/watch?v=_pnqMz5nrRs&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P&index=31) 727 | - [ ] [二叉树的遍历 —— 广度优先和深度优先策略(视频)](https://www.youtube.com/watch?v=9RHO6jU--GU&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P&index=32) 728 | - [ ] [二叉树:层序遍历(视频)](https://www.youtube.com/watch?v=86g8jAQug04&index=33&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P) 729 | - [ ] [二叉树的遍历:先序、中序、后序(视频)](https://www.youtube.com/watch?v=gm8DUJJhmY4&index=34&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P) 730 | - [ ] [判断一棵二叉树是否为二叉查找树(视频)](https://www.youtube.com/watch?v=yEwSGhSsT0U&index=35&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P) 731 | - [ ] [从二叉查找树中删除一个节点(视频)](https://www.youtube.com/watch?v=gcULXE7ViZw&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P&index=36) 732 | - [ ] [二叉查找树中序遍历的后继者(视频)](https://www.youtube.com/watch?v=5cPbNCrdotA&index=37&list=PL2_aWCzGMAwI3W_JlcBbtYTwiQSsOTa6P) 733 | - [ ] 实现: 734 | - [ ] [insert // 将值插入树中](https://leetcode.com/problems/insert-into-a-binary-search-tree/submissions/987660183/) 735 | - [ ] get_node_count // 查找树上的节点数 736 | - [ ] print_values // 从小到大打印树中节点的值 737 | - [ ] delete_tree 738 | - [ ] is_in_tree // 如果值存在于树中则返回 true 739 | - [ ] [get_height // 以节点为单位返回高度(单个节点的高度为1)](https://www.geeksforgeeks.org/find-the-maximum-depth-or-height-of-a-tree/) 740 | - [ ] get_min // 返回树上的最小值 741 | - [ ] get_max // 返回树上的最大值 742 | - [ ] is_binary_search_tree 743 | - [ ] delete_value 744 | - [ ] get_successor // 返回给定值的后继者,若没有则返回-1 745 | 746 | - ### 堆(Heap) / 优先级队列(Priority Queue) / 二叉堆(Binary Heap) 747 | - 以树形结构可视化,但通常在存储上是线性的(数组、链表) 748 | - [ ] [堆(Heap)](https://en.wikipedia.org/wiki/Heap_(data_structure)) 749 | - [ ] [堆简介(视频)](https://www.coursera.org/lecture/data-structures/introduction-2OpTs) 750 | - [ ] [二叉树(视频)](https://www.coursera.org/learn/data-structures/lecture/GRV2q/binary-trees) 751 | - [ ] [树高度备注(视频)](https://www.coursera.org/learn/data-structures/supplement/S5xxz/tree-height-remark) 752 | - [ ] [基本操作(视频)](https://www.coursera.org/learn/data-structures/lecture/0g1dl/basic-operations) 753 | - [ ] [完全二叉树(视频)](https://www.coursera.org/learn/data-structures/lecture/gl5Ni/complete-binary-trees) 754 | - [ ] [伪代码(视频)](https://www.coursera.org/learn/data-structures/lecture/HxQo9/pseudocode) 755 | - [ ] [堆排序 - 跳转到开始部分(视频)](https://youtu.be/odNJmw5TOEE?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=3291) 756 | - [ ] [堆排序(视频)](https://www.coursera.org/lecture/data-structures/heap-sort-hSzMO) 757 | - [ ] [构建堆(视频)](https://www.coursera.org/lecture/data-structures/building-a-heap-dwrOS) 758 | - [ ] [MIT:堆和堆排序(视频)](https://www.youtube.com/watch?v=B7hVxCmfPtM&index=4&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb) 759 | - [ ] [CS 61B Lecture 24:优先队列(视频)](https://archive.org/details/ucberkeley_webcast_yIUFT6AKBGE) 760 | - [ ] [线性时间构建堆(大顶堆)](https://www.youtube.com/watch?v=MiyLo8adrWw) 761 | - [ ] [[复习] 13分钟了解堆(视频)](https://www.youtube.com/playlist?list=PL9xmBV_5YoZNsyqgPW-DNwUeT8F8uhWc6) 762 | - [ ] 实现一个大顶堆: 763 | - [ ] insert 764 | - [ ] sift_up —— 用于插入元素 765 | - [ ] get_max —— 返回最大值但不移除元素 766 | - [ ] get_size() —— 返回存储的元素数量 767 | - [ ] is_empty() —— 若堆为空则返回 true 768 | - [ ] extract_max —— 返回最大值并移除 769 | - [ ] sift_down —— 用于获取最大值元素 770 | - [ ] remove(i) —— 删除指定索引的元素 771 | - [ ] heapify —— 构建堆,用于堆排序 772 | - [ ] heap_sort() —— 拿到一个未排序的数组,然后使用大顶堆或者小顶堆进行就地排序 773 | 774 | ## 排序(Sorting) 775 | 776 | - [ ] 笔记: 777 | - 实现各种排序,知道每种排序的最坏、最好和平均的复杂度分别是什么场景: 778 | - 不要用冒泡排序 - 效率太差 - 时间复杂度 O(n^2), 除非 n <= 16 779 | - [ ] 排序算法的稳定性 ("快排是稳定的么?") 780 | - [排序算法的稳定性](https://en.wikipedia.org/wiki/Sorting_algorithm#Stability) 781 | - [排序算法的稳定性](http://stackoverflow.com/questions/1517793/stability-in-sorting-algorithms) 782 | - [排序算法的稳定性](http://www.geeksforgeeks.org/stability-in-sorting-algorithms/) 783 | - [排序算法 - 稳定性](http://homepages.math.uic.edu/~leon/cs-mcs401-s08/handouts/stability.pdf) 784 | - [ ] 哪种排序算法可以用链表?哪种用数组?哪种两者都可? 785 | - 并不推荐对一个链表排序,但归并排序是可行的. 786 | - [链表的归并排序](http://www.geeksforgeeks.org/merge-sort-for-linked-list/) 787 | 788 | - 关于堆排序,请查看前文堆的数据结构部分。堆排序很强大,不过是非稳定排序。 789 | 790 | - [ ] [Sedgewick ── 归并排序(5个视频)](https://www.coursera.org/learn/algorithms-part1/home/week/3) 791 | - [ ] [1. 归并排序(Mergesort)](https://www.coursera.org/lecture/algorithms-part1/mergesort-ARWDq) 792 | - [ ] [2. 自底向上的归并排序(Bottom up Mergesort)](https://www.coursera.org/learn/algorithms-part1/lecture/PWNEl/bottom-up-mergesort) 793 | - [ ] [3. 排序复杂性(Sorting Complexity)](https://www.coursera.org/lecture/algorithms-part1/sorting-complexity-xAltF) 794 | - [ ] [4. 比较器(Comparators)](https://www.coursera.org/lecture/algorithms-part1/comparators-9FYhS) 795 | - [ ] [5. 稳定性(Stability)](https://www.coursera.org/learn/algorithms-part1/lecture/pvvLZ/stability) 796 | 797 | - [ ] [Sedgewick ── 快速排序(4个视频)](https://www.coursera.org/learn/algorithms-part1/home/week/3) 798 | - [ ] [1. 快速排序(Quicksort)](https://www.coursera.org/lecture/algorithms-part1/quicksort-vjvnC) 799 | - [ ] [2. 选择排序(Selection)](https://www.coursera.org/lecture/algorithms-part1/selection-UQxFT) 800 | - [ ] [3. 重复键(Duplicate Keys)](https://www.coursera.org/lecture/algorithms-part1/duplicate-keys-XvjPd) 801 | - [ ] [4. 系统排序(System Sorts)](https://www.coursera.org/lecture/algorithms-part1/system-sorts-QBNZ7) 802 | 803 | - [ ] 加州大学伯克利分校: 804 | - [ ] [CS 61B Lecture 29:排序 I(视频)](https://archive.org/details/ucberkeley_webcast_EiUvYS2DT6I) 805 | - [ ] [CS 61B Lecture 30:排序 II(视频)](https://archive.org/details/ucberkeley_webcast_2hTY3t80Qsk) 806 | - [ ] [CS 61B Lecture 32:排序 III(视频)](https://archive.org/details/ucberkeley_webcast_Y6LOLpxg6Dc) 807 | - [ ] [CS 61B Lecture 33:排序 V(视频)](https://archive.org/details/ucberkeley_webcast_qNMQ4ly43p4) 808 | - [ ] [CS 61B 2014-04-21:基数排序(视频)](https://archive.org/details/ucberkeley_webcast_pvbBMd-3NoI) 809 | 810 | - [ ] [冒泡排序(视频)](https://www.youtube.com/watch?v=P00xJgWzz2c&index=1&list=PL89B61F78B552C1AB) 811 | - [ ] [冒泡排序分析(视频)](https://www.youtube.com/watch?v=ni_zk257Nqo&index=7&list=PL89B61F78B552C1AB) 812 | - [ ] [插入排序 & 归并排序(视频)](https://www.youtube.com/watch?v=Kg4bqzAqRBM&index=3&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb) 813 | - [ ] [插入排序(视频)](https://www.youtube.com/watch?v=c4BRHC7kTaQ&index=2&list=PL89B61F78B552C1AB) 814 | - [ ] [归并排序(视频)](https://www.youtube.com/watch?v=GCae1WNvnZM&index=3&list=PL89B61F78B552C1AB) 815 | - [ ] [快排(视频)](https://www.youtube.com/watch?v=y_G9BkAm6B8&index=4&list=PL89B61F78B552C1AB) 816 | - [ ] [选择排序(视频)](https://www.youtube.com/watch?v=6nDMgr0-Yyo&index=8&list=PL89B61F78B552C1AB) 817 | 818 | - [ ] 归并排序代码: 819 | - [ ] [使用外部数组(C语言)](http://www.cs.yale.edu/homes/aspnes/classes/223/examples/sorting/mergesort.c) 820 | - [ ] [使用外部数组(Python语言)](https://github.com/jwasham/practice-python/blob/master/merge_sort/merge_sort.py) 821 | - [ ] [对原数组直接排序(C++)](https://github.com/jwasham/practice-cpp/blob/master/merge_sort/merge_sort.cc) 822 | - [ ] 快速排序代码: 823 | - [ ] [实现(C语言)](http://www.cs.yale.edu/homes/aspnes/classes/223/examples/randomization/quick.c) 824 | - [ ] [实现(C语言)](https://github.com/jwasham/practice-c/blob/master/quick_sort/quick_sort.c) 825 | - [ ] [实现(Python语言)](https://github.com/jwasham/practice-python/blob/master/quick_sort/quick_sort.py) 826 | 827 | - [ ] [[Review] Sorting (playlist) in 18 minutes](https://www.youtube.com/playlist?list=PL9xmBV_5YoZOZSbGAXAPIq1BeUf4j20pl) 828 | - [ ] [Quick sort in 4 minutes (video)](https://youtu.be/Hoixgm4-P4M) 829 | - [ ] [Heap sort in 4 minutes (video)](https://youtu.be/2DmK_H7IdTo) 830 | - [ ] [Merge sort in 3 minutes (video)](https://youtu.be/4VqmGXwpLqc) 831 | - [ ] [Bubble sort in 2 minutes (video)](https://youtu.be/xli_FI7CuzA) 832 | - [ ] [Selection sort in 3 minutes (video)](https://youtu.be/g-PGLbMth_g) 833 | - [ ] [Insertion sort in 2 minutes (video)](https://youtu.be/JU767SDMDvA) 834 | 835 | - [ ] 实现: 836 | - [ ] 归并:平均和最差情况的时间复杂度为 O(n log n)。 837 | - [ ] 快排:平均时间复杂度为 O(n log n)。 838 | - 选择排序和插入排序的最坏、平均时间复杂度都是 O(n^2)。 839 | - 关于堆排序,请查看前文堆的数据结构部分。 840 | 841 | - [ ] 有兴趣的话,还有一些补充,但并不是必须的: 842 | - [Sedgewick──基数排序 (6个视频)](https://www.coursera.org/learn/algorithms-part2/home/week/3) 843 | - [ ] [1. Java 中的字符串](https://www.coursera.org/learn/algorithms-part2/lecture/vGHvb/strings-in-java) 844 | - [ ] [2. 键值索引计数(Key Indexed Counting)](https://www.coursera.org/learn/algorithms-part2/lecture/2pi1Z/key-indexed-counting) 845 | - [ ] [3. Least Significant Digit First String Radix Sort](https://www.coursera.org/learn/algorithms-part2/lecture/c1U7L/lsd-radix-sort) 846 | - [ ] [4. Most Significant Digit First String Radix Sort](https://www.coursera.org/learn/algorithms-part2/lecture/gFxwG/msd-radix-sort) 847 | - [ ] [5. 3中基数快速排序](https://www.coursera.org/learn/algorithms-part2/lecture/crkd5/3-way-radix-quicksort) 848 | - [ ] [6. 后继数组(Suffix Arrays)](https://www.coursera.org/learn/algorithms-part2/lecture/TH18W/suffix-arrays) 849 | - [ ] [基数排序](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#radixSort) 850 | - [ ] [基数排序(视频)](https://www.youtube.com/watch?v=xhr26ia4k38) 851 | - [ ] [基数排序, 计数排序 (线性时间内)(视频)](https://www.youtube.com/watch?v=Nz1KZXbghj8&index=7&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb) 852 | - [ ] [随机算法: 矩阵相乘, 快排, Freivalds' 算法(视频)](https://www.youtube.com/watch?v=cNB2lADK3_s&index=8&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp) 853 | - [ ] [线性时间内的排序(视频)](https://www.youtube.com/watch?v=pOKy3RZbSws&list=PLUl4u3cNGP61hsJNdULdudlRL493b-XZf&index=14) 854 | 855 | 总结一下,这是[15种排序算法](https://www.youtube.com/watch?v=kPRA0W1kECg)的可视化表示。 856 | 如果你需要有关此主题的更多详细信息,请参阅“[一些主题的额外内容](#一些主题的额外内容)”中的“排序”部分。 857 | 858 | ## 图(Graphs) 859 | 860 | 图表可以用来表示计算机科学中的许多问题,所以这一部分很长,就像树和排序一样。 861 | 862 | - 笔记: 863 | - 有4种基本方式在内存里表示一个图: 864 | - 对象和指针 865 | - 邻接矩阵 866 | - 邻接表 867 | - 邻接图 868 | - 熟悉以上每一种图的表示法,并了解各自的优缺点 869 | - 广度优先搜索和深度优先搜索:知道它们的计算复杂度和设计上的权衡以及如何用代码实现它们 870 | - 遇到一个问题时,首先尝试基于图的解决方案,如果没有再去尝试其他的。 871 | 872 | - MIT(视频): 873 | - [广度优先搜索](https://www.youtube.com/watch?v=s-CYnVz-uh4&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=13) 874 | - [深度优先搜索](https://www.youtube.com/watch?v=AfSk24UTFS8&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=14) 875 | 876 | - [ ] Skiena 教授的课程 - 很不错的介绍: 877 | - [ ] [CSE373 2012 - 课程 11 - 图的数据结构(视频)](https://www.youtube.com/watch?v=OiXxhDrFruw&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=11) 878 | - [ ] [CSE373 2012 - 课程 12 - 广度优先搜索(视频)](https://www.youtube.com/watch?v=g5vF8jscteo&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=12) 879 | - [ ] [CSE373 2012 - 课程 13 - 图的算法(视频)](https://www.youtube.com/watch?v=S23W6eTcqdY&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&index=13) 880 | - [ ] [CSE373 2012 - 课程 14 - 图的算法 (1)(视频)](https://www.youtube.com/watch?v=WitPBKGV0HY&index=14&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b) 881 | - [ ] [CSE373 2012 - 课程 15 - 图的算法 (2)(视频)](https://www.youtube.com/watch?v=ia1L30l7OIg&index=15&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b) 882 | - [ ] [CSE373 2012 - 课程 16 - 图的算法 (3)(视频)](https://www.youtube.com/watch?v=jgDOQq6iWy8&index=16&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b) 883 | 884 | - [ ] 图 (复习和其他): 885 | 886 | - [ ] [6.006 单源最短路径问题(视频)](https://www.youtube.com/watch?v=Aa2sqUhIn-E&index=15&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb) 887 | - [ ] [6.006 Dijkstra算法(视频)](https://www.youtube.com/watch?v=NSHizBK9JD8&t=1731s&ab_channel=MITOpenCourseWare) 888 | - [ ] [6.006 Bellman-Ford算法(视频)](https://www.youtube.com/watch?v=f9cVS_URPc0&ab_channel=MITOpenCourseWare) 889 | - [ ] [6.006 加速Dijkstra算法(视频)](https://www.youtube.com/watch?v=CHvQ3q_gJ7E&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=18) 890 | - [ ] [Aduni:图算法 I - 拓扑排序,最小生成树,Prim算法 - 讲座6(视频)](https://www.youtube.com/watch?v=i_AQT_XfvD8&index=6&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm) 891 | - [ ] [Aduni:图算法 II - DFS,BFS,Kruskal算法,Union Find数据结构 - 讲座7(视频)](https://www.youtube.com/watch?v=ufj5_bppBsA&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=7) 892 | - [ ] [Aduni:图算法 III:最短路径 - 讲座8(视频)](https://www.youtube.com/watch?v=DiedsPsMKXc&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=8) 893 | - [ ] [Aduni:图算法 IV:几何算法入门 - 讲座9(视频)](https://www.youtube.com/watch?v=XIAQRlNkJAw&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=9) 894 | - [ ] [CS 61B 2014:加权图(视频)](https://archive.org/details/ucberkeley_webcast_zFbq8vOZ_0k) 895 | - [ ] [贪婪算法:最小生成树(视频)](https://www.youtube.com/watch?v=tKwnms5iRBU&index=16&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp) 896 | - [ ] [强连通分量Kosaraju算法图算法(视频)](https://www.youtube.com/watch?v=RpgcYiky7uw) 897 | - [ ] [[复习] 最短路径算法(播放列表)16分钟(视频)](https://www.youtube.com/playlist?list=PL9xmBV_5YoZO-Y-H3xIC9DGSfVYJng9Yw) 898 | - [ ] [[复习] 最小生成树(播放列表)4分钟(视频)](https://www.youtube.com/playlist?list=PL9xmBV_5YoZObEi3Hf6lmyW-CBfs7nkOV) 899 | 900 | - 完整的 Coursera 课程: 901 | - [ ] [图的算法(视频)](https://www.coursera.org/learn/algorithms-on-graphs/home/welcome) 902 | 903 | - 我会实现: 904 | - [ ] DFS 邻接表 (递归) 905 | - [ ] DFS 邻接表 (栈迭代) 906 | - [ ] DFS 邻接矩阵 (递归) 907 | - [ ] DFS 邻接矩阵 (栈迭代) 908 | - [ ] BFS 邻接表 909 | - [ ] BFS 邻接矩阵 910 | - [ ] 单源最短路径问题 (Dijkstra) 911 | - [ ] 最小生成树 912 | - 基于 DFS 的算法 (根据上文 Aduni 的视频): 913 | - [ ] 检查环 (我们会先检查是否有环存在以便做拓扑排序) 914 | - [ ] 拓扑排序 915 | - [ ] 计算图中的连通分支 916 | - [ ] 列出强连通分量 917 | - [ ] 检查双向图 918 | 919 | ## 更多知识 920 | 921 | - ### 递归(Recursion) 922 | - [ ] Stanford 大学关于递归 & 回溯的课程: 923 | - [ ] [课程 8 | 抽象编程(视频)](https://www.youtube.com/watch?v=gl3emqCuueQ&list=PLFE6E58F856038C69&index=8) 924 | - [ ] [课程 9 | 抽象编程(视频)](https://www.youtube.com/watch?v=uFJhEPrbycQ&list=PLFE6E58F856038C69&index=9) 925 | - [ ] [课程 10 | 抽象编程(视频)](https://www.youtube.com/watch?v=NdF1QDTRkck&index=10&list=PLFE6E58F856038C69) 926 | - [ ] [课程 11 | 抽象编程(视频)](https://www.youtube.com/watch?v=p-gpaIGRCQI&list=PLFE6E58F856038C69&index=11) 927 | - 什么时候适合使用 928 | - 尾递归会更好么? 929 | - [ ] [什么是尾递归以及为什么它如此糟糕?](https://www.quora.com/What-is-tail-recursion-Why-is-it-so-bad) 930 | - [ ] [尾递归(视频)](https://www.coursera.org/lecture/programming-languages/tail-recursion-YZic1) 931 | - [ ] [解决任何递归问题的5个简单步骤(视频)](https://youtu.be/ngCos392W4w) 932 | 933 | 回溯蓝图: [Java](https://leetcode.com/problems/combination-sum/discuss/16502/A-general-approach-to-backtracking-questions-in-Java-(Subsets-Permutations-Combination-Sum-Palindrome-Partitioning)) 934 | [Python](https://leetcode.com/problems/combination-sum/discuss/429538/General-Backtracking-questions-solutions-in-Python-for-reference-%3A) 935 | - ### 动态规划(Dynamic Programming) 936 | - 在你的面试中或许没有任何动态规划的问题, 937 | 但能够知道一个题目可以使用动态规划来解决是很重要的。 938 | - 这一部分会有点困难,每个可以用动态规划解决的问题都必须先定义出递推关系,要推导出来可能会有点棘手。 939 | - 我建议先阅读和学习足够多的动态规划的例子,以便对解决 DP 问题的一般模式有个扎实的理解。 940 | - [ ] 视频: 941 | - [ ] [Skiena:CSE373 2020 - 讲座19 - 动态规划简介(视频)](https://www.youtube.com/watch?v=wAA0AMfcJHQ&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=18) 942 | - [ ] [Skiena:CSE373 2020 - 讲座20 - 编辑距离(视频)](https://www.youtube.com/watch?v=T3A4jlHlhtA&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=19) 943 | - [ ] [Skiena:CSE373 2020 - 讲座20 - 编辑距离(续)(视频)](https://www.youtube.com/watch?v=iPnPVcZmRbE&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=20) 944 | - [ ] [Skiena:CSE373 2020 - 讲座21 - 动态规划(视频)](https://www.youtube.com/watch?v=2xPE4Wq8coQ&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=21) 945 | - [ ] [Skiena:CSE373 2020 - 讲座22 - 动态规划和复习(视频)](https://www.youtube.com/watch?v=Yh3RzqQGsyI&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=22) 946 | - [ ] [Simonson:动态规划 0(从59:18开始)(视频)](https://youtu.be/J5aJEcOr6Eo?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=3558) 947 | - [ ] [Simonson:动态规划 I - 第11讲(视频)](https://www.youtube.com/watch?v=0EzHjQ_SOeU&index=11&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm) 948 | - [ ] [Simonson:动态规划 II - 第12讲(视频)](https://www.youtube.com/watch?v=v1qiRwuJU7g&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=12) 949 | - [ ] 单独的动态规划问题列表(每个都很短): 950 | [动态规划(视频)](https://www.youtube.com/playlist?list=PLrmLmBdmIlpsHaNTPP_jHHDx_os9ItYXr) 951 | - [ ] 耶鲁课程笔记: 952 | - [ ] [动态规划](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#dynamicProgramming) 953 | - [ ] Coursera 课程: 954 | - [ ] [RNA 二级结构问题(视频)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/80RrW/the-rna-secondary-structure-problem) 955 | - [ ] [动态规划算法(视频)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/PSonq/a-dynamic-programming-algorithm) 956 | - [ ] [DP 算法描述(视频)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/oUEK2/illustrating-the-dp-algorithm) 957 | - [ ] [DP 算法的运行时间(视频)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/nfK2r/running-time-of-the-dp-algorithm) 958 | - [ ] [DP vs 递归实现(视频)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/M999a/dp-vs-recursive-implementation) 959 | - [ ] [全局成对序列排列(视频)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/UZ7o6/global-pairwise-sequence-alignment) 960 | - [ ] [本地成对序列排列(视频)](https://www.coursera.org/learn/algorithmic-thinking-2/lecture/WnNau/local-pairwise-sequence-alignment) 961 | 962 | - ### 设计模式 963 | - [ ] [UML 统一建模语言概览 (视频)](https://www.youtube.com/watch?v=3cmzqZzwNDM&list=PLGLfVvz_LVvQ5G-LdJ8RLqe-ndo7QITYc&index=3) 964 | - [ ] 主要有如下的设计模式: 965 | - [ ] 策略模式(strategy) 966 | - [ ] 单例模式(singleton) 967 | - [ ] 适配器模式(adapter) 968 | - [ ] 原型模式(prototype) 969 | - [ ] 装饰器模式(decorator) 970 | - [ ] 访问者模式(visitor) 971 | - [ ] 工厂模式,抽象工厂模式(factory, abstract factory) 972 | - [ ] 外观模式(facade) 973 | - [ ] 观察者模式(observer) 974 | - [ ] 代理模式(proxy) 975 | - [ ] 委托模式(delegate) 976 | - [ ] 命令模式(command) 977 | - [ ] 状态模式(state) 978 | - [ ] 备忘录模式(memento) 979 | - [ ] 迭代器模式(iterator) 980 | - [ ] 组合模式(composite) 981 | - [ ] 享元模式(flyweight) 982 | - [ ] [系列视频(27个)](https://www.youtube.com/playlist?list=PLF206E906175C7E07) 983 | - [ ] [书籍:《Head First设计模式》](https://www.amazon.com/Head-First-Design-Patterns-Freeman/dp/0596007124) 984 | - I know the canonical book is "Design Patterns: Elements of Reusable Object-Oriented Software", but Head First is great for beginners to OO. 985 | - [Handy reference: 101 Design Patterns & Tips for Developers](https://sourcemaking.com/design-patterns-and-tips) 986 | 987 | - ### 组合(Combinatorics) (n 中选 k 个) & 概率(Probability) 988 | - [ ] [数据技巧: 如何找出阶乘、排列和组合(选择)(视频)](https://www.youtube.com/watch?v=8RRo6Ti9d0U) 989 | - [ ] [来点学校的东西: 概率(视频)](https://www.youtube.com/watch?v=sZkAAk9Wwa4) 990 | - [ ] [来点学校的东西: 概率和马尔可夫链(视频)](https://www.youtube.com/watch?v=dNaJg-mLobQ) 991 | - [ ] 可汗学院: 992 | - 课程设置: 993 | - [ ] [概率理论基础](https://www.khanacademy.org/math/probability/probability-and-combinatorics-topic) 994 | - 只有视频 - 41 (每一个都短小精悍): 995 | - [ ] [概率解释(视频)](https://www.youtube.com/watch?v=uzkc-qNVoOk&list=PLC58778F28211FA19) 996 | 997 | - ### NP, NP-Completeness和近似算法 998 | - 知道最经典的一些 NP-Completeness 问题,比如旅行商问题和背包问题, 999 | 而且能在面试官试图忽悠你的时候识别出他们。 1000 | - 知道 NP-Completeness 是什么意思. 1001 | - [ ] [计算复杂度(视频)](https://www.youtube.com/watch?v=moPtwq_cVH8&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=23) 1002 | - [ ] Simonson: 1003 | - [ ] [贪心算法. II & 介绍 NP-Completeness(视频)](https://youtu.be/qcGnJ47Smlo?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=2939) 1004 | - [ ] [NP-Completeness II & 归约(视频)](https://www.youtube.com/watch?v=e0tGC6ZQdQE&index=16&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm) 1005 | - [ ] [NP-Completeness III(视频)](https://www.youtube.com/watch?v=fCX1BGT3wjE&index=17&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm) 1006 | - [ ] [NP-Completeness IV(视频)](https://www.youtube.com/watch?v=NKLDp3Rch3M&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=18) 1007 | - [ ] Skiena: 1008 | - [ ] [CSE373 2012 - 课程 23 - 介绍 NP-Completeness IV(视频)](https://youtu.be/KiK5TVgXbFg?list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b&t=1508) 1009 | - [ ] [CSE373 2012 - 课程 24 - NP-Completeness证明(视频)](https://www.youtube.com/watch?v=27Al52X3hd4&index=24&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b) 1010 | - [ ] [CSE373 2012 - 课程 25 - NP-Completeness挑战(视频)](https://www.youtube.com/watch?v=xCPH4gwIIXM&index=25&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b) 1011 | - [ ] [CSE373 2020年 - 第26讲 - NP-Completeness挑战(视频)](https://www.youtube.com/watch?v=_EzetTkG_Cc&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=26) 1012 | - [ ] [复杂度: P, NP, NP-完全性, 规约(视频)](https://www.youtube.com/watch?v=eHZifpgyH_4&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=22) 1013 | - [ ] [复杂度: 近视算法 Algorithms(视频)](https://www.youtube.com/watch?v=MEz1J9wY2iM&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=24) 1014 | - [ ] [复杂度: 固定参数算法(视频)](https://www.youtube.com/watch?v=4q-jmGrmxKs&index=25&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp) 1015 | - Peter Norvik 讨论旅行商问题的近似最优解: 1016 | - [Jupyter 笔记本](http://nbviewer.jupyter.org/url/norvig.com/ipython/TSP.ipynb) 1017 | - 《算法导论》(CLRS)的第 1048 - 1140 页。 1018 | 1019 | - ### 计算机如何处理程序 1020 | 1021 | - [ ] [CPU如何执行程序(视频)](https://www.youtube.com/watch?v=XM4lGflQFvA) 1022 | - [ ] [计算机如何进行计算 - 算术逻辑单元(视频)](https://youtu.be/1I5ZMmrOfnA) 1023 | - [ ] [寄存器和RAM(视频)](https://youtu.be/fpnE6UAfbtU) 1024 | - [ ] [中央处理器(CPU)(视频)](https://youtu.be/FZGugFqdr60) 1025 | - [ ] [指示和程序(视频)](https://youtu.be/zltgXvg6r3k) 1026 | - ### 缓存(Cache) 1027 | - [ ] LRU 缓存: 1028 | - [ ] [LRU 的魔力 (100 Days of Google Dev)(视频)](https://www.youtube.com/watch?v=R5ON3iwx78M) 1029 | - [ ] [实现 LRU(视频)](https://www.youtube.com/watch?v=bq6N7Ym81iI) 1030 | - [ ] [LeetCode - 146 LRU Cache (C++)(视频)](https://www.youtube.com/watch?v=8-FZRAjR7qU) 1031 | - [ ] CPU 缓存: 1032 | - [ ] [MIT 6.004 L15: 存储体系(视频)](https://www.youtube.com/watch?v=vjYF_fAZI5E&list=PLrRW1w6CGAcXbMtDFj205vALOGmiRc82-&index=24) 1033 | - [ ] [MIT 6.004 L16: 缓存的问题(视频)](https://www.youtube.com/watch?v=ajgC3-pyGlk&index=25&list=PLrRW1w6CGAcXbMtDFj205vALOGmiRc82-) 1034 | 1035 | - ### 进程(Processe)和线程(Thread) 1036 | - [ ] 计算机科学 162 - 操作系统 (25 个视频): 1037 | - 视频 1-11 是关于进程和线程 1038 | - [操作系统和系统编程(视频)](https://archive.org/details/ucberkeley-webcast-PL-XXv-cvA_iBDyz-ba4yDskqMDY6A1w_c) 1039 | - [进程和线程的区别是什么?](https://www.quora.com/What-is-the-difference-between-a-process-and-a-thread) 1040 | - 涵盖了: 1041 | - 进程、线程、协程 1042 | - 进程和线程的区别 1043 | - 进程 1044 | - 线程 1045 | - 锁 1046 | - 互斥 1047 | - 信号量 1048 | - 监控 1049 | - 他们是如何工作的 1050 | - 死锁 1051 | - 活锁 1052 | - CPU 活动, 中断, 上下文切换 1053 | - 现代多核处理器的并发式结构 1054 | - [分页(paging),分段(segmentation)和虚拟内存(视频)](https://www.youtube.com/watch?v=LKe7xK0bF7o&list=PLCiOXwirraUCBE9i_ukL8_Kfg6XNv7Se8&index=2) 1055 | - [中断(视频)](https://www.youtube.com/watch?v=uFKi2-J-6II&list=PLCiOXwirraUCBE9i_ukL8_Kfg6XNv7Se8&index=3) 1056 | - 进程资源需要(内存:代码、静态存储器、栈、堆、文件描述符、I/O) 1057 | - 线程资源需要(在同一个进程内和其他线程共享以上(除了栈)的资源,但是每个线程都有独立的程序计数器、栈计数器、寄存器和栈) 1058 | - Fork 操作是真正的写时复制(只读),直到新的进程写到内存中,才会生成一份新的拷贝。 1059 | - 上下文切换 1060 | - [操作系统和底层硬件如何启动上下文切换?](https://www.javatpoint.com/what-is-the-context-switching-in-the-operating-system) 1061 | - [ ] [C++ 的线程 (系列 - 10 个视频)](https://www.youtube.com/playlist?list=PL5jc9xFGsL8E12so1wlMS0r0hTQoJL74M) 1062 | - [ ] [CS 377 春季'14:马萨诸塞大学的操作系统](https://www.youtube.com/playlist?list=PLacuG5pysFbDQU8kKxbUh4K5c1iL5_k7k) 1063 | - [ ] Python 的并发 (视频): 1064 | - [ ] [线程系列](https://www.youtube.com/playlist?list=PL1H1sBF1VAKVMONJWJkmUh6_p8g4F2oy1) 1065 | - [ ] [Python 线程](https://www.youtube.com/watch?v=Bs7vPNbB9JM) 1066 | - [ ] [理解 Python 的 GIL (2010)](https://www.youtube.com/watch?v=Obt-vMVdM8s) 1067 | - [参考](http://www.dabeaz.com/GIL) 1068 | - [ ] [David Beazley - Python 协程 - PyCon 2015](https://www.youtube.com/watch?v=MCs5OvhV9S4) 1069 | - [ ] [Keynote David Beazley - 兴趣主题 (Python 异步 I/O)](https://www.youtube.com/watch?v=ZzfHjytDceU) 1070 | - [ ] [Python 中的互斥](https://www.youtube.com/watch?v=0zaPs8OtyKY) 1071 | 1072 | - ### 测试 1073 | - 涵盖了: 1074 | - 单元测试是如何工作的 1075 | - 什么是模拟对象 1076 | - 什么是集成测试 1077 | - 什么是依赖注入 1078 | - [ ] [James Bach 讲敏捷软件测试(视频)](https://www.youtube.com/watch?v=SAhJf36_u5U) 1079 | - [ ] [James Bach 软件测试公开课(视频)](https://www.youtube.com/watch?v=ILkT_HV9DVU) 1080 | - [ ] [Steve Freeman - 测试驱动的开发(视频)](https://vimeo.com/83960706) 1081 | - [slides](http://gotocon.com/dl/goto-berlin-2013/slides/SteveFreeman_TestDrivenDevelopmentThatsNotWhatWeMeant.pdf) 1082 | - [ ] 依赖注入: 1083 | - [ ] [视频](https://www.youtube.com/watch?v=IKD2-MAkXyQ) 1084 | - [ ] [测试之道](http://jasonpolites.github.io/tao-of-testing/ch3-1.1.html) 1085 | - [ ] [如何编写测试](http://jasonpolites.github.io/tao-of-testing/ch4-1.1.html) 1086 | 1087 | - ### 字符串搜索和操作 1088 | - [ ] [Sedgewick──后缀数组(Suffix Arrays)(视频)](https://www.coursera.org/learn/algorithms-part2/lecture/TH18W/suffix-arrays) 1089 | - [ ] [Sedgewick──子字符串搜寻(视频)](https://www.coursera.org/learn/algorithms-part2/home/week/4) 1090 | - [ ] [1. 子字符串搜寻导论](https://www.coursera.org/learn/algorithms-part2/lecture/n3ZpG/introduction-to-substring-search) 1091 | - [ ] [2. 子字符串搜寻──暴力法](https://www.coursera.org/learn/algorithms-part2/lecture/2Kn5i/brute-force-substring-search) 1092 | - [ ] [3. KMP算法](https://www.coursera.org/learn/algorithms-part2/lecture/TAtDr/knuth-morris-pratt) 1093 | - [ ] [4. Boyer-Moore算法](https://www.coursera.org/learn/algorithms-part2/lecture/CYxOT/boyer-moore) 1094 | - [ ] [5. Rabin-Karp算法](https://www.coursera.org/learn/algorithms-part2/lecture/3KiqT/rabin-karp) 1095 | - [ ] [文本的搜索模式(视频)](https://www.coursera.org/learn/data-structures/lecture/tAfHI/search-pattern-in-text) 1096 | 1097 | 如果你需要有关此主题的更多详细信息,请参阅“[一些主题的额外内容](#一些主题的额外内容)”中的“字符串匹配”部分。 1098 | 1099 | - ### 字典树(Tries) 1100 | 1101 | - 需要注意的是,字典树各式各样。有些有前缀,而有些则没有。有些使用字符串而不使用比特位来追踪路径。 1102 | - 阅读代码,但不实现。 1103 | - [Sedgewick──字典树(3个视频)](https://www.coursera.org/learn/algorithms-part2/home/week/4) 1104 | - [ ] [1. R Way字典树](https://www.coursera.org/learn/algorithms-part2/lecture/CPVdr/r-way-tries) 1105 | - [ ] [2. 三元搜索树](https://www.coursera.org/learn/algorithms-part2/lecture/yQM8K/ternary-search-tries) 1106 | - [ ] [3. 基于字符串的操作](https://www.coursera.org/learn/algorithms-part2/lecture/jwNmV/character-based-operations) 1107 | - [ ] [数据结构笔记及编程技术](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#Tries) 1108 | - [ ] 短课程视频: 1109 | - [ ] [对字典树的介绍(视频)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/08Xyf/core-introduction-to-tries) 1110 | - [ ] [字典树的性能(视频)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/PvlZW/core-performance-of-tries) 1111 | - [ ] [实现一棵字典树(视频)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/DFvd3/core-implementing-a-trie) 1112 | - [ ] [字典树:一个被忽略的数据结构](https://www.toptal.com/java/the-trie-a-neglected-data-structure) 1113 | - [ ] [TopCoder —— 使用字典树](https://www.topcoder.com/community/data-science/data-science-tutorials/using-tries/) 1114 | - [ ] [标准教程(现实中的用例)(视频)](https://www.youtube.com/watch?v=TJ8SkcUSdbU) 1115 | - [ ] [MIT,高阶数据结构,字符串(视频中间有点困难)(视频)](https://www.youtube.com/watch?v=NinWEPPrkDQ&index=16&list=PLUl4u3cNGP61hsJNdULdudlRL493b-XZf) 1116 | 1117 | - ### 浮点数 1118 | - [ ] 简单的8位: [浮点数的表示 - 1(视频 - 计算中有错误 - 请查看视频描述)](https://www.youtube.com/watch?v=ji3SfClm8TU) 1119 | 1120 | - ### Unicode 1121 | - [ ] [每一个软件开发者的绝对最低限度,必须要知道的关于 Unicode 和字符集知识](http://www.joelonsoftware.com/articles/Unicode.html) 1122 | - [ ] [关于处理文本需要的编码和字符集,每个程序员绝对需要知道的知识](http://kunststube.net/encoding/) 1123 | 1124 | - ### 字节序(Endianness) 1125 | - [大/小端序](https://web.archive.org/web/20180107141940/http://www.cs.umd.edu:80/class/sum2003/cmsc311/Notes/Data/endian.html) 1126 | - [大端序 Vs 小端序(视频)](https://www.youtube.com/watch?v=JrNF0KRAlyo) 1127 | - [由里入内的大端序与小端序(视频)](https://www.youtube.com/watch?v=oBSuXP-1Tc0) 1128 | - 对于内核开发非常具有技术性,如果大多数的内容听不懂也没关系。 1129 | - 前半部就已经足够了。 1130 | 1131 | - ### 网络(视频) 1132 | - **如果你具有网络经验或想成为可靠性工程师或运维工程师,期待你的问题** 1133 | - 知道这些有益无害,多多益善! 1134 | - [ ] [可汗学院](https://www.khanacademy.org/computing/computer-science/computers-and-internet-code-org) 1135 | - [ ] [UDP 和 TCP:网络传输协议中的数据压缩(视频)](https://www.youtube.com/watch?v=Vdc8TCESIg8) 1136 | - [ ] [TCP/IP 和 OSI 模型解释!(视频)](https://www.youtube.com/watch?v=e5DEVa9eSN0) 1137 | - [ ] [互联网上的数据包传输。网络和 TCP/IP 教程。(视频)](https://www.youtube.com/watch?v=nomyRJehhnM) 1138 | - [ ] [HTTP(视频)](https://www.youtube.com/watch?v=WGJrLqtX7As) 1139 | - [ ] [SSL 和 HTTPS(视频)](https://www.youtube.com/watch?v=S2iBR2ZlZf0) 1140 | - [ ] [SSL/TLS(视频)](https://www.youtube.com/watch?v=Rp3iZUvXWlM) 1141 | - [ ] [HTTP 2.0(视频)](https://www.youtube.com/watch?v=E9FxNzv1Tr8) 1142 | - [ ] [视频系列(21个视频)](https://www.youtube.com/playlist?list=PLEbnTDJUr_IegfoqO4iPnPYQui46QqT0j) 1143 | - [ ] [子网络解密 - 第五部分 经典内部域名指向 CIDR 标记(视频)](https://www.youtube.com/watch?v=t5xYI0jzOf4) 1144 | - [ ] 套接字(Sockets): 1145 | - [Java──套接字──介绍(视频)](https://www.youtube.com/watch?v=6G_W54zuadg&t=6s) 1146 | - [套接字编程(视频)](https://www.youtube.com/watch?v=G75vN2mnJeQ) 1147 | 1148 | --- 1149 | 1150 | ## 最终复习 1151 | 1152 | 本节将包含一系列短视频,您可以迅速观看,以便复习大部分重要概念。 1153 | 如果您经常需要温习知识,这会很有帮助。 1154 | 1155 | - [ ] 一系列2-3分钟的短主题视频(共23个视频) 1156 | - [视频链接](https://www.youtube.com/watch?v=r4r1DZcx1cM&list=PLmVb1OknmNJuC5POdcDv5oCS7_OUkDgpj&index=22) 1157 | - [ ] 一系列2-5分钟的短主题视频 - Michael Sambol(共48个视频): 1158 | - [视频链接](https://www.youtube.com/@MichaelSambol) 1159 | - [代码示例](https://github.com/msambol/dsa) 1160 | - [ ] [Sedgewick的算法课程视频 - 算法I](https://www.coursera.org/learn/algorithms-part1) 1161 | - [ ] [Sedgewick的算法课程视频 - 算法II](https://www.coursera.org/learn/algorithms-part2) 1162 | 1163 | --- 1164 | 1165 | ## 更新你的简历 1166 | 1167 | - 在书籍《Cracking The Coding Interview》和《Programming Interviews Exposed》中查看简历准备信息。 1168 | - [“这就是一个优秀简历的样子” by Gayle McDowell(《Cracking the Coding Interview》的作者)](https://www.careercup.com/resume), 1169 | - 作者备注:“这是针对美国的简历。印度和其他国家的简历有不同的期望,尽管许多要点是相同的。” 1170 | - [“逐步简历指南” by Tech Interview Handbook](https://www.techinterviewhandbook.org/resume/guide) 1171 | - 详细指南,教您如何从零开始设置您的简历,编写有效的简历内容,优化它,并测试您的简历。 1172 | 1173 | ## 面试流程与一般面试准备 1174 | 1175 | - [ ] [如何在2021年通过工程师面试](https://davidbyttow.medium.com/how-to-pass-the-engineering-interview-in-2021-45f1b389a1) 1176 | - [ ] [揭秘技术招聘过程](https://www.youtube.com/watch?v=N233T0epWTs) 1177 | - [ ] 如何在四大科技巨头公司中找到工作: 1178 | - [ ] [如何在四大科技巨头公司中找到工作 - 亚马逊、Facebook、谷歌和微软(视频)](https://www.youtube.com/watch?v=YJZCUhxNCv8) 1179 | - [ ] [如何在四大科技巨头公司中找到工作1(后续视频)](https://www.youtube.com/watch?v=6790FVXWBw8&feature=youtu.be) 1180 | - [ ] 《破解编程面试》第一集: 1181 | - [ ] [Gayle L McDowell - Cracking The Coding Interview(视频)](https://www.youtube.com/watch?v=rEJzOhC5ZtQ) 1182 | - [ ] [与作者Gayle Laakmann McDowell一起破解编程面试(视频)](https://www.youtube.com/watch?v=aClxtDcdpsQ) 1183 | - [ ] 破解Facebook编程面试: 1184 | - [ ] [方法论](https://www.youtube.com/watch?v=wCl9kvQGHPI) 1185 | - [ ] [问题演示](https://www.youtube.com/watch?v=4UWDyJq8jZg) 1186 | - 面试准备课程: 1187 | - [数据结构、算法和面试的Python课程(付费课程):](https://www.udemy.com/python-for-data-structures-algorithms-and-interviews/): 1188 | - 以Python为中心的面试准备课程,涵盖数据结构、算法、模拟面试等内容。 1189 | - [使用Python的数据结构和算法简介(Udacity免费课程):](https://www.udacity.com/course/data-structures-and-algorithms-in-python--ud513): 1190 | - 一个免费的以Python为中心的数据结构和算法课程。 1191 | - [数据结构和算法纳米学位!(Udacity付费纳米学位):](https://www.udacity.com/course/data-structures-and-algorithms-nanodegree--nd256): 1192 | - 提供超过100个数据结构和算法练习的实际操作体验,并得到专属导师的指导,以帮助您为面试和实际工作做准备。 1193 | - [Grokking行为面试(Educative免费课程):](https://www.educative.io/courses/grokking-the-behavioral-interview): 1194 | - 很多时候,阻碍您获得梦想工作的不是您的技术能力,而是您在行为面试中的表现。 1195 | - [AlgoMonster(付费课程,提供免费内容):)](https://algo.monster/?utm_campaign=jwasham&utm_medium=referral&utm_content=coding-interview-university&utm_source=github): 1196 | - LeetCode的速成课程。涵盖了从成千上万的问题中提炼出的所有模式。 1197 | 1198 | 模拟面试: 1199 | - [Gainlo.co:来自大公司的模拟面试官](http://www.gainlo.co/#!/) - 我用过这个,帮助我放松进行电话和现场面试。 1200 | - [Pramp:与同行进行模拟面试](https://www.pramp.com/) - 同行模式的实践面试。 1201 | - [interviewing.io:与资深工程师进行模拟面试 ](https://interviewing.io) - 匿名算法/系统设计面试,与FAANG公司的资深工程师进行。 1202 | - [Meetapro:与顶级FAANG面试官进行模拟面试 ](https://meetapro.com/?utm_source=ciu) - 类似Airbnb的模拟面试/指导平台。 1203 | - [Hello Interview:与专家教练和人工智能模拟面试](https://www.hellointerview.com/?utm_source=ciu) - 直接与人工智能或 FAANG 员工工程师和经理面试。 1204 | 1205 | ## 当面试来临的时候 1206 | 1207 | 随着下面列举的问题思考下你可能会遇到的 20 个面试问题,每个问题准备 2-3 种回答。 1208 | 准备点故事,不要只是摆一些你完成的事情的数据,相信我,人人都喜欢听故事。 1209 | 1210 | - 你为什么想得到这份工作? 1211 | - 你解决过的最有难度的问题是什么? 1212 | - 面对过的最大挑战是什么? 1213 | - 见过的最好或者最坏的设计是怎么样的? 1214 | - 对某个产品提出改进建议。 1215 | - 你作为一个个体同时也是团队的一员,如何达到最好的工作状态? 1216 | - 你的什么技能或者经验是你的角色中不可或缺的,为什么? 1217 | - 你在某份工作或某个项目中最享受的是什么? 1218 | - 你在某份工作或某个项目中面临过的最大挑战是什么? 1219 | - 你在某份工作或某个项目中遇到过的最硬的 Bug 是什么样的? 1220 | - 你在某份工作或某个项目中学到了什么? 1221 | - 你在某份工作或某个项目中哪些地方还可以做的更好? 1222 | 1223 | ## 问面试官的问题 1224 | 1225 | 我会问的一些:(可能我已经知道了答案但我想听听面试官的看法或者了解团队的前景): 1226 | 1227 | - 团队多大规模? 1228 | - 开发周期是怎样的? 会使用瀑布流/极限编程/敏捷开发么? 1229 | - 经常会为截止日期(deadlines)加班么? 或者是有弹性的? 1230 | - 团队里怎么做技术选型? 1231 | - 每周平均开多少次会? 1232 | - 你觉得工作环境有助于员工集中精力吗? 1233 | - 目前正在做什么工作? 1234 | - 喜欢这些事情吗? 1235 | - 工作期限是怎么样的? 1236 | - 工作生活怎么平衡? 1237 | 1238 | ## 当你获得了梦想的职位 1239 | 1240 | 恭喜你! 1241 | 1242 | 继续学习。 1243 | 1244 | 活到老,学到老。 1245 | 1246 | --- 1247 | 1248 | ***************************************************************************************************** 1249 | ***************************************************************************************************** 1250 | 1251 | 下面的内容都是可选的。 1252 | 通过学习这些内容,你将会得到更多的有关 CS 的概念,并将为所有的软件工程工作做更好的准备。 1253 | 你将会成为一个更全面的软件工程师。 1254 | 1255 | ***************************************************************************************************** 1256 | ***************************************************************************************************** 1257 | 1258 | --- 1259 | 1260 | ## 额外书籍 1261 | 1262 | 你可以从以下的书单挑选你有兴趣的主题来研读。 1263 | 1264 | - [UNIX环境高级编程](https://www.amazon.com/dp/013937681X) 1265 | - 老,但却很棒 1266 | - [Linux 命令行大全](https://www.amazon.com/dp/1593273894/) 1267 | - 现代选择 1268 | - [TCP-IP详解系列](https://en.wikipedia.org/wiki/TCP/IP_Illustrated) 1269 | - [Head First 设计模式](https://www.amazon.com/gp/product/0596007124/) 1270 | - 设计模式入门介绍 1271 | - [设计模式:可复用面向对象软件的基础](https://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612) 1272 | - 也被称为“四人帮”(Gang of Four(GOF)) 1273 | - 经典设计模式书籍 1274 | - [算法设计手冊(Skiena)](http://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/dp/1849967202) 1275 | - 作为复习以及问题辨别 1276 | - 这本书中算法的部分难度已经超过面试会出现的 1277 | - 本书分为两个部分: 1278 | - 数据结构和算法课本 1279 | - 优点: 1280 | - 跟其他算法课本一样是个很棒的复习素材 1281 | - 包含作者以往解决工业及学术上问题的经验的故事 1282 | - 含C语言代码示例 1283 | - 缺点: 1284 | - 某些地方跟《算法导论》(CLRS)一样艰深,但在某些主题,算法导论或许是更好的选择。 1285 | - 第7、8、9章有点难以消化,因为某些地方并没有解释得很清楚,或者根本上我就是个学渣 1286 | - 别会错意了,我很喜欢 Skiena 的教学方法以及他的风格。 1287 | - 算法目录: 1288 | - 这个部分是买这本书的最大原因 1289 | - 我即将着手进行这部分,一旦完成这部分我会再更新上来 1290 | - 可以在 kindle 上租 1291 | - 解答: 1292 | - [解答](https://web.archive.org/web/20150404194210/http://www.algorithm.cs.sunysb.edu/algowiki/index.php/The_Algorithms_Design_Manual_(Second_Edition)) 1293 | - [勘误表](http://www3.cs.stonybrook.edu/~skiena/algorist/book/errata) 1294 | - [算法](http://jeffe.cs.illinois.edu/teaching/algorithms/) (Jeff Erickson) 1295 | - [编程卓越之道(第一卷):深入理解计算机](https://www.amazon.com/Write-Great-Code-Understanding-Machine/dp/1593270038) 1296 | - 该书于2004年出版,虽然有些过时,但是对于简单了解计算机而言,这是一个了不起的资源 1297 | - 作者发明了[高阶组合语言 HLA](https://en.wikipedia.org/wiki/High_Level_Assembly),所以提到,并且举了一些HLA的例子。里面没有用到很多,但都是很棒的组合语言的例子。 1298 | - 这些章节值得阅读,为你提供良好的基础: 1299 | - 第2章──数字表示 1300 | - 第3章──二进制算术和位运算 1301 | - 第4章──浮点表示 1302 | - 第5章──字符表示 1303 | - 第6章──内存组织和访问 1304 | - 第7章──组合数据类型和内存对象 1305 | - 第9章──CPU体系结构 1306 | - 第10章──指令集架构 1307 | - 第11章──内存体系结构和组织 1308 | - [算法导论](https://www.amazon.com/Introduction-Algorithms-fourth-Thomas-Cormen/dp/026204630X) 1309 | - **重要提示**:读这本书的价值有限。本书很好地回顾了算法和数据结构,但不会教你如何编写良好的代码。你必须能够有效地编写一个不错的解决方案 1310 | - 又称 CLR,有时是 CLRS,因为 Stein 最后才加入 1311 | - [计算机体系结构,第六版:定量方法](https://www.amazon.com/dp/0128119055) 1312 | - 对于更丰富、更时新(2017年)但较长的处理方式 1313 | 1314 | ## 系统设计、可扩展性和数据处理 1315 | 1316 | **如果您有4年以上的工作经验,可以预期会遇到系统设计问题。** 1317 | 1318 | - 可扩展性和系统设计是一个非常广泛的主题,涵盖了许多内容和资源, 1319 | 因为在设计一个可以扩展的软件/硬件系统时需要考虑很多因素。 1320 | 预计需要花费相当多的时间来学习这方面的知识。 1321 | - 考虑要点: 1322 | - 可扩展性 1323 | - 将大数据集归纳为单一值 1324 | - 将一个数据集转换为另一个数据集 1325 | - 处理海量数据 1326 | - 系统设计 1327 | - 功能集 1328 | - 接口 1329 | - 类层次结构 1330 | - 在特定约束下设计系统 1331 | - 简单性和鲁棒性 1332 | - 权衡 1333 | - 性能分析和优化 1334 | - [ ] **从这里开始**: [The System Design Primer](https://github.com/donnemartin/system-design-primer) 1335 | - [ ] [HiredInTech的系统设计](http://www.hiredintech.com/system-design/) 1336 | - [ ] [如何准备回答技术面试中的设计问题?](https://www.quora.com/How-do-I-prepare-to-answer-design-questions-in-a-technical-interview?redirected_qid=1500023) 1337 | - [ ] [通过8个步骤掌握系统设计面试](https://javascript.plainenglish.io/8-steps-guide-to-ace-a-system-design-interview-7a5a797f4d7d) 1338 | - [ ] [数据库规范化 - 第一范式、第二范式、第三范式和第四范式(视频)](https://www.youtube.com/watch?v=UrYLYV7WSHM) 1339 | - [ ] [系统设计面试 ](https://github.com/checkcheckzz/system-design-interview) - 这个资源有很多内容。浏览文章和示例。我列出了一些示例在下面。 1340 | - [ ] [如何在系统设计面试中脱颖而出](https://web.archive.org/web/20120716060051/http://www.palantir.com/2011/10/how-to-rock-a-systems-design-interview/) 1341 | - [ ] [每个人都应该了解的数字](http://everythingisdata.wordpress.com/2009/10/17/numbers-everyone-should-know/) 1342 | - [ ] [进行上下文切换需要多长时间?](http://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html) 1343 | - [ ] [跨数据中心的事务(视频)](https://www.youtube.com/watch?v=srOgpXECblk) 1344 | - [ ] [CAP定理的简明英文介绍](http://ksat.me/a-plain-english-introduction-to-cap-theorem) 1345 | - [ ] [MIT 6.824:分布式系统,2020年春季(20个视频)](https://www.youtube.com/watch?v=cQP8WApzIQQ&list=PLrw6a1wE39_tb2fErI4-WkMbsvGQk9_UB) 1346 | - [ ] 共识算法: 1347 | - [ ] Paxos - [Paxos协议 - Computerphile(视频)](https://www.youtube.com/watch?v=s8JqcZtvnsM) 1348 | - [ ] Raft - [Raft分布式共识算法简介(视频)](https://www.youtube.com/watch?v=P9Ydif5_qvE) 1349 | - [ ] [易于理解的论文](https://raft.github.io/) 1350 | - [ ] [信息图](http://thesecretlivesofdata.com/raft/) 1351 | - [ ] [一致性哈希](http://www.tom-e-white.com/2007/11/consistent-hashing.html) 1352 | - [ ] [NoSQL模式](http://horicky.blogspot.com/2009/11/nosql-patterns.html) 1353 | - [ ] 可扩展性: 1354 | - 您不需要掌握所有这些内容,只需选择一些您感兴趣的。 1355 | - [ ] [优秀的概述(视频)](https://www.youtube.com/watch?v=-W9F__D3oY4) 1356 | - [ ] 短系列: 1357 | - [克隆](http://www.lecloud.net/post/7295452622/scalability-for-dummies-part-1-clones) 1358 | - [数据库](http://www.lecloud.net/post/7994751381/scalability-for-dummies-part-2-database) 1359 | - [缓存](http://www.lecloud.net/post/9246290032/scalability-for-dummies-part-3-cache) 1360 | - [异步性](http://www.lecloud.net/post/9699762917/scalability-for-dummies-part-4-asynchronism) 1361 | - [ ] [可扩展的Web架构和分布式系统](http://www.aosabook.org/en/distsys.html) 1362 | - [ ] [分布式计算的谬误解释](https://pages.cs.wisc.edu/~zuyu/files/fallacies.pdf) 1363 | - [ ] [Jeff Dean - 在Google构建软件系统以及吸取的教训(视频)](https://www.youtube.com/watch?v=modXC5IWTJI) 1364 | - [ ] [架构师为规模而设计的介绍](http://lethain.com/introduction-to-architecting-systems-for-scale/) 1365 | - [ ] [缩放移动游戏以面向全球受众使用App Engine和Cloud Datastore(视频)](https://www.youtube.com/watch?v=9nWyWwY2Onc) 1366 | - [ ] [谷歌是如何进行面向全球基础设施的大规模工程的(视频)](https://www.youtube.com/watch?v=H4vMcD7zKM0) 1367 | - [ ] [算法的重要性](https://www.topcoder.com/thrive/articles/The%20Importance%20of%20Algorithms) 1368 | - [ ] [分片](http://highscalability.com/blog/2009/8/6/an-unorthodox-approach-to-database-design-the-coming-of-the.html) 1369 | - [ ] [针对长期目标的工程 - Astrid Atkinson主题演讲(视频)](https://www.youtube.com/watch?v=p0jGmgIrf_M&list=PLRXxvay_m8gqVlExPC5DG3TGWJTaBgqSA&index=4) 1370 | - [ ] [在30分钟内了解YouTube 7年的可扩展性经验](http://highscalability.com/blog/2012/3/26/7-years-of-youtube-scalability-lessons-in-30-minutes.html) 1371 | - [视频](https://www.youtube.com/watch?v=G-lGCC4KKok) 1372 | - [ ] [PayPal如何使用仅8台VM每天处理数十亿次交易](http://highscalability.com/blog/2016/8/15/how-paypal-scaled-to-billions-of-transactions-daily-using-ju.html) 1373 | - [ ] [如何在大型数据集中去重](https://blog.clevertap.com/how-to-remove-duplicates-in-large-datasets/) 1374 | - [ ] [通过Jon Cowie深入了解Etsy的规模和工程文化(视频)](https://www.youtube.com/watch?v=3vV4YiqKm1o) 1375 | - [ ] [Amazon是如何转向自己的微服务架构的](http://thenewstack.io/led-amazon-microservices-architecture/) 1376 | - [ ] [压缩还是不压缩,这是Uber面临的问题](https://eng.uber.com/trip-data-squeeze/) 1377 | - [ ] [何时应使用近似查询处理?](http://highscalability.com/blog/2016/2/25/when-should-approximate-query-processing-be-used.html) 1378 | - [ ] [谷歌从单一数据中心到故障转移再到本地多家数据中心架构的转变]( http://highscalability.com/blog/2016/2/23/googles-transition-from-single-datacenter-to-failover-to-a-n.html) 1379 | - [ ] [为每天处理数百万请求的图像优化技术](http://highscalability.com/blog/2016/6/15/the-image-optimization-technology-that-serves-millions-of-re.html) 1380 | - [ ] [Patreon架构简介](http://highscalability.com/blog/2016/2/1/a-patreon-architecture-short.html) 1381 | - [ ] [如何在Instagram庞大的推荐引擎中决定您将看到谁?](http://highscalability.com/blog/2016/1/27/tinder-how-does-one-of-the-largest-recommendation-engines-de.html) 1382 | - [ ] [现代缓存设计](http://highscalability.com/blog/2016/1/25/design-of-a-modern-cache.html) 1383 | - [ ] [在Facebook规模下进行直播视频流](http://highscalability.com/blog/2016/1/13/live-video-streaming-at-facebook-scale.html) 1384 | - [ ] [在亚马逊AWS上如何扩展到1100万以上的用户](http://highscalability.com/blog/2016/1/11/a-beginners-guide-to-scaling-to-11-million-users-on-amazons.html) 1385 | - [ ] [全面了解Netflix整个堆栈](http://highscalability.com/blog/2015/11/9/a-360-degree-view-of-the-entire-netflix-stack.html) 1386 | - [ ] [延迟无处不在,而且它会让您丧失销售机会 - 如何应对](http://highscalability.com/latency-everywhere-and-it-costs-you-sales-how-crush-it) 1387 | - [ ] [Instagram的动力:数百个实例,几十种技术](http://instagram-engineering.tumblr.com/post/13649370142/what-powers-instagram-hundreds-of-instances) 1388 | - [ ] [Salesforce架构 - 如何处理每天13亿次交易](http://highscalability.com/blog/2013/9/23/salesforce-architecture-how-they-handle-13-billion-transacti.html) 1389 | - [ ] [ESPN规模上的架构 - 每秒操作10万次“嘟嘟噜嘟嘟噜”](http://highscalability.com/blog/2013/11/4/espns-architecture-at-scale-operating-at-100000-duh-nuh-nuhs.html) 1390 | - [ ] 在下面的“消息、序列化和队列系统”部分查看一些将服务连接在一起的技术信息 1391 | - [ ] Twitter: 1392 | - [O'Reilly MySQL CE 2011: Jeremy Cole, "Big and Small Data at @Twitter" (视频)](https://www.youtube.com/watch?v=5cKTP36HVgI) 1393 | - [时间轴扩展](https://www.infoq.com/presentations/Twitter-Timeline-Scalability) 1394 | - 欲知更多信息,请参阅[Video Series](#video-series) 部分中的“Mining Massive Datasets”视频系列 1395 | - [ ] 练习系统设计过程:以下是一些建议您在纸上尝试的想法,每个想法都有一些关于如何在现实世界中处理的文档: 1396 | - 复习: [The System Design Primer](https://github.com/donnemartin/system-design-primer) 1397 | - [HiredInTech的系统设计](http://www.hiredintech.com/system-design/) 1398 | - [速查表](https://github.com/jwasham/coding-interview-university/blob/main/extras/cheat%20sheets/system-design.pdf) 1399 | - 流程: 1400 | 1. 理解问题和范围: 1401 | - 定义用例,与面试官的帮助 1402 | - 提出额外的功能 1403 | - 移除面试官认为超出范围的项目 1404 | - 假设需要高可用性,并将其添加为用例 1405 | 2. 考虑限制: 1406 | - 询问每月有多少个请求 1407 | - 询问每秒有多少个请求(他们可能会主动提供或让您计算) 1408 | - 估计读取与写入的百分比 1409 | - 保持估计时考虑80/20法则 1410 | - 每秒写入多少数据 1411 | - 在5年内所需的总存储量 1412 | - 每秒读取多少数据 1413 | 3. 抽象设计: 1414 | - 层(服务、数据、缓存) 1415 | - 基础架构:负载均衡、消息传递 1416 | - 驱动服务的任何关键算法的粗略概述 1417 | - 考虑瓶颈并确定解决方案 1418 | - 练习: 1419 | - [设计一个随机唯一ID生成系统](https://blog.twitter.com/2010/announcing-snowflake) 1420 | - [设计一个键值数据库](http://www.slideshare.net/dvirsky/introduction-to-redis) 1421 | - [设计一个图片分享系统](http://highscalability.com/blog/2011/12/6/instagram-architecture-14-million-users-terabytes-of-photos.html) 1422 | - [设计一个推荐系统](http://ijcai13.org/files/tutorial_slides/td3.pdf) 1423 | - [设计一个URL缩短系统:来自上面的复制](http://www.hiredintech.com/system-design/the-system-design-process/) 1424 | - [设计一个缓存系统](https://web.archive.org/web/20220217064329/https://adayinthelifeof.nl/2011/02/06/memcache-internals/) 1425 | 1426 | 1427 | ## 附加学习 1428 | 1429 | 我把它们加进来是为了让你成为更全方位的软件工程师,并且留意一些技术以及算法,让你拥有更大的工具箱。 1430 | 1431 | - ### 编译器 1432 | - [编译器的工作方式,约1分钟(视频)](https://www.youtube.com/watch?v=IhC7sdYe-Jg) 1433 | - [Harvard CS50-编译器(视频)](https://www.youtube.com/watch?v=CSZLNYF4Klo) 1434 | - [C ++(视频)](https://www.youtube.com/watch?v=twodd1KFfGk) 1435 | - [了解编译器优化(C ++)(视频)](https://www.youtube.com/watch?v=FnGCDLhaxKU) 1436 | 1437 | - ### Emacs and vi(m) 1438 | - 熟悉基于 unix 的代码编辑器 1439 | - vi(m): 1440 | - [使用 vim 进行编辑 01 - 安装, 设置和模式 (视频)](https://www.youtube.com/watch?v=5givLEMcINQ&index=1&list=PL13bz4SHGmRxlZVmWQ9DvXo1fEg4UdGkr) 1441 | - [VIM 的冒险之旅](http://vim-adventures.com/) 1442 | - 4 个视频集: 1443 | - [vi/vim 编辑器 - 课程 1](https://www.youtube.com/watch?v=SI8TeVMX8pk) 1444 | - [vi/vim 编辑器 - 课程 2](https://www.youtube.com/watch?v=F3OO7ZIOaJE) 1445 | - [vi/vim 编辑器 - 课程 4](https://www.youtube.com/watch?v=1lYD5gwgZIA) 1446 | - [vi/vim 编辑器 - 课程 3](https://www.youtube.com/watch?v=ZYEccA_nMaI) 1447 | - [使用 Vi 而不是 Emacs](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#Using_Vi_instead_of_Emacs) 1448 | - emacs: 1449 | - [基础 Emacs 教程 (视频)](https://www.youtube.com/watch?v=hbmV1bnQ-i0) 1450 | - 3 个视频集: 1451 | - [Emacs 教程 (初学者) -第 1 部分- 文件命令, 剪切/复制/粘贴, 自定义命令](https://www.youtube.com/watch?v=ujODL7MD04Q) 1452 | - [Emacs 教程 (初学者 -第 2 部分- Buffer 管理, 搜索, M-x grep 和 rgrep 模式](https://www.youtube.com/watch?v=XWpsRupJ4II) 1453 | - [Emacs 教程 (初学者 -第 3 部分- 表达式, 声明, ~/.emacs 文件和包机制](https://www.youtube.com/watch?v=paSgzPso-yc) 1454 | - [Evil 模式: 或许, 我是怎样对 Emacs 路人转粉的 (视频)](https://www.youtube.com/watch?v=JWD1Fpdd4Pc) 1455 | - [使用 Emacs 开发 C 程序](http://www.cs.yale.edu/homes/aspnes/classes/223/notes.html#Writing_C_programs_with_Emacs) 1456 | - [Emacs 绝对初学者指南(David Wilson的视频)](https://www.youtube.com/watch?v=48JlgiBpw_I&t=0s) 1457 | - [Emacs 绝对初学者指南(David Wilson 批注)](https://systemcrafters.net/emacs-essentials/absolute-beginners-guide-to-emacs/) 1458 | 1459 | - ### Unix 命令行工具 1460 | - 下列内容包含优秀工具 1461 | - bash 1462 | - cat 1463 | - grep 1464 | - sed 1465 | - awk 1466 | - curl or wget 1467 | - sort 1468 | - tr 1469 | - uniq 1470 | - [strace](https://en.wikipedia.org/wiki/Strace) 1471 | - [tcpdump](https://danielmiessler.com/study/tcpdump/) 1472 | 1473 | - ### 信息论 (视频) 1474 | - [Khan Academy 可汗学院](https://www.khanacademy.org/computing/computer-science/informationtheory) 1475 | - 更多有关马尔可夫的内容: 1476 | - [马尔可夫内容生成(Core Markov Text Generation)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/waxgx/core-markov-text-generation) 1477 | - [Core Implementing Markov Text Generation马尔可夫内容生成实现](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/gZhiC/core-implementing-markov-text-generation) 1478 | - [一个马尔可夫内容生成器的项目(Project = Markov Text Generation Walk Through)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/EUjrq/project-markov-text-generation-walk-through) 1479 | - 关于更多信息,请参照下方 MIT 6.050J 信息和系统复杂度的内容。 1480 | 1481 | - ### 奇偶校验位 & 汉明码 (视频) 1482 | - [入门](https://www.youtube.com/watch?v=q-3BctoUpHE) 1483 | - [奇偶校验位](https://www.youtube.com/watch?v=DdMcAUlxh1M) 1484 | - 汉明码(Hamming Code): 1485 | - [发现错误](https://www.youtube.com/watch?v=1A_NcXxdoCc) 1486 | - [修正错误](https://www.youtube.com/watch?v=JAMLuxdHH8o) 1487 | - [检查错误](https://www.youtube.com/watch?v=wbH2VxzmoZk) 1488 | 1489 | - ### 系统熵值(Entropy) 1490 | - 请参考下方视频 1491 | - 观看之前,请先确定观看了信息论的视频 1492 | - [信息理论, 克劳德·香农, 熵值, 系统冗余, 数据比特压缩 (视频)](https://youtu.be/JnJq3Py0dyM?t=176) 1493 | 1494 | - ### 密码学 1495 | - 请参考下方视频 1496 | - 观看之前,请先确定观看了信息论的视频 1497 | - [可汗学院](https://www.khanacademy.org/computing/computer-science/密码学) 1498 | - [密码学: 哈希函数](https://www.youtube.com/watch?v=KqqOXndnvic&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=30) 1499 | - [密码学: 加密](https://www.youtube.com/watch?v=9TNI2wHmaeI&index=31&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp) 1500 | 1501 | - ### 压缩 1502 | - 观看之前,请先确定观看了信息论的视频 1503 | - Computerphile (视频): 1504 | - [压缩](https://www.youtube.com/watch?v=Lto-ajuqW3w) 1505 | - [压缩熵值](https://www.youtube.com/watch?v=M5c_RFKVkko) 1506 | - [由上而下的树 (霍夫曼编码树)](https://www.youtube.com/watch?v=umTbivyJoiI) 1507 | - [额外比特 - 霍夫曼编码树](https://www.youtube.com/watch?v=DV8efuB3h2g) 1508 | - [优雅的压缩数据 (无损数据压缩方法)](https://www.youtube.com/watch?v=goOa3DGezUA) 1509 | - [Text Compression Meets Probabilities](https://www.youtube.com/watch?v=cCDCfoHTsaU) 1510 | - [数据压缩的艺术](https://www.youtube.com/playlist?list=PLOU2XLYxmsIJGErt5rrCqaSGTMyyqNt2H) 1511 | - [(可选) 谷歌开发者:GZIP 还差远了呢!](https://www.youtube.com/watch?v=whGwm0Lky2s) 1512 | 1513 | - ### 计算机安全 1514 | - [MIT(23个视频)](https://www.youtube.com/playlist?list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh) 1515 | - [威胁模型:入门](https://www.youtube.com/watch?v=GqmQg-cszw4&index=1&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh) 1516 | - [控制劫持攻击](https://www.youtube.com/watch?v=6bwzNg5qQ0o&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh&index=2) 1517 | - [缓冲区溢出漏洞攻击和防御](https://www.youtube.com/watch?v=drQyrzRoRiA&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh&index=3) 1518 | - [优先权区分](https://www.youtube.com/watch?v=6SIJmoE9L9g&index=4&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh) 1519 | - [能力](https://www.youtube.com/watch?v=8VqTSY-11F4&index=5&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh) 1520 | - [在沙盒中运行原生代码](https://www.youtube.com/watch?v=VEV74hwASeU&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh&index=6) 1521 | - [网络安全模型](https://www.youtube.com/watch?v=chkFBigodIw&index=7&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh) 1522 | - [网络安全应用](https://www.youtube.com/watch?v=EBQIGy1ROLY&index=8&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh) 1523 | - [标志化执行](https://www.youtube.com/watch?v=yRVZPvHYHzw&index=9&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh) 1524 | - [网络安全](https://www.youtube.com/watch?v=SIEVvk3NVuk&index=11&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh) 1525 | - [网络协议](https://www.youtube.com/watch?v=QOtA76ga_fY&index=12&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh) 1526 | - [旁路攻击](https://www.youtube.com/watch?v=PuVMkSEcPiI&index=15&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh) 1527 | 1528 | - ### 垃圾回收 1529 | - [ ] [Python 中的垃圾回收 (视频)](https://www.youtube.com/watch?v=iHVs_HkjdmI) 1530 | - [ ] [深度解析:论垃圾回收在 JAVA 中的重要性](https://www.infoq.com/presentations/garbage-collection-benefits) 1531 | - [ ] [深度解析:论垃圾回收在 Python 中的重要性(视频)](https://www.youtube.com/watch?v=P-8Z0-MhdQs&list=PLdzf4Clw0VbOEWOS_sLhT_9zaiQDrS5AR&index=3) 1532 | 1533 | - ### 并行编程 1534 | - [ ] [Coursera (Scala)](https://www.coursera.org/learn/parprog1/home/week/1) 1535 | - [ ] [用于高性能并行计算的高效Python(视频)](https://www.youtube.com/watch?v=uY85GkaYzBk) 1536 | 1537 | - ### 消息传递,序列化和队列系统 1538 | - [Thrift](https://thrift.apache.org/) 1539 | - [教程](http://thrift-tutorial.readthedocs.io/en/latest/intro.html) 1540 | - [协议缓冲](https://developers.google.com/protocol-buffers/) 1541 | - [教程](https://developers.google.com/protocol-buffers/docs/tutorials) 1542 | - [gRPC](http://www.grpc.io/) 1543 | - [gRPC 对于JAVA开发者的入门教程(视频)](https://www.youtube.com/watch?v=5tmPvSe7xXQ&list=PLcTqM9n_dieN0k1nSeN36Z_ppKnvMJoly&index=1) 1544 | - [Redis](http://redis.io/) 1545 | - [教程](http://try.redis.io/) 1546 | - [Amazon的 SQS 系统 (队列)](https://aws.amazon.com/sqs/) 1547 | - [Amazon的 SNS 系统 (pub-sub)](https://aws.amazon.com/sns/) 1548 | - [RabbitMQ](https://www.rabbitmq.com/) 1549 | - [入门教程](https://www.rabbitmq.com/getstarted.html) 1550 | - [Celery](http://www.celeryproject.org/) 1551 | - [Celery入门](http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html) 1552 | - [ZeroMQ](http://zeromq.org/) 1553 | - [入门教程](http://zeromq.org/intro:read-the-manual) 1554 | - [ActiveMQ](http://activemq.apache.org/) 1555 | - [Kafka](http://kafka.apache.org/documentation.html#introduction) 1556 | - [MessagePack](http://msgpack.org/index.html) 1557 | - [Avro](https://avro.apache.org/) 1558 | 1559 | - ### A*搜索算法 1560 | - [A 搜索算法](https://en.wikipedia.org/wiki/A*_search_algorithm) 1561 | - [A* 路径搜索(E01:算法解释)(视频)](https://www.youtube.com/watch?v=-L-WgKMFuhE) 1562 | 1563 | - ### 快速傅里叶变换 1564 | - [傅立叶变换的交互式指南](https://betterexplained.com/articles/an-interactive-guide-to-the-fourier-transform/) 1565 | - [什么是傅立叶变换?论傅立叶变换的用途](http://www.askamathematician.com/2012/09/q-what-is-a-fourier-transform-what-is-it-used-for/) 1566 | - [什么是傅立叶变换? (视频)](https://www.youtube.com/watch?v=Xxut2PN-V8Q) 1567 | - [分而治之:FFT(视频)](https://www.youtube.com/watch?v=iTMn0Kt18tg&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=4) 1568 | - [FTT 是什么](http://jakevdp.github.io/blog/2013/08/28/understanding-the-fft/) 1569 | 1570 | - ### 布隆过滤器 1571 | - 给定布隆过滤器m比特位和k个哈希函数,插入和成员检测都会是 O(k)。 1572 | - [布隆过滤器(视频)](https://www.youtube.com/watch?v=-SuTGoFYjZs) 1573 | - [布隆过滤器 | 数据挖掘 | Stanford University(视频)](https://www.youtube.com/watch?v=qBTdukbzc78) 1574 | - [教程](http://billmill.org/bloomfilter-tutorial/) 1575 | - [如何写一个布隆过滤器应用](http://blog.michaelschmatz.com/2016/04/11/how-to-write-a-bloom-filter-cpp/) 1576 | 1577 | - ### HyperLogLog 1578 | - [如何仅使用1.5KB内存计算十亿个不同的对象](http://highscalability.com/blog/2012/4/5/big-data-counting-how-to-count-a-billion-distinct-objects-us.html) 1579 | 1580 | - ### 局部敏感哈希 1581 | - 用于确定文件的相似性 1582 | - MD5 或 SHA 的反义词,用于确定2个文档/字符串是否完全相同 1583 | - [Simhashing(希望如此)变得简单](http://ferd.ca/simhashing-hopefully-made-simple.html) 1584 | 1585 | - ### van Emde Boas 树 1586 | - [分而治之:van Emde Boas 树 (视频)](https://www.youtube.com/watch?v=hmReJCupbNU&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=6) 1587 | - [MIT课堂笔记](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) 1588 | 1589 | - ### 增强数据结构 1590 | - [CS 61B 第 39 课: 增强数据结构](https://youtu.be/zksIj9O8_jc?list=PL4BBB74C7D2A1049C&t=950) 1591 | 1592 | - ### 平衡查找树(Balanced search trees) 1593 | - 掌握至少一种平衡查找树(并懂得如何实现): 1594 | - “在各种平衡查找树当中,AVL 树和2-3树已经成为了过去,而红黑树(red-black trees)看似变得越来越受人青睐。 1595 | 这种令人特别感兴趣的数据结构,亦称伸展树(splay tree)。 1596 | 它可以自我管理,且会使用轮换来移除任何访问过根节点的键。” —— Skiena 1597 | - 因此,在各种各样的平衡查找树当中,我选择了伸展树来实现。 1598 | 虽然,通过我的阅读,我发现在面试中并不会被要求实现一棵平衡查找树。 1599 | 但是,为了胜人一筹,我们还是应该看看如何去实现。在阅读了大量关于红黑树的代码后, 1600 | 我才发现伸展树的实现确实会使得各方面更为高效。 1601 | - 伸展树:插入、查找、删除函数的实现,而如果你最终实现了红黑树,那么请尝试一下: 1602 | - 跳过删除函数,直接实现搜索和插入功能 1603 | - 我希望能阅读到更多关于 B 树的资料,因为它也被广泛地应用到大型的数据集当中。 1604 | - [自平衡二叉查找树](https://en.wikipedia.org/wiki/Self-balancing_binary_search_tree) 1605 | 1606 | - **AVL 树** 1607 | - 实际中: 1608 | 我能告诉你的是,该种树并无太多的用途,但我能看到有用的地方在哪里: 1609 | AVL 树是另一种平衡查找树结构。其可支持时间复杂度为 O(log n) 的查询、插入及删除。 1610 | 它比红黑树严格意义上更为平衡,从而导致插入和删除更慢,但遍历却更快。正因如此,才彰显其结构的魅力。 1611 | 只需要构建一次,就可以在不重新构造的情况下读取, 1612 | 适合于实现诸如语言字典(或程序字典,如一个汇编程序或解释程序的操作码)。 1613 | - [MIT AVL 树 / AVL 树的排序(视频)](https://www.youtube.com/watch?v=FNeL18KsWPc&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=6) 1614 | - [AVL 树(视频)](https://www.coursera.org/learn/data-structures/lecture/Qq5E0/avl-trees) 1615 | - [AVL 树的实现(视频)](https://www.coursera.org/learn/data-structures/lecture/PKEBC/avl-tree-implementation) 1616 | - [分离与合并](https://www.coursera.org/learn/data-structures/lecture/22BgE/split-and-merge) 1617 | - [[Review] AVL Trees (playlist) in 19 minutes (video)](https://www.youtube.com/playlist?list=PL9xmBV_5YoZOUFgdIeOPuH6cfSnNRMau-) 1618 | 1619 | - **伸展树** 1620 | - 实际中: 1621 | 伸展树一般用于缓存、内存分配者、路由器、垃圾回收者、数据压缩、ropes 1622 | (字符串的一种替代品,用于存储长串的文本字符)、 1623 | Windows NT(虚拟内存、网络及文件系统)等的实现。 1624 | - [CS 61B:伸展树(Splay trees)(视频)](https://www.youtube.com/watch?v=Najzh1rYQTo&index=23&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd) 1625 | - MIT 教程:伸展树(Splay trees): 1626 | - 该教程会过于学术,但请观看到最后的10分钟以确保掌握。 1627 | - [视频](https://www.youtube.com/watch?v=QnPl_Y6EqMo) 1628 | 1629 | - **红黑树** 1630 | - 这些是2-3棵树的翻译(请参见下文)。 1631 | - 实际中:红黑树提供了在最坏情况下插入操作、删除操作和查找操作的时间保证。 1632 | 这些时间值的保障不仅对时间敏感型应用有用,例如实时应用, 1633 | 还对在其他数据结构中块的构建非常有用, 1634 | 而这些数据结构都提供了最坏情况下的保障; 1635 | 例如,许多用于计算几何学的数据结构都可以基于红黑树, 1636 | 而目前 Linux 内核所采用的完全公平调度器(the Completely Fair Scheduler)也使用到了该种树。 1637 | 在 Java 8中,Collection HashMap也从原本用Linked List实现, 1638 | 储存特定元素的哈希码,改为用红黑树实现。 1639 | - [Aduni —— 算法 —— 课程4(该链接直接跳到开始部分)(视频)](https://youtu.be/1W3x0f_RmUo?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=3871) 1640 | - [Aduni —— 算法 —— 课程5(视频)](https://www.youtube.com/watch?v=hm2GHwyKF1o&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=5) 1641 | - [黑树(Black Tree)](https://en.wikipedia.org/wiki/Red%E2%80%93black_tree) 1642 | - [二分查找及红黑树的介绍](https://www.topcoder.com/community/data-science/data-science-tutorials/an-introduction-to-binary-search-and-red-black-trees/) 1643 | - [[Review] Red-Black Trees (playlist) in 30 minutes (video)](https://www.youtube.com/playlist?list=PL9xmBV_5YoZNqDI8qfOZgzbqahCUmUEin) 1644 | 1645 | - **2-3查找树** 1646 | - 实际中: 1647 | 2-3树的元素插入非常快速,但却有着查询慢的代价(因为相比较 AVL 树来说,其高度更高)。 1648 | - 你会很少用到2-3树。这是因为,其实现过程中涉及到不同类型的节点。因此,人们更多地会选择红黑树。 1649 | - [2-3树的直感与定义(视频)](https://www.youtube.com/watch?v=C3SsdUqasD4&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6&index=2) 1650 | - [2-3树的二元观点](https://www.youtube.com/watch?v=iYvBtGKsqSg&index=3&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6) 1651 | - [2-3树(学生叙述)(视频)](https://www.youtube.com/watch?v=TOb1tuEZ2X4&index=5&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp) 1652 | 1653 | - **2-3-4树 (亦称2-4树)** 1654 | - 实际中: 1655 | 对于每一棵2-4树,都有着对应的红黑树来存储同样顺序的数据元素。 1656 | 在2-4树上进行插入及删除操作等同于在红黑树上进行颜色翻转及轮换。 1657 | 这使得2-4树成为一种用于掌握红黑树背后逻辑的重要工具。 1658 | 这就是为什么许多算法引导文章都会在介绍红黑树之前,先介绍2-4树,尽管**2-4树在实际中并不经常使用**。 1659 | - [CS 61B Lecture 26:平衡查找树(视频)](https://www.youtube.com/watch?v=zqrqYXkth6Q&index=26&list=PL4BBB74C7D2A1049C) 1660 | - [自底向上的2-4树(视频)](https://www.youtube.com/watch?v=DQdMYevEyE4&index=4&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6) 1661 | - [自顶向下的2-4树(视频)](https://www.youtube.com/watch?v=2679VQ26Fp4&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6&index=5) 1662 | 1663 | - **N 叉树(K 叉树、M 叉树)** 1664 | - 注意:N 或 K 指的是分支系数(即树的最大分支数): 1665 | - 二叉树是一种分支系数为2的树 1666 | - 2-3树是一种分支系数为3的树 1667 | - [K 叉树](https://en.wikipedia.org/wiki/K-ary_tree) 1668 | 1669 | - **B 树** 1670 | - 有趣的是:为啥叫 B 仍然是一个神秘。因为 B 可代表波音(Boeing)、平衡(Balanced)或 Bayer(联合创造者) 1671 | - 实际中: 1672 | B 树会被广泛适用于数据库中,而现代大多数的文件系统都会使用到这种树(或变种)。 1673 | 除了运用在数据库中,B 树也会被用于文件系统以快速访问一个文件的任意块。 1674 | 但存在着一个基本的问题, 1675 | 那就是如何将文件块 i 转换成一个硬盘块(或一个柱面-磁头-扇区)上的地址。 1676 | - [B 树](https://en.wikipedia.org/wiki/B-tree) 1677 | - [B 树数据结构](http://btechsmartclass.com/data_structures/b-trees.html) 1678 | - [B 树的介绍(视频)](https://www.youtube.com/watch?v=I22wEC1tTGo&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6&index=6) 1679 | - [B 树的定义及其插入操作(视频)](https://www.youtube.com/watch?v=s3bCdZGrgpA&index=7&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6) 1680 | - [B 树的删除操作(视频)](https://www.youtube.com/watch?v=svfnVhJOfMc&index=8&list=PLA5Lqm4uh9Bbq-E0ZnqTIa8LRaL77ica6) 1681 | - [MIT 6.851 —— 内存层次模块(Memory Hierarchy Models)(视频)](https://www.youtube.com/watch?v=V3omVLzI0WE&index=7&list=PLUl4u3cNGP61hsJNdULdudlRL493b-XZf) 1682 | - 覆盖有高速缓存参数无关型(cache-oblivious)B 树和非常有趣的数据结构 1683 | - 头37分钟讲述的很专业,或许可以跳过(B 指块的大小、即缓存行的大小) 1684 | - [[Review] B-Trees (playlist) in 26 minutes (video)](https://www.youtube.com/playlist?list=PL9xmBV_5YoZNFPPv98DjTdD9X6UI9KMHz) 1685 | 1686 | 1687 | - ### k-D树 1688 | - 非常适合在矩形或更高维度的对象中查找点数 1689 | - 最适合k近邻 1690 | - [kNN K-d树算法(视频)](https://www.youtube.com/watch?v=Y4ZgLlDfKDg) 1691 | 1692 | - ### 跳表 1693 | - "有一种非常迷幻的数据类型" - Skiena 1694 | - [随机化: 跳表 (视频)](https://www.youtube.com/watch?v=2g9OSRKJuzM&index=10&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp) 1695 | - [更生动详细的解释](https://en.wikipedia.org/wiki/Skip_list) 1696 | 1697 | - ### 网络流 1698 | - [5分钟简析 Ford-Fulkerson──一步步示例 (视频)](https://www.youtube.com/watch?v=v1VgJmkEJW0) 1699 | - [Ford-Fulkerson 算法 (视频)](https://www.youtube.com/watch?v=v1VgJmkEJW0) 1700 | - [网络流 (视频)](https://www.youtube.com/watch?v=2vhN4Ice5jI) 1701 | 1702 | - ### 不相交集 & 联合查找 1703 | - [UCB 61B - 不相交集;排序 & 选择(视频)](https://www.youtube.com/watch?v=MAEGXTwmUsI&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd&index=21) 1704 | - [Sedgewick算法──Union-Find(6视频)](https://www.coursera.org/learn/algorithms-part1/home/week/1) 1705 | 1706 | - ### 快速处理的数学 1707 | - [整数运算, Karatsuba 乘法 (视频)](https://www.youtube.com/watch?v=eCaXlAaN2uE&index=11&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb) 1708 | - [中国剩余定理 (在密码学中的使用) (视频)](https://www.youtube.com/watch?v=ru7mWZJlRQg) 1709 | 1710 | - ### 树堆 (Treap) 1711 | - 一个二叉搜索树和一个堆的组合 1712 | - [树堆](https://en.wikipedia.org/wiki/Treap) 1713 | - [数据结构:树堆的讲解(视频)](https://www.youtube.com/watch?v=6podLUYinH8) 1714 | - [集合操作的应用(Applications in set operations)](https://www.cs.cmu.edu/~scandal/papers/treaps-spaa98.pdf) 1715 | 1716 | - ### 线性规划(Linear Programming)(视频) 1717 | - [线性规划](https://www.youtube.com/watch?v=M4K6HYLHREQ) 1718 | - [寻找最小成本](https://www.youtube.com/watch?v=2ACJ9ewUC6U) 1719 | - [寻找最大值](https://www.youtube.com/watch?v=8AA_81xI3ik) 1720 | - [用 Python 解决线性方程式──单纯形算法](https://www.youtube.com/watch?v=44pAWI7v5Zk) 1721 | 1722 | - ### 几何:凸包(Geometry, Convex hull)(视频) 1723 | - [Graph Alg. IV: 几何算法介绍 - 第 9 课](https://youtu.be/XIAQRlNkJAw?list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&t=3164) 1724 | - [Graham & Jarvis: 几何算法 - 第 10 课](https://www.youtube.com/watch?v=J5aJEcOr6Eo&index=10&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm) 1725 | - [分而治之: 凸包, 中值查找](https://www.youtube.com/watch?v=EzeYI7p9MjU&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=2) 1726 | 1727 | - ### 离散数学 1728 | - [计算机科学70,001 - 2015年春季 - 离散数学与概率论](http://www.infocobuild.com/education/audio-video-courses/computer-science/cs70-spring2015-berkeley.html) 1729 | - [离散数学由Shai Simonson(19个视频)](https://www.youtube.com/playlist?list=PLWX710qNZo_sNlSWRMVIh6kfTjolNaZ8t) 1730 | - [离散数学由印度理工学院罗帕尔分校NPTEL提供](https://nptel.ac.in/courses/106/106/106106183/) 1731 | 1732 | --- 1733 | 1734 | ## 一些主题的额外内容 1735 | 1736 | 我添加了这些内容来加强上面已经提出的一些观点,但是不想把它们放在上面,因为那样会太多。 1737 | 对于一个主题来说,过度处理很容易。 1738 | 你希望在本世纪被雇佣吗? 1739 | 1740 | - **SOLID** 1741 | - [ ] [Bob Martin SOLID Principles of Object Oriented and Agile Design (视频)](https://www.youtube.com/watch?v=TMuno5RZNeE) 1742 | - [ ] S - [单一职责原则 | 每个对象负责一个单一职责](http://www.oodesign.com/single-responsibility-principle.html) | [Single responsibility to each Object](http://www.javacodegeeks.com/2011/11/solid-single-responsibility-principle.html) 1743 | - [更多解释](https://docs.google.com/open?id=0ByOwmqah_nuGNHEtcU5OekdDMkk) 1744 | - [ ] O - [开闭原则](http://www.oodesign.com/open-close-principle.html) | [在生产级别上,对象应准备好进行扩展,但不进行修改](https://en.wikipedia.org/wiki/Open/closed_principle) 1745 | - [更多解释](http://docs.google.com/a/cleancoder.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BwhCYaYDn8EgN2M5MTkwM2EtNWFkZC00ZTI3LWFjZTUtNTFhZGZiYmUzODc1&hl=en) 1746 | - [ ] L - [里氏替换原则](http://www.oodesign.com/liskov-s-substitution-principle.html) | [基类和派生类遵循‘是一个’原则](http://stackoverflow.com/questions/56860/what-is-the-liskov-substitution-principle) 1747 | - [更多解释](http://docs.google.com/a/cleancoder.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BwhCYaYDn8EgNzAzZjA5ZmItNjU3NS00MzQ5LTkwYjMtMDJhNDU5ZTM0MTlh&hl=en) 1748 | - [ ] I - [接口隔离原则](http://www.oodesign.com/interface-segregation-principle.html) | 客户端不应被强制实现不使用的接口 1749 | - [5分钟内的接口隔离原则(视频)](https://www.youtube.com/watch?v=3CtAfl7aXAQ) 1750 | - [更多解释](http://docs.google.com/a/cleancoder.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BwhCYaYDn8EgOTViYjJhYzMtMzYxMC00MzFjLWJjMzYtOGJiMDc5N2JkYmJi&hl=en) 1751 | - [ ] D -[依赖反转原则](http://www.oodesign.com/dependency-inversion-principle.html) | 在对象的组合中减少依赖 1752 | - [为何依赖反转原则如此重要](http://stackoverflow.com/questions/62539/what-is-the-dependency-inversion-principle-and-why-is-it-important) 1753 | - [更多解释](http://docs.google.com/a/cleancoder.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BwhCYaYDn8EgMjdlMWIzNGUtZTQ0NC00ZjQ5LTkwYzQtZjRhMDRlNTQ3ZGMz&hl=en) 1754 | 1755 | 1756 | - **Union-Find** 1757 | - [概览](https://www.coursera.org/learn/data-structures/lecture/JssSY/overview) 1758 | - [初级实践](https://www.coursera.org/learn/data-structures/lecture/EM5D0/naive-implementations) 1759 | - [树状结构](https://www.coursera.org/learn/data-structures/lecture/Mxu0w/trees) 1760 | - [合并树状结构](https://www.coursera.org/learn/data-structures/lecture/qb4c2/union-by-rank) 1761 | - [路径压缩](https://www.coursera.org/learn/data-structures/lecture/Q9CVI/path-compression) 1762 | - [分析选项](https://www.coursera.org/learn/data-structures/lecture/GQQLN/analysis-optional) 1763 | 1764 | - **动态规划的更多内容** (视频) 1765 | - [6.006: 动态规划 I: 斐波那契数列, 最短路径](https://www.youtube.com/watch?v=OQ5jsbhAv_M&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=19) 1766 | - [6.006: 动态规划 II: 文本匹配, 二十一点/黑杰克](https://www.youtube.com/watch?v=ENyox7kNKeY&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=20) 1767 | - [6.006: 动态规划 III: 最优加括号方式, 最小编辑距离, 背包问题](https://www.youtube.com/watch?v=ocZMDMZwhCY&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=21) 1768 | - [6.006: 动态规划 IV: 吉他指法,拓扑,超级马里奥.](https://www.youtube.com/watch?v=tp4_UXaVyx8&index=22&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb) 1769 | - [6.046: 动态规划: 动态规划进阶](https://www.youtube.com/watch?v=Tw1k46ywN6E&index=14&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp) 1770 | - [6.046: 动态规划: 所有点对最短路径](https://www.youtube.com/watch?v=NzgFUwOaoIw&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=15) 1771 | - [6.046: 动态规划: 更多示例](https://www.youtube.com/watch?v=krZI60lKPek&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=12) 1772 | 1773 | - **图形处理进阶** (视频) 1774 | - [异步分布式算法: 对称性破缺,最小生成树](https://www.youtube.com/watch?v=mUBmcbbJNf4&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=27) 1775 | - [异步分布式算法: 最小生成树](https://www.youtube.com/watch?v=kQ-UQAzcnzA&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=28) 1776 | 1777 | - MIT **概率论** (过于数学,进度缓慢,但这对于数学的东西却是必要之恶) (视频): 1778 | - [MIT 6.042J - 概率论概述](https://www.youtube.com/watch?v=SmFwFdESMHI&index=18&list=PLB7540DEDD482705B) 1779 | - [MIT 6.042J - 条件概率 Probability](https://www.youtube.com/watch?v=E6FbvM-FGZ8&index=19&list=PLB7540DEDD482705B) 1780 | - [MIT 6.042J - 独立](https://www.youtube.com/watch?v=l1BCv3qqW4A&index=20&list=PLB7540DEDD482705B) 1781 | - [MIT 6.042J - 随机变量](https://www.youtube.com/watch?v=MOfhhFaQdjw&list=PLB7540DEDD482705B&index=21) 1782 | - [MIT 6.042J - 期望 I](https://www.youtube.com/watch?v=gGlMSe7uEkA&index=22&list=PLB7540DEDD482705B) 1783 | - [MIT 6.042J - 期望 II](https://www.youtube.com/watch?v=oI9fMUqgfxY&index=23&list=PLB7540DEDD482705B) 1784 | - [MIT 6.042J - 大偏差](https://www.youtube.com/watch?v=q4mwO2qS2z4&index=24&list=PLB7540DEDD482705B) 1785 | - [MIT 6.042J - 随机游走](https://www.youtube.com/watch?v=56iFMY8QW2k&list=PLB7540DEDD482705B&index=25) 1786 | 1787 | - [Simonson: 近似算法 (视频)](https://www.youtube.com/watch?v=oDniZCmNmNw&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=19) 1788 | 1789 | - **字符串匹配** 1790 | - Rabin-Karp(视频) 1791 | - [Rabin Karps 算法](https://www.coursera.org/learn/data-structures/lecture/c0Qkw/rabin-karps-algorithm) 1792 | - [预计算](https://www.coursera.org/learn/data-structures/lecture/nYrc8/optimization-precomputation) 1793 | - [优化:实施和分析](https://www.coursera.org/learn/data-structures/lecture/h4ZLc/optimization-implementation-and-analysis) 1794 | - [表翻倍,Karp-Rabin](https://www.youtube.com/watch?v=BRO7mVIFt08&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=9) 1795 | - [滚动哈希,摊销分析](https://www.youtube.com/watch?v=w6nuXg0BISo&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=32) 1796 | - Knuth-Morris-Pratt (KMP): 1797 | - [Knuth-Morris-Pratt(KMP)字符串匹配算法](https://www.youtube.com/watch?v=5i7oKodCRJo) 1798 | - Boyer–Moore 字符串搜索算法 1799 | - [Boyer–Moore 字符串搜索算法](https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm) 1800 | - [高级字符串搜索Boyer-Moore-Horspool算法(视频)](https://www.youtube.com/watch?v=QDZpzctPf10) 1801 | - [Coursera:字符串算法](https://www.coursera.org/learn/algorithms-on-strings/home/week/1) 1802 | - 刚开始时很棒,但是当它超过 KMP 时,它变得比需要复杂得多 1803 | - 很好的字典树解释 1804 | - 可以跳过 1805 | 1806 | - **排序** 1807 | 1808 | - 斯坦福大学关于排序算法的视频: 1809 | - [课程 15 | 编程抽象(视频)](https://www.youtube.com/watch?v=ENp00xylP7c&index=15&list=PLFE6E58F856038C69) 1810 | - [课程 16 | 编程抽象(视频)](https://www.youtube.com/watch?v=y4M9IVgrVKo&index=16&list=PLFE6E58F856038C69) 1811 | - Shai Simonson 视频,[Aduni.org](http://www.aduni.org/): 1812 | - [算法 - 排序 - 第二讲(视频)](https://www.youtube.com/watch?v=odNJmw5TOEE&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=2) 1813 | - [算法 - 排序2 - 第三讲(视频)](https://www.youtube.com/watch?v=hj8YKFTFKEE&list=PLFDnELG9dpVxQCxuD-9BSy2E7BWY3t5Sm&index=3) 1814 | - Steven Skiena 关于排序的视频: 1815 | - [CSE373 2020 - 归并排序/快速排序(视频)](https://www.youtube.com/watch?v=jUf-UQ3a0kg&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=8) 1816 | - [CSE373 2020 - 线性排序(视频)](https://www.youtube.com/watch?v=0ksyQKmre84&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=9) 1817 | 1818 | - NAND 到 Tetris: [从第一原理构建现代计算机](https://www.coursera.org/learn/build-a-computer) 1819 | 1820 | ## 视频系列 1821 | 1822 | 坐下来,尽情享受。 1823 | 1824 | - [个人的动态规划问题列表 (都是短视频)](https://www.youtube.com/playlist?list=PLrmLmBdmIlpsHaNTPP_jHHDx_os9ItYXr) 1825 | 1826 | - [x86 架构,汇编,应用程序 (11 个视频)](https://www.youtube.com/playlist?list=PL038BE01D3BAEFDB0) 1827 | 1828 | - [MIT 18.06 线性代数,2005 年春季 (35 个视频)](https://www.youtube.com/playlist?list=PLE7DDD91010BC51F8) 1829 | 1830 | - [绝妙的 MIT 微积分:单变量微积分](https://www.youtube.com/playlist?list=PL3B08AE665AB9002A) 1831 | 1832 | - [Skiena讲座来自《算法设计手册》- CSE373 2020 - 算法分析(26个视频)](https://www.youtube.com/watch?v=22hwcnXIGgk&list=PLOtl7M3yp-DX6ic0HGT0PUX_wiNmkWkXx&index=1) 1833 | 1834 | - [UC Berkeley 61B (2014 年春季): 数据结构 (25 个视频)](https://www.youtube.com/watch?v=mFPmKGIrQs4&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd) 1835 | 1836 | - [UC Berkeley 61B (2006 年秋季): 数据结构 (39 个视频)](https://www.youtube.com/playlist?list=PL4BBB74C7D2A1049C) 1837 | 1838 | - [UC Berkeley 61C:计算机结构 (26 个视频)](https://www.youtube.com/watch?v=gJJeUFyuvvg&list=PL-XXv-cvA_iCl2-D-FS5mk0jFF6cYSJs_) 1839 | 1840 | - [OOSE:使用 UML 和 Java 进行软件开发 (21 个视频)](https://www.youtube.com/playlist?list=PLJ9pm_Rc9HesnkwKlal_buSIHA-jTZMpO) 1841 | 1842 | - [MIT 6.004: 计算结构 (49 视频)](https://www.youtube.com/playlist?list=PLrRW1w6CGAcXbMtDFj205vALOGmiRc82-) 1843 | 1844 | - [卡內基梅隆大学 - 计算机架构讲座 (39 个视频)](https://www.youtube.com/playlist?list=PL5PHm2jkkXmi5CxxI7b3JCL1TWybTDtKq) 1845 | 1846 | - [MIT 6.006:算法介绍 (47 个视频)](https://www.youtube.com/watch?v=HtSuA80QTyo&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&nohtml5=False) 1847 | 1848 | - [MIT 6.033:计算机系统工程 (22 个视频)](https://www.youtube.com/watch?v=zm2VP0kHl1M&list=PL6535748F59DCA484) 1849 | 1850 | - [MIT 6.034:人工智能,2010 年秋季 (30 个视频)](https://www.youtube.com/playlist?list=PLUl4u3cNGP63gFHB6xb-kVBiQHYe_4hSi) 1851 | 1852 | - [MIT 6.042J:计算机科学数学, 2010 年秋季 (25 个视频)](https://www.youtube.com/watch?v=L3LMbpZIKhQ&list=PLB7540DEDD482705B) 1853 | 1854 | - [MIT 6.046:算法设计与分析 (34 个视频)](https://www.youtube.com/watch?v=2P-yW7LQr08&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp) 1855 | 1856 | - [MIT 6.050J:信息和熵, 2008 年春季 (19 个视频)](https://www.youtube.com/watch?v=phxsQrZQupo&list=PL_2Bwul6T-A7OldmhGODImZL8KEVE38X7) 1857 | 1858 | - [MIT 6.851:高等数据结构 (22 个视频)](https://www.youtube.com/watch?v=T0yzrZL1py0&list=PLUl4u3cNGP61hsJNdULdudlRL493b-XZf&index=1) 1859 | 1860 | - [MIT 6.854: 高等算法, 2016 年春季 (24 个视频)](https://www.youtube.com/playlist?list=PL6ogFv-ieghdoGKGg2Bik3Gl1glBTEu8c) 1861 | 1862 | - [Harvard COMPSCI 224:高级算法(25个视频)](https://www.youtube.com/playlist?list=PL2SOU6wwxB0uP4rJgf5ayhHWgw7akUWSf) 1863 | 1864 | - [MIT 6.858:计算机系统安全, 2014 年秋季](https://www.youtube.com/watch?v=GqmQg-cszw4&index=1&list=PLUl4u3cNGP62K2DjQLRxDNRi0z2IRWnNh) 1865 | 1866 | - [斯坦福: 编程范例 (27 个视频)](https://www.youtube.com/playlist?list=PL9D558D49CA734A02) 1867 | 1868 | - [密码学导论,Christof Paar](https://www.youtube.com/playlist?list=PL6N5qY2nvvJE8X75VkXglSrVhLv1tVcfy) 1869 | - [课程网站以及幻灯片和问题集](http://www.crypto-textbook.com/) 1870 | 1871 | - [大数据 - 斯坦福大学 (94 个视频)](https://www.youtube.com/playlist?list=PLLssT5z_DsK9JDLcT8T62VtzwyW9LNepV) 1872 | 1873 | - [图论,Sarada Herke(67个视频)](https://www.youtube.com/user/DrSaradaHerke/playlists?shelf_id=5&view=50&sort=dd) 1874 | 1875 | ## 计算机科学课程 1876 | 1877 | - [在线 CS 课程目录](https://github.com/open-source-society/computer-science) 1878 | - [CS 课程目录 (一些是在线讲座)](https://github.com/prakhar1989/awesome-courses) 1879 | 1880 | ## 算法实现 1881 | 1882 | - [普林斯顿大学的多算法实现](https://algs4.cs.princeton.edu/code) 1883 | 1884 | 1885 | ## 论文 1886 | 1887 | - [喜欢经典的论文?](https://www.cs.cmu.edu/~crary/819-f09/) 1888 | - [1978: 通信顺序处理](http://spinroot.com/courses/summer/Papers/hoare_1978.pdf) 1889 | - [Go 实现](https://godoc.org/github.com/thomas11/csp) 1890 | - [2003: The Google 文件系统](http://static.googleusercontent.com/media/research.google.com/en//archive/gfs-sosp2003.pdf) 1891 | - 2012 年被 Colossus 取代了 1892 | - [2004: MapReduce: Simplified Data Processing on Large Clusters](http://static.googleusercontent.com/media/research.google.com/en//archive/mapreduce-osdi04.pdf) 1893 | - 大多被云数据流取代了? 1894 | - [2006年:Bigtable:结构化数据的分布式存储系统](https://static.googleusercontent.com/media/research.google.com/en//archive/bigtable-osdi06.pdf) 1895 | - [2006年:针对松散耦合的分布式系统的Chubby Lock服务](https://research.google.com/archive/chubby-osdi06.pdf) 1896 | - [2007年:Dynamo:亚马逊的高可用键值存储](http://s3.amazonaws.com/AllThingsDistributed/sosp/amazon-dynamo-sosp2007.pdf) 1897 | - Dynamo论文启动了NoSQL革命 1898 | - [2007: 每个程序员都应该知道的内存知识 (非常长,作者建议跳过某些章节来阅读)](https://www.akkadia.org/drepper/cpumemory.pdf) 1899 | - 2012: AddressSanitizer: 快速的内存访问检查器: 1900 | - [论文](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/37752.pdf) 1901 | - [视频](https://www.usenix.org/conference/atc12/technical-sessions/presentation/serebryany) 1902 | - 2013: Spanner: Google 的分布式数据库: 1903 | - [论文](http://static.googleusercontent.com/media/research.google.com/en//archive/spanner-osdi2012.pdf) 1904 | - [视频](https://www.usenix.org/node/170855) 1905 | - [2015: Google的持续流水线](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43790.pdf) 1906 | - [2015: 大规模高可用性:构建Google广告数据基础设施](https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/44686.pdf) 1907 | - [2015: 开发人员如何搜索代码:一个案例研究](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/43835.pdf) 1908 | - 更多论文: [1,000篇论文](https://github.com/0voice/computer_expert_paper) 1909 | 1910 | ## LICENSE 1911 | 1912 | [CC-BY-SA-4.0](https://github.com/jwasham/coding-interview-university/blob/main/LICENSE.txt) 1913 | -------------------------------------------------------------------------------- /translations/README-el.md: -------------------------------------------------------------------------------- 1 | #Coding Interview University 2 | 3 | >Επίσημη έκδοση: [Αγγλικά](https://github.com/jwasham/coding-interview-university/blob/master/README.md) 4 | 5 | ## Τι είναι 6 | 7 | Είναi το πλάνο διαβάσματός μου για να γίνω από web developer (αυτοδίδακτος, χωρίς πτυχίο στην Επιστήμη των Υπολογιστών), μηχανικός λογισμικού για μία μεγάλη εταιρία. 8 | 9 | ![Coding at the whiteboard - from HBO's Silicon Valley](https://dng5l3qzreal6.cloudfront.net/2016/Aug/coding_board_small-1470866369118.jpg) 10 | 11 | Αυτό το έργο προορίζεται για νέους μηχανικούς λογισμικού ή για αυτούς που μεταβαίνουν από την ανάπτυξη λογισμικού/ιστοσελίδων στην τεχνολογία λογισμικού(εκεί που η γνώση για την επιστήμη των υπολογιστών ειναι προαπαιτούμενο). Αν έχεις αρκετά χρόνια εμπειρίας και αξιώνεις πολλά χρόνια εμπερίας στην τεχνολογία λογισμικού, πρέπει να περιμένεις μία δυσκολότερη συνέντευξη. 12 | 13 | Εάν έχεις αρκετά χρόνια εμπειρίας στην ανάπτυξη λογισμικού/ιστοσελίδων, σημείωσε ότι οι μεγάλες εταιρίες λογισμικού όπως οι Google, Amazon, Facebook και Microsoft βλέπουν την τεχνολογία λογισμικού ως ενα διαφορετικό κομμάτι από την ανάπτυξη λογισμικού/ιστοσελίδων, και απαιτούν γνώσεις πάνω στην επιστήμη υπολογιστών. 14 | 15 | Εάν θέλεις να είσαι ένας αξιόπιστος μηχανικός ή μηχανικός συστημάτων, διάβασε περισσότερο απο την προεραιτική λίστα(δίκτυα, ασφάλεια). 16 | 17 | --- 18 | # Πίνακας περιεχομένων 19 | 20 | - [Τι είναι](#Tι-είναι) 21 | - [Γιατί να το χρησιμοποιήσεις](#Γιατί-να-το-χρησιμοποιήσεις) 22 | - [Πώς να το χρησιμοποιήσεις](#Πώς-να-το-χρησιμοποιήσεις) 23 | - [Μη νιώθεις ανίκανος](#Μη-νιώθεις-ανίκανος) 24 | - [Σχετικά με τα βίντεο](#Σχετικά-με-τα-βίντεο) 25 | - [Διαδικασία Συνέντευξης & Γενική προετοιμασία συνέντευξης](#Διαδικασία-Συνέντευξης--Γενική-προετοιμασία-συνέντευξης) 26 | - [Διάλεξε μία γλώσσα για τη συνέντευξη](#Διάλεξε-μία-γλώσσα-για-τη-συνέντευξη) 27 | - [Λίστα βιβλίων](#Λίστα-βιβλίων) 28 | - [Πριν αρχίσεις](#Πριν-αρχίσεις) 29 | - [Τι δε θα δεις να καλύπτετε](#Τι-δε-θα-δεις-να-καλύπτετε) 30 | - [Προαπαιτούμενη γνώση](#Προαπαιτούμενη-γνώση) 31 | - [Το καθημερινό πλάνο](#Το-καθημερινό-πλάνο) 32 | - [Αλγοριθμική πολυπλοκότητα / Big-O / Ασυμπτωτική ανάλυση](#Αλγοριθμική-πολυπλοκότητα--Big-O--Ασυμπτωτική-ανάλυση) 33 | - [Data Structures](#data-structures) 34 | - [Arrays](#arrays) 35 | - [Linked Lists](#linked-lists) 36 | - [Stack](#stack) 37 | - [Queue](#queue) 38 | - [Hash table](#hash-table) 39 | - [More Knowledge](#more-knowledge) 40 | - [Binary search](#binary-search) 41 | - [Bitwise operations](#bitwise-operations) 42 | - [Trees](#trees) 43 | - [Trees - Notes & Background](#trees---notes--background) 44 | - [Binary search trees: BSTs](#binary-search-trees-bsts) 45 | - [Heap / Priority Queue / Binary Heap](#heap--priority-queue--binary-heap) 46 | - balanced search trees (general concept, not details) 47 | - traversals: preorder, inorder, postorder, BFS, DFS 48 | - [Sorting](#sorting) 49 | - selection 50 | - insertion 51 | - heapsort 52 | - quicksort 53 | - merge sort 54 | - [Graphs](#graphs) 55 | - directed 56 | - undirected 57 | - adjacency matrix 58 | - adjacency list 59 | - traversals: BFS, DFS 60 | - [Even More Knowledge](#even-more-knowledge) 61 | - [Recursion](#recursion) 62 | - [Dynamic Programming](#dynamic-programming) 63 | - [Object-Oriented Programming](#object-oriented-programming) 64 | - [Design Patterns](#design-patterns) 65 | - [Combinatorics (n choose k) & Probability](#combinatorics-n-choose-k--probability) 66 | - [NP, NP-Complete and Approximation Algorithms](#np-np-complete-and-approximation-algorithms) 67 | - [Caches](#caches) 68 | - [Processes and Threads](#processes-and-threads) 69 | - [Papers](#papers) 70 | - [Testing](#testing) 71 | - [Scheduling](#scheduling) 72 | - [Implement system routines](#implement-system-routines) 73 | - [String searching & manipulations](#string-searching--manipulations) 74 | - [Tries](#tries) 75 | - [Floating Point Numbers](#floating-point-numbers) 76 | - [Unicode](#unicode) 77 | - [Endianness](#endianness) 78 | - [Networking](#networking) 79 | - [System Design, Scalability, Data Handling](#system-design-scalability-data-handling) (if you have 4+ years experience) 80 | - [Final Review](#final-review) 81 | - [Coding Question Practice](#coding-question-practice) 82 | - [Coding exercises/challenges](#coding-exerciseschallenges) 83 | - [Once you're closer to the interview](#once-youre-closer-to-the-interview) 84 | - [Your Resume](#your-resume) 85 | - [Be thinking of for when the interview comes](#be-thinking-of-for-when-the-interview-comes) 86 | - [Have questions for the interviewer](#have-questions-for-the-interviewer) 87 | - [Once You've Got The Job](#once-youve-got-the-job) 88 | 89 | ---------------- Everything below this point is optional ---------------- 90 | 91 | - [Additional Books](#additional-books) 92 | - [Additional Learning](#additional-learning) 93 | - [Compilers](#compilers) 94 | - [Emacs and vi(m)](#emacs-and-vim) 95 | - [Unix command line tools](#unix-command-line-tools) 96 | - [Information theory](#information-theory) 97 | - [Parity & Hamming Code](#parity--hamming-code) 98 | - [Entropy](#entropy) 99 | - [Cryptography](#cryptography) 100 | - [Compression](#compression) 101 | - [Computer Security](#computer-security) 102 | - [Garbage collection](#garbage-collection) 103 | - [Parallel Programming](#parallel-programming) 104 | - [Messaging, Serialization, and Queueing Systems](#messaging-serialization-and-queueing-systems) 105 | - [A*](#a) 106 | - [Fast Fourier Transform](#fast-fourier-transform) 107 | - [Bloom Filter](#bloom-filter) 108 | - [HyperLogLog](#hyperloglog) 109 | - [Locality-Sensitive Hashing](#locality-sensitive-hashing) 110 | - [van Emde Boas Trees](#van-emde-boas-trees) 111 | - [Augmented Data Structures](#augmented-data-structures) 112 | - [N-ary (K-ary, M-ary) trees](#n-ary-k-ary-m-ary-trees) 113 | - [Balanced search trees](#balanced-search-trees) 114 | - AVL trees 115 | - Splay trees 116 | - Red/black trees 117 | - 2-3 search trees 118 | - 2-3-4 Trees (aka 2-4 trees) 119 | - N-ary (K-ary, M-ary) trees 120 | - B-Trees 121 | - [k-D Trees](#k-d-trees) 122 | - [Skip lists](#skip-lists) 123 | - [Network Flows](#network-flows) 124 | - [Disjoint Sets & Union Find](#disjoint-sets--union-find) 125 | - [Math for Fast Processing](#math-for-fast-processing) 126 | - [Treap](#treap) 127 | - [Linear Programming](#linear-programming) 128 | - [Geometry, Convex hull](#geometry-convex-hull) 129 | - [Discrete math](#discrete-math) 130 | - [Machine Learning](#machine-learning) 131 | - [Additional Detail on Some Subjects](#additional-detail-on-some-subjects) 132 | - [Video Series](#video-series) 133 | - [Computer Science Courses](#computer-science-courses) 134 | 135 | --- 136 | 137 | ## Γιατί να το χρησιμοποιήσεις 138 | 139 | Όταν άρχισα αυτό το πρότζεκτ, δεν ήξερα τη διαφορά μίας στοίβας από μία ουρά, δεν ήξερα τίποτα σχετικά με τον συμβολισμό Big-Ο, τίποτα σχετικά με τα δέντρα ή πως να διασχίσω ένα δέντρο. Εάν έπρεπε να γράψω σε κώδικα έναν αλγόριθμο ταξινόμησης, μπορώ να σου πω ότι δεν θα ήταν πολύ καλός. Κάθε δομή δεδομένων που είχα χρησιμοποιήσει ήταν πακέτο της γλώσσας, και δεν ήξερα καθόλου πως δούλευαν "κάτω από το καπό". Ποτέ δεν είχα να διαχειριστώ τη μνήμη εκτός εάν μία διεργασία που έτρεχα, μου επέστρεφε ένα σφάλμα του τύπου: "out of memory", και μετά έπρεπε να βρώ μία λύση. Έχω χρησιμοποιήσει μερικούς πολυδιάστατους πίνακες στη ζωή μου και χιλιάδες συναφείς πίνακες, αλλά δεν είχα δημιουργήσει δομές δεδομένων από το 0. 140 | 141 | Είναι ένα μακροπρόθεσμο πλάνο. Μπορεί να σου πάρει μήνες. Εάν είσαι οικείος με πολλά από αυτά ήδη, θα σου πάρει πολύ λιγότερο χρόνο. 142 | 143 | ## Πώς να το χρησιμοποιήσεις 144 | 145 | Οτιδήποτε παρακάτω είναι μία συνοπτική περιγραφή, και πρέπει να τα καταλάβεις από την αρχή μέχρι το τέλος. 146 | 147 | Χρησιμοποιώ τη χαρακτηρηστική markdown γλώσσα του Github, σεμπεριλαμβανομένων και των tasks lists για να ελέγχω την εξέλιξη του πρότζεκτ. 148 | 149 | **Δημιούργησε ένα καινούργιο branch [x]** 150 | 151 | 152 | Κάνε fork το branch και ακολούθησε τις παρακάτω εντολές 153 | 154 | `git checkout -b progress` 155 | 156 | `git remote add jwasham https://github.com/jwasham/coding-interview-university` 157 | 158 | `git fetch --all` 159 | 160 | Μάρκαρε όλα τα κουτιά με X αφού ολοκληρώσεις τις αλλαγές 161 | 162 | `git add . ` 163 | 164 | `git commit -m "Marked x" ` 165 | 166 | `git rebase jwasham/master ` 167 | 168 | `git push --force ` 169 | 170 | [Περισσότερα σχετικά με την Github-flavored markdown](https://guides.github.com/features/mastering-markdown/#GitHub-flavored-markdown) 171 | 172 | ## Μη νιώθεις ανίκανος 173 | - Οι επιτυχυμένοι μηχανικοί λογισμικού είναι έξυπνοι, αλλά πολλοί έχουν την ανασφάλεια ότι δεν είναι αρκετά έξυπνοι. 174 | - [The myth of the Genius Programmer](https://www.youtube.com/watch?v=0SARbwvhupQ) 175 | - [It's Dangerous to Go Alone: Battling the Invisible Monsters in Tech](https://www.youtube.com/watch?v=1i8ylq4j_EY) 176 | 177 | ## Σχετικά με τα βίντεο 178 | 179 | Μερικά βίντεο είναι διαθέσιμα μόνο κάνοντας εγγραφή σε μία Coursera, EdX, or Lynda.com τάξη. Αυτές καλούνται MOOCs. 180 | Μερικές φορές οι τάξεις δεν είναι διαθέσιμες, έτσι πρέπει να περιμένεις 1-2 μήνες, έτσι ώστε να αποκτήσεις πρόσβαση. Τα μαθήματα του Lynada.com δεν είναι δωρεάν. 181 | 182 | Θα εκτιμούσα τη βοήθεια σου να προσθέσεις δωρεάν και πάντοτε-διαθέσιμες ανοικτές πηγές, όπως βίντεο από το Youtube να συνοδεύσουν τα online μαθήματα βίντεο. 183 | Μου αρέσει να χρησιμοποιώ πανεπιστημιακές διαλέξεις. 184 | 185 | ## Διαδικασία Συνέντευξης & Γενική προετοιμασία συνέντευξης 186 | 187 | - [ ] [ABC: Always Be Coding](https://medium.com/always-be-coding/abc-always-be-coding-d5f8051afce2#.4heg8zvm4) 188 | - [ ] [Whiteboarding](https://medium.com/@dpup/whiteboarding-4df873dbba2e#.hf6jn45g1) 189 | - [ ] [Demystifying Tech Recruiting](https://www.youtube.com/watch?v=N233T0epWTs) 190 | - [ ] Cracking The Coding Interview Set 1: 191 | - [ ] [Gayle L McDowell - Cracking The Coding Interview (video)](https://www.youtube.com/watch?v=rEJzOhC5ZtQ) 192 | - [ ] [Cracking the Coding Interview with Author Gayle Laakmann McDowell (video)](https://www.youtube.com/watch?v=aClxtDcdpsQ) 193 | - [ ] How to Get a Job at the Big 4: 194 | - [ ] [How to Get a Job at the Big 4 - Amazon, Facebook, Google & Microsoft (video)](https://www.youtube.com/watch?v=YJZCUhxNCv8) 195 | 196 | - [ ] Μαθήματα προετοιμασίας: 197 | - [ ] [Software Engineer Interview Unleashed (paid course)](https://www.udemy.com/software-engineer-interview-unleashed): 198 | - Learn how to make yourself ready for software engineer interviews from a former Google interviewer. 199 | - [ ] [Python for Data Structures, Algorithms, and Interviews! (paid course)](https://www.udemy.com/python-for-data-structures-algorithms-and-interviews/): 200 | - A Python centric interview prep course which covers data structures, algorithms, mock interviews and much more. 201 | 202 | ## Διάλεξε μία γλώσσα για τη συνέντευξη 203 | 204 | Μπορείς να χρησιμοποιήσεις μία γλώσσα με την οποία είσαι άνετος για να κάνεις το προγραμματιστικό κομμάτι της συνέντευξης, αλλά για τις μεγάλες εταιρίες, υπάρχουν ατόφιες επιλογές: 205 | 206 | - C++ 207 | - Java 208 | - Python 209 | 210 | Μπορείς, επίσης, να χρησιμοποιήσεις αυτές, αλλά διάβασε γύρω από αυτό πρώτα. Μπορεί να υπάρχουν προειδοποιήσεις: 211 | 212 | - Javascript 213 | - Ruby 214 | 215 | Πρέπει να είσαι πολύ εξοικιωμένος με τη γλώσσα και γνώστης. 216 | 217 | Διάβασε περισσότερα σχετικά με τις παραπάνω επιλογές: 218 | - http://www.byte-by-byte.com/choose-the-right-language-for-your-coding-interview/ 219 | - http://blog.codingforinterviews.com/best-programming-language-jobs/ 220 | 221 | [Βρες πόρους για τη γλώσσα εδώ](programming-language-resources.md) 222 | 223 | Θα δείς λίγη γνώση σχετικά με τις C, C++ και Python να περιέχεται παρακάτω, επείδη μαθαίνω. Υπάρχουν μερικά εμπλεκόμενα βιβλία, δες το κάτω μέρος. 224 | 225 | ## Λίστα βιβλίων 226 | 227 | - [ ] [Programming Interviews Exposed: Secrets to Landing Your Next Job, 2nd Edition](http://www.wiley.com/WileyCDA/WileyTitle/productCd-047012167X.html) 228 | - απαντήσεις στην C++ και στην Java 229 | - αυτό είναι ένα καλό ζέσταμα για να είσαι άριστος/η στο Coding Interview 230 | - όχι τόσο δύσκολο, τα περισσότερα προβλήματα ίσως είναι ευκολότερα από ότι θα δείς στην συνέντευξη (από αυτά που έχω διαβάσει) 231 | - [ ] [Cracking the Coding Interview, 6th Edition](http://www.amazon.com/Cracking-Coding-Interview-6th-Programming/dp/0984782850/) 232 | - απαντήσεις στην Java 233 | 234 | Εάν έχεις αρκετό ελεύθερο χρόνο: 235 | 236 | - [ ] [Elements of Programming Interviews (C++ version)](https://www.amazon.com/Elements-Programming-Interviews-Insiders-Guide/dp/1479274836) 237 | - [ ] [Elements of Programming Interviews (Java version)](https://www.amazon.com/Elements-Programming-Interviews-Java-Insiders/dp/1517435803/) 238 | 239 | ### Αρχιτεκτονική Υπολογιστών 240 | 241 | Αν έχεις λίγο χρόνο: 242 | 243 | - [ ] [Write Great Code: Volume 1: Understanding the Machine](https://www.amazon.com/Write-Great-Code-Understanding-Machine/dp/1593270038) 244 | - Το βιβλίο δημοσιεύτηκε το 2004, και είναι λίγο απαρχεωμένο, αλλά είναι ένας υπέροχος πόρος για να κατανοήσεις έναν υπολογιστή εν συντομία. 245 | - Ο συγγραφέας εφηύρε το HLA, έτσι μην παίρνεις τις αναφορές του και παραδείγματά του για το HLA, τοις μετρητοίς. 246 | - Αυτά τα κεφάλαια αξίζουν το διάβασμα για να σου δώσουν ισχυρά θεμέλια: 247 | - Chapter 2 - Numeric Representation 248 | - Chapter 3 - Binary Arithmetic and Bit Operations 249 | - Chapter 4 - Floating-Point Representation 250 | - Chapter 5 - Character Representation 251 | - Chapter 6 - Memory Organization and Access 252 | - Chapter 7 - Composite Data Types and Memory Objects 253 | - Chapter 9 - CPU Architecture 254 | - Chapter 10 - Instruction Set Architecture 255 | - Chapter 11 - Memory Architecture and Organization 256 | 257 | Αν έχεις αρκετό χρόνο (Το θέλω αυτό το βιβλίο): 258 | 259 | - [ ] [Computer Architecture, Fifth Edition: A Quantitative Approach](https://www.amazon.com/dp/012383872X/) 260 | - Για μία πλουσιότερη, περισσότερο ενημερωμένη (2011), αλλά εκτενέστερη αντιμετώπιση 261 | 262 | ### Συγκεκριμένη γλώσσα 263 | 264 | **Θα πρέπει να επιλέξεις μία γλώσσα για τη συνέντευξη (δες παραπάνω).** Εδώ είναι οι προτάσεις μου ανά γλώσσα. Δεν έχω τους πόρους για όλες τις γλώσσες. Καλοδεχούμενες οι προσθήκες. 265 | 266 | Εάν διαβάσεις μία από αυτές, θα πρέπει να έχεις όλη την γνώση σχετικά με δομές δεδομένων και αλγόριθμους που θα χρειαστείς για να αρχίσεις να λύνεις προβλήματα προγραμματισμού. 267 | **Μπορείς να παραλείψεις όλες τα βίντεο-διαλέξεις που περιέχονται σε αυτό το πρότζεκτ**, εκτός εάν θέλεις να κάνεις μία ανασκόπηση. 268 | 269 | [Επιπρόσθετοι πόροι που αφορούν συγκεκριμένες γλώσσες εδώ.](programming-language-resources.md) 270 | 271 | ### C++ 272 | 273 | Δεν έχω διαβάσει αυτά τα δύο, αλλά έχουν λάβει υψηλές αξιολογήσεις και έχουν γραφτεί από τον Sedgewick. Είναι φοβερός. 274 | 275 | - [ ] [Algorithms in C++, Parts 1-4: Fundamentals, Data Structure, Sorting, Searching](https://www.amazon.com/Algorithms-Parts-1-4-Fundamentals-Structure/dp/0201350882/) 276 | - [ ] [Algorithms in C++ Part 5: Graph Algorithms](https://www.amazon.com/Algorithms-Part-Graph-3rd-Pt-5/dp/0201361183/) 277 | 278 | Εάν έχεις μία καλύτερη πρόταση για τη C++, παρακαλώ ενημέρωσέ με. Ψάχνοντας για έναν περιεκτικό πόρο. 279 | 280 | ### Java 281 | 282 | - [ ] [Αλγόριθμοι σε Java(Sedgewick)](http://www.skroutz.gr/books/142957.%CE%91%CE%BB%CE%B3%CF%8C%CF%81%CE%B9%CE%B8%CE%BC%CE%BF%CE%B9-%CF%83%CE%B5-Java.html) 283 | - Διδάσκεται στο Τμήμα Πληροφορικής του Οικονομικού Πανεπιστημίου Αθηνών 284 | - βιντεο με το περιεχόμενο του βιβλίου (and Sedgewick!): 285 | - [Algorithms I](https://www.youtube.com/user/algorithmscourses/playlists?view=50&sort=dd&shelf_id=2) 286 | - [Algorithms II](https://www.youtube.com/user/algorithmscourses/playlists?shelf_id=3&view=50&sort=dd) 287 | 288 | Ή: 289 | 290 | - [ ] [Data Structures and Algorithms in Java](https://www.amazon.com/Data-Structures-Algorithms-Michael-Goodrich/dp/1118771338/) 291 | - by Goodrich, Tamassia, Goldwasser 292 | - used as optional text for CS intro course at UC Berkeley 293 | - see my book report on the Python version below. This book covers the same topics. 294 | 295 | ### Python 296 | 297 | - [ ] [Data Structures and Algorithms in Python](https://www.amazon.com/Structures-Algorithms-Python-Michael-Goodrich/dp/1118290275/) 298 | - by Goodrich, Tamassia, Goldwasser 299 | - I loved this book. It covered everything and more. 300 | - Pythonic code 301 | - my glowing book report: https://startupnextdoor.com/book-report-data-structures-and-algorithms-in-python/ 302 | 303 | 304 | ### Προαιρετικά Βιβλία 305 | 306 | **Ορισμένοι συστήνουν αυτά, αλλά το παρακάνουν, εκτός εάν έχεις πολλά χρόνια εμπειρίας και περιμένεις μία δυσκολότερη συνέντευξη:** 307 | 308 | - [ ] [Algorithm Design Manual](http://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena/dp/1849967202) (Skiena) 309 | - As a review and problem recognition 310 | - The algorithm catalog portion is well beyond the scope of difficulty you'll get in an interview. 311 | - This book has 2 parts: 312 | - class textbook on data structures and algorithms 313 | - pros: 314 | - is a good review as any algorithms textbook would be 315 | - nice stories from his experiences solving problems in industry and academia 316 | - code examples in C 317 | - cons: 318 | - can be as dense or impenetrable as CLRS, and in some cases, CLRS may be a better alternative for some subjects 319 | - 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 320 | - don't get me wrong: I like Skiena, his teaching style, and mannerisms, but I may not be Stony Brook material. 321 | - algorithm catalog: 322 | - this is the real reason you buy this book. 323 | - about to get to this part. Will update here once I've made my way through it. 324 | - Can rent it on kindle 325 | - Half.com is a great resource for textbooks at good prices. 326 | - Answers: 327 | - [Solutions](http://www.algorithm.cs.sunysb.edu/algowiki/index.php/The_Algorithms_Design_Manual_(Second_Edition)) 328 | - [Solutions](http://blog.panictank.net/category/algorithmndesignmanualsolutions/page/2/) 329 | - [Errata](http://www3.cs.stonybrook.edu/~skiena/algorist/book/errata) 330 | 331 | - [ ] [Introduction to Algorithms](https://www.amazon.com/Introduction-Algorithms-3rd-MIT-Press/dp/0262033844) 332 | - **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. 333 | - Half.com is a great resource for textbooks at good prices. 334 | - aka CLR, sometimes CLRS, because Stein was late to the game 335 | 336 | - [ ] [Programming Pearls](http://www.amazon.com/Programming-Pearls-2nd-Jon-Bentley/dp/0201657880) 337 | - The first couple of chapters present clever solutions to programming problems (some very old using data tape) but 338 | that is just an intro. This a guidebook on program design and architecture, much like Code Complete, but much shorter. 339 | 340 | - ~~"Algorithms and Programming: Problems and Solutions" by Shen~~ 341 | - 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. 342 | - Would rather spend time on coding problems from another book or online coding problems. 343 | 344 | ## Πριν αρχίσεις 345 | 346 | Αυτή η λίστα αυξήθηκε με την περίοδο πολλών μηνών, και ναι, βρίσκεται εκτός ελέγχου. 347 | 348 | Εδώ βρίσκονται κάποια λάθη που έκανα για να έχεις μία καλύτερη εμπειρία. 349 | 350 | ### 1. Δε θα το θυμάσαι καθόλου 351 | 352 | Είδα αρκετές ώρες βίντεο και πήρα άφθονες σημειώσεις, κα μήνες μετά υπήρχαν πολλά τα οποία δεν θυμόμουν. Ξόδεψα 3 μέρες εξετάζοντας λεπτομερώς τις σημειώσεις μου και έκανα καρτέλες για να μπορούσα να τις αξιολογήσω. 353 | 354 | Σε παρακαλώ διάβασε τα για να μην κανεις τα ίδια λάθη με τα δικά μου: 355 | 356 | [Retaining Computer Science Knowledge](https://startupnextdoor.com/retaining-computer-science-knowledge/) 357 | 358 | ### 2. Χρησιμοποιήσε κάρτες σημειώσεων 359 | 360 | Να λύνεις το πρόβλημα, Εγώ έκανα μία μικρή ιστοσελίδα με κάρτες σημειώσεων 2 τύπων: γενικές και κώδικα. Κάθε μία κάρτα έχει διαφορετικό φορμάτ. 361 | 362 | Έκανα ένα mobile-first website για να μπορούσα να τις αξιολογήσω στο κινητό μου και στο tablet μου, όπου κι αν είμαι. 363 | 364 | Φτιάξε το δικό σου δωρεάν: 365 | 366 | - [Flashcards site repo](https://github.com/jwasham/computer-science-flash-cards) 367 | - [My flash cards database (old - 1200 cards)](https://github.com/jwasham/computer-science-flash-cards/blob/master/cards-jwasham.db): 368 | - [My flash cards database (new - 1800 cards)](https://github.com/jwasham/computer-science-flash-cards/blob/master/cards-jwasham-extreme.db): 369 | 370 | Θυμήσου ότι ξεπέρασα τα όρια και είχα κάρτες που κάλυπταν τα πάντα, από assembly και Python trivia έως και μηχανική μάθηση και στατιστική. Ήταν κάπως υπερβολικό από αυτό που χρειαζόταν. 371 | 372 | **Σημείωσε στα flashcards:** Τον πρώτο καιρό θα αναγνωρίζεις ότι γνωρίζεις την απάντηση, μην την μαρκάρεις ως γνωστή. Έχεις να δεις την ίδια κάρτα και να την απαντήσεις αρκετές φορές σωστά πριν την κατανοήσεις πλήρως. Η επανάληψις είναι μήτηρ πάσης μαθήσεως!-Πλάτωνας. 373 | 374 | Η εναλλακτική είναι να χρησιμοποιήσεις το δικό μου flashcard site: [Anki](http://ankisrs.net/), το οποίο έχει προταθεί σε εμένα αρκετές φορές. Χρησιμοποιεί ένα επαναληπτικό σύστημα για να σε βοηθήσει να θυμηθείς. 375 | Είναι φιλικό προς τον χρήστη, διαθέσιμο σε όλες τις πλατφόρμες και διαθέτει συγχρονισμό με το cloud. Κοστίζει 25$ για iOS αλλά είναι δωρεάν στις άλλες πλατφόρμες. 376 | 377 | Η flashcard βάση δεδομένων μου σε φορμάτ Anki: https://ankiweb.net/shared/info/25173560 (thanks [@xiewenya](https://github.com/xiewenya)) 378 | 379 | ### 3. Αναθεώρησε, αναθεώρησε, αναθεώρησε 380 | 381 | Διατηρώ το σετ μου απο σκονάκια σε ASCII, στοίβα OSI, σχηματισμούς Big-O, και άλλα. Τα μελετώ όταν έχω λίγο χρόνο. 382 | 383 | Κάνε ένα διάλειμμα από τα προβλήματα προγραμματισμού για μισή ώρα και δούλεψε με τα flashcards. 384 | 385 | ### 4. Συγκεντρώσου 386 | 387 | Υπάρχουν πολλοί αντιπερισπασμοί που μπορούν να κοστίσουν πολύτιμο χρόνο. Η συγκέντρωση είναι ένα αρκετά δύσκολο κομμάτι. 388 | 389 | ## Τι δε θα δεις να καλύπτετε 390 | 391 | Υπάρχουν επικρατέστερες τεχνολογίες αλλά δεν είναι κομμάτι αυτού του πλάνου διαβάσματος: 392 | 393 | - SQL 394 | - Javascript 395 | - HTML, CSS, και άλλες front-end τεχνολογίες 396 | 397 | ## Το καθημερινό πλάνο 398 | 399 | Μερικά θέματα παίρνουν μία ολόκληρη μέρα, και μερικά θα κοστίσουν μερικές μέρες. Μερικά είναι μόνο γνώση χωρίς να χρειαστεί να υλοποιήσεις οτιδήποτε. 400 | 401 | Κάθε μέρα παίρνω ένα θέμα από την παρακάτω λίστα, βλέπω βίντεο για το συγκεκριμένο θέμα, και γρράφω μία υλοποίηση σε: 402 | - C - χρησιμοποιώντας structs και functions που παίρνουν struct * και κάτι άλλο σαν ορίσματα. 403 | - C++ - χωρίς να χρησιμοποιώ built-in τύπους 404 | - C++ - χρησιμοποιώντας built-in τύπους, όπως τα std::list της STL για μία συνδεδεμένη λίστα 405 | - Python - χρησιμοποιώντας built-in τύπους (για να εξασκούμε στην Python) 406 | - και γράφω tests για να σιγουρευτώ ότι το κάνω καλά, μερικές φορές χρησιμοποιώντας μόνο assert() δηλώσεις 407 | - Μπορεί να κάνεις Java ή κάτι άλλο, αυτό είναι μόνο αυτό που κάνω. 408 | 409 | Δεν χρειάζεσαι όλα αυτά. Χρειάζεσαι μόνο [μία γλώσσα για τη συνέντευξη](#Διάλεξε-μία-γλώσσα-για-τη-συνέντευξη). 410 | 411 | Γιατί γράφω κώδικα σε όλα αυτά; 412 | - Εξάσκηση, εξάσκηση, εξάσκηση, μέχρι να γίνω άρρωστος από αυτό, και να μπορώ να το κάνω χωρίς κανένα πρόβλημα (μερικά έχουν πολλές ακραίες περιπτώσεις και και τήρηση των λεπτομερειών του βιβλίου να θυμηθείς) 413 | - Δουλέυω με τα εμπόδια (allocating/freeing memory χωρίς την βοήθεια του garbage collection (εκτός της Python)) 414 | - Κάνω χρήση των built-in τύπων έτσι έχω λίγη εμπειρία στη χρήση built-in εργαλείων για χρήση στον πραγματικό κόσμο (δεν πάω να γράψω τη δικιά μου υλοποίηση για τη συνδεδεμένη λίστα στην παραγωγή) 415 | 416 | Μπορεί να μην έχω χρόνο να τα κάνω αυτά για όλα τα θέματα, αλλά θα προσπαθήσω. 417 | 418 | Μπορείς να δεις τον κώδικα μου εδώ: 419 | - [C] (https://github.com/jwasham/practice-c) 420 | - [C++] (https://github.com/jwasham/practice-cpp) 421 | - [Python] (https://github.com/jwasham/practice-python) 422 | 423 | Δε χρειάζεται να απομνημονεύσεις κάθε κομμάτι ενός αλγόριθμου. 424 | 425 | Γράψε κώδικα σε ένα πίνακα ή σε ένα χαρτί, όχι σε υπολογιστή. Τέσταρε τον με μερικές απλές εισόδους. Μετά τέσταρε τον και σε έναν υπολογιστή. 426 | 427 | ## Προαπαιτούμενη γνώση 428 | 429 | - [ ] **Μάθε C** (καλή τύχη με αυτό... :disappointed: ) 430 | - Η C είναι παντού. Θα δείς παραδείγματα σε βιβλία, διαλέξεις, βίντεο, *ΠΑΝΤΟΥ* όσο θα διαβάζεις. 431 | - [ ] [C Programming Language, Vol 2](https://www.amazon.com/Programming-Language-Brian-W-Kernighan/dp/0131103628) 432 | - Είναι ένα σύντομο βιβλίο, αλλά θα σου δώσει ένα χεράκι στην γλώσσα C και εάν την εξασκείς λίγο 433 | θα την καταλάβεις γρήγορα. Το να καταλάβεις τη C θα σε βοηθήσει να καταλάβεις πως δουλεύουν τα προγράμματα και η μνήμη. 434 | - [απαντήσεις και ερωτήσεις από έναν Έλληνα](https://github.com/lekkas/c-algorithms) 435 | 436 | - [ ] **How computers process a program:** 437 | - [ ] [How does CPU execute program (video)](https://www.youtube.com/watch?v=42KTvGYQYnA) 438 | - [ ] [Machine Code Instructions (video)](https://www.youtube.com/watch?v=Mv2XQgpbTNE) 439 | 440 | ## Αλγοριθμική πολυπλοκότητα / Big-O / Ασυμπτωτική ανάλυση 441 | - τίποτα προς υλοποίηση 442 | - [ ] [Harvard CS50 - Asymptotic Notation (video)](https://www.youtube.com/watch?v=iOq5kSKqeR4) 443 | - [ ] [Big O Notations (general quick tutorial) (video)](https://www.youtube.com/watch?v=V6mKVRU1evU) 444 | - [ ] [Big O Notation (and Omega and Theta) - best mathematical explanation (video)](https://www.youtube.com/watch?v=ei-A_wy5Yxw&index=2&list=PL1BaGV1cIH4UhkL8a9bJGG356covJ76qN) 445 | - [ ] Skiena: 446 | - [video](https://www.youtube.com/watch?v=gSyDMtdPNpU&index=2&list=PLOtl7M3yp-DV69F32zdK7YJcNXpTunF2b) 447 | - [slides](http://www3.cs.stonybrook.edu/~algorith/video-lectures/2007/lecture2.pdf) 448 | - [ ] [A Gentle Introduction to Algorithm Complexity Analysis](http://discrete.gr/complexity/) 449 | - [ ] [Orders of Growth (video)](https://class.coursera.org/algorithmicthink1-004/lecture/59) 450 | - [ ] [Asymptotics (video)](https://class.coursera.org/algorithmicthink1-004/lecture/61) 451 | - [ ] [UC Berkeley Big O (video)](https://youtu.be/VIS4YDpuP98) 452 | - [ ] [UC Berkeley Big Omega (video)](https://youtu.be/ca3e7UVmeUc) 453 | - [ ] [Amortized Analysis (video)](https://www.youtube.com/watch?v=B3SpQZaAZP4&index=10&list=PL1BaGV1cIH4UhkL8a9bJGG356covJ76qN) 454 | - [ ] [Illustrating "Big O" (video)](https://class.coursera.org/algorithmicthink1-004/lecture/63) 455 | - [ ] TopCoder (includes recurrence relations and master theorem): 456 | - [Computational Complexity: Section 1](https://www.topcoder.com/community/data-science/data-science-tutorials/computational-complexity-section-1/) 457 | - [Computational Complexity: Section 2](https://www.topcoder.com/community/data-science/data-science-tutorials/computational-complexity-section-2/) 458 | - [ ] [Cheat sheet](http://bigocheatsheet.com/) 459 | - [ ] [[Review] Analyzing Algorithms (playlist) in 18 minutes (video)](https://www.youtube.com/playlist?list=PL9xmBV_5YoZMxejjIyFHWa-4nKg6sdoIv) 460 | 461 | 462 | Εάν μερικές διαλέξεις είναι πολύ μαθηματικές, μπορείς να μεταβείς προς τα κάτω και να παρακολουθήσεις μερικά βίντεο σχετικά με τα διακριτά μαθηματικά για να πάρεις όλες τις γνώσεις που απαιτούνται. 463 | 464 | ## Δομές Δεδομένων 465 | 466 | - ### Πίνακες 467 | - Υλοποίησε μία λίστα, η οποία αλλάζει αυτόματα μέγεθος. 468 | - [ ] Περιγραφή: 469 | - [Πίνακες(EN) (video)](https://www.coursera.org/learn/data-structures/lecture/OsBSF/arrays) 470 | - [UCBerkley CS61B - Linear and Multi-Dim Arrays (video)](https://youtu.be/Wp8oiO_CZZE?t=15m32s) 471 | - [Basic Arrays (video)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Basic-arrays/149042/177104-4.html) 472 | - [Multi-dim (video)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Multidimensional-arrays/149042/177105-4.html) 473 | - [Dynamic Arrays (video)](https://www.coursera.org/learn/data-structures/lecture/EwbnV/dynamic-arrays) 474 | - [Jagged Arrays (video)](https://www.youtube.com/watch?v=1jtrQqYpt7g) 475 | - [Jagged Arrays (video)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Jagged-arrays/149042/177106-4.html) 476 | - [Resizing arrays (video)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Resizable-arrays/149042/177108-4.html) 477 | - [ ] Υλοποίησε μία συλλογή (ευμετάβλητο πίνακα με αυτόματη αλλαγή μεγέθους): 478 | - [ ] Κάνε πρακτική σε κώδικα χρησιμοποιώντας πίνακες και δείκτες, και pointer math για να πας σε ένα δείκτη από το να χρησιμοποιήσεις ευρετηρίαση. 479 | - [ ] new raw data array with allocated memory 480 | - can allocate int array under the hood, just not use its features 481 | - start with 16, or if starting number is greater, use power of 2 - 16, 32, 64, 128 482 | - [ ] size() - αριθμός των στοιχείων 483 | - [ ] capacity() - αριθμός στοιχείων που μπορεί να περιέχει 484 | - [ ] is_empty() 485 | - [ ] at(index) - επιστρέφει που υπάρχει στη θέση index, *εκρύγνειται* αν ο δείκτης είναι εκτός συνόρων του πίνακα 486 | - [ ] push(item) 487 | - [ ] insert(index, item) - εισάγει ένα σημείο στη θέση index, μετακινεί την τιμή του index και σύρει όλα τα στοιχεία στα δεξιά 488 | - [ ] prepend(item) - εισάγει το αντικείμενο στην αρχή της συλλογής(insert(0,item)) 489 | - [ ] pop() - αφαιρεί από το τέλος, επιστρέφει την τιμή 490 | - [ ] delete(index) - διγράφη το στοιχείο στη θέση index, σύρει όλα τα στοιχεία στα αριστερά 491 | - [ ] remove(item) - ψάχνει για την τιμή και διαγράφει το δείκτη που την έχει (ακόμα και αν είναι σε περισσότερες από 1 θέσεις) 492 | - [ ] find(item) - ψάχνει για την τιμή και επιστρέφει τον πρώτο δείκτη με αυτή την τιμή, -1 έαν δε βρεθεί 493 | - [ ] resize(new_capacity) // private function 494 | - όταν φτάνεις στη χωρητικώτητα, άλλαξε το μέγεθος του πίνακα κατά το διπλάσιο 495 | - όταν αφαιρείς ένα στοιχείο, εάν το μέγεθος είναι 1/4 της χωρητικότητας, άλλαξε το μέγεθος κατά το μισό 496 | - [ ] Χρόνος 497 | - O(1) για πρόσθεση/αφαίρεση στο τέλος (απελευθέρωση των δεσμευμένων θέσεων για περισσότερο χώρο) 498 | - O(n) για πρόσθεση/αφαίρεση αλλού 499 | - [ ] Χώρος 500 | - συνεχόμενος στη μνήμη, έτσι η μικρή απόσταση βοηθάει στην απόδοση 501 | - απαιτούμενος χώρος = (χωρητικότητα πίνακα, η οποία είναι >= n) * μέγεθος του στοιχείου, αλλά ακόμα και αν είναι 2n => O(n) 502 | 503 | - ### Συνδεδεμένες λίστες 504 | - [ ] Περιγραφή: 505 | - [ ] [Singly Linked Lists (video)](https://www.coursera.org/learn/data-structures/lecture/kHhgK/singly-linked-lists) 506 | - [ ] [CS 61B - Linked Lists (video)](https://www.youtube.com/watch?v=sJtJOtXCW_M&list=PL-XXv-cvA_iAlnI-BQr9hjqADPBtujFJd&index=5) 507 | - [ ] [[Review] Linked lists in 4 minutes (video)](https://youtu.be/F8AbOfQwl1c) 508 | - [ ] [C Code (video)](https://www.youtube.com/watch?v=QN6FPiD0Gzo) 509 | - not the whole video, just portions about Node struct and memory allocation. 510 | - [ ] Linked List vs Arrays: 511 | - [Core Linked Lists Vs Arrays (video)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/rjBs9/core-linked-lists-vs-arrays) 512 | - [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) 513 | - [ ] [why you should avoid linked lists (video)](https://www.youtube.com/watch?v=YQs6IC-vgmo) 514 | - [ ] Gotcha: you need pointer to pointer knowledge: 515 | (for when you pass a pointer to a function that may change the address where that pointer points) 516 | 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. 517 | - [Pointers to Pointers](https://www.eskimo.com/~scs/cclass/int/sx8.html) 518 | - [ ] υλοποίηση (Το έκανα με δείκτη ουράς και χωρίς): 519 | 520 | # untill here 521 | 522 | - [ ] size() - returns number of data elements in list 523 | - [ ] empty() - bool returns true if empty 524 | - [ ] value_at(index) - returns the value of the nth item (starting at 0 for first) 525 | - [ ] push_front(value) - adds an item to the front of the list 526 | - [ ] pop_front() - remove front item and return its value 527 | - [ ] push_back(value) - adds an item at the end 528 | - [ ] pop_back() - removes end item and returns its value 529 | - [ ] front() - get value of front item 530 | - [ ] back() - get value of end item 531 | - [ ] insert(index, value) - insert value at index, so current item at that index is pointed to by new item at index 532 | - [ ] erase(index) - removes node at given index 533 | - [ ] value_n_from_end(n) - returns the value of the node at nth position from the end of the list 534 | - [ ] reverse() - reverses the list 535 | - [ ] remove_value(value) - removes the first item in the list with this value 536 | - [ ] Doubly-linked List 537 | - [Description (video)](https://www.coursera.org/learn/data-structures/lecture/jpGKD/doubly-linked-lists) 538 | - No need to implement 539 | 540 | - ### Stack 541 | - [ ] [Stacks (video)](https://www.coursera.org/learn/data-structures/lecture/UdKzQ/stacks) 542 | - [ ] [Using Stacks Last-In First-Out (video)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Using-stacks-last-first-out/149042/177120-4.html) 543 | - [ ] [[Review] Stacks in 3 minutes (video)](https://youtu.be/KcT3aVgrrpU) 544 | - [ ] Will not implement. Implementing with array is trivial. 545 | 546 | - ### Queue 547 | - [ ] [Using Queues First-In First-Out(video)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Using-queues-first-first-out/149042/177122-4.html) 548 | - [ ] [Queue (video)](https://www.coursera.org/learn/data-structures/lecture/EShpq/queue) 549 | - [ ] [Circular buffer/FIFO](https://en.wikipedia.org/wiki/Circular_buffer) 550 | - [ ] [Priority Queues (video)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Priority-queues-deques/149042/177123-4.html) 551 | - [ ] [[Review] Queues in 3 minutes (video)](https://youtu.be/D6gu-_tmEpQ) 552 | - [ ] Implement using linked-list, with tail pointer: 553 | - enqueue(value) - adds value at position at tail 554 | - dequeue() - returns value and removes least recently added element (front) 555 | - empty() 556 | - [ ] Implement using fixed-sized array: 557 | - enqueue(value) - adds item at end of available storage 558 | - dequeue() - returns value and removes least recently added element 559 | - empty() 560 | - full() 561 | - [ ] Cost: 562 | - a bad implementation using linked list where you enqueue at head and dequeue at tail would be O(n) 563 | because you'd need the next to last element, causing a full traversal each dequeue 564 | - enqueue: O(1) (amortized, linked list and array [probing]) 565 | - dequeue: O(1) (linked list and array) 566 | - empty: O(1) (linked list and array) 567 | 568 | - ### Hash table 569 | - [ ] Videos: 570 | - [ ] [Hashing with Chaining (video)](https://www.youtube.com/watch?v=0M_kIqhwbFo&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=8) 571 | - [ ] [Table Doubling, Karp-Rabin (video)](https://www.youtube.com/watch?v=BRO7mVIFt08&index=9&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb) 572 | - [ ] [Open Addressing, Cryptographic Hashing (video)](https://www.youtube.com/watch?v=rvdJDijO2Ro&index=10&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb) 573 | - [ ] [PyCon 2010: The Mighty Dictionary (video)](https://www.youtube.com/watch?v=C4Kc8xzcA68) 574 | - [ ] [(Advanced) Randomization: Universal & Perfect Hashing (video)](https://www.youtube.com/watch?v=z0lJ2k0sl1g&list=PLUl4u3cNGP6317WaSNfmCvGym2ucw3oGp&index=11) 575 | - [ ] [(Advanced) Perfect hashing (video)](https://www.youtube.com/watch?v=N0COwN14gt0&list=PL2B4EEwhKD-NbwZ4ezj7gyc_3yNrojKM9&index=4) 576 | - [ ] [[Review] Hash tables in 4 minutes (video)](https://youtu.be/knV86FlSXJ8) 577 | 578 | - [ ] Online Courses: 579 | - [ ] [Understanding Hash Functions (video)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Understanding-hash-functions/149042/177126-4.html) 580 | - [ ] [Using Hash Tables (video)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Using-hash-tables/149042/177127-4.html) 581 | - [ ] [Supporting Hashing (video)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Supporting-hashing/149042/177128-4.html) 582 | - [ ] [Language Support Hash Tables (video)](https://www.lynda.com/Developer-Programming-Foundations-tutorials/Language-support-hash-tables/149042/177129-4.html) 583 | - [ ] [Core Hash Tables (video)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/m7UuP/core-hash-tables) 584 | - [ ] [Data Structures (video)](https://www.coursera.org/learn/data-structures/home/week/3) 585 | - [ ] [Phone Book Problem (video)](https://www.coursera.org/learn/data-structures/lecture/NYZZP/phone-book-problem) 586 | - [ ] distributed hash tables: 587 | - [Instant Uploads And Storage Optimization In Dropbox (video)](https://www.coursera.org/learn/data-structures/lecture/DvaIb/instant-uploads-and-storage-optimization-in-dropbox) 588 | - [Distributed Hash Tables (video)](https://www.coursera.org/learn/data-structures/lecture/tvH8H/distributed-hash-tables) 589 | 590 | - [ ] implement with array using linear probing 591 | - hash(k, m) - m is size of hash table 592 | - add(key, value) - if key already exists, update value 593 | - exists(key) 594 | - get(key) 595 | - remove(key) 596 | 597 | ## More Knowledge 598 | 599 | - ### Binary search 600 | - [ ] [Binary Search (video)](https://www.youtube.com/watch?v=D5SrAga1pno) 601 | - [ ] [Binary Search (video)](https://www.khanacademy.org/computing/computer-science/algorithms/binary-search/a/binary-search) 602 | - [ ] [detail](https://www.topcoder.com/community/data-science/data-science-tutorials/binary-search/) 603 | - [ ] [[Review] Binary search in 4 minutes (video)](https://youtu.be/fDKIpRe8GW4) 604 | - [ ] Implement: 605 | - binary search (on sorted array of integers) 606 | - binary search using recursion 607 | 608 | - ### Bitwise operations 609 | - [ ] [Bits cheat sheet](https://github.com/jwasham/coding-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) 610 | - [ ] Get a really good understanding of manipulating bits with: &, |, ^, ~, >>, << 611 | - [ ] [words](https://en.wikipedia.org/wiki/Word_(computer_architecture)) 612 | - [ ] Good intro: 613 | [Bit Manipulation (video)](https://www.youtube.com/watch?v=7jkIUgLC29I) 614 | - [ ] [C Programming Tutorial 2-10: Bitwise Operators (video)](https://www.youtube.com/watch?v=d0AwjSpNXR0) 615 | - [ ] [Bit Manipulation](https://en.wikipedia.org/wiki/Bit_manipulation) 616 | - [ ] [Bitwise Operation](https://en.wikipedia.org/wiki/Bitwise_operation) 617 | - [ ] [Bithacks](https://graphics.stanford.edu/~seander/bithacks.html) 618 | - [ ] [The Bit Twiddler](http://bits.stephan-brumme.com/) 619 | - [ ] [The Bit Twiddler Interactive](http://bits.stephan-brumme.com/interactive.html) 620 | - [ ] 2s and 1s complement 621 | - [Binary: Plusses & Minuses (Why We Use Two's Complement) (video)](https://www.youtube.com/watch?v=lKTsv6iVxV4) 622 | - [1s Complement](https://en.wikipedia.org/wiki/Ones%27_complement) 623 | - [2s Complement](https://en.wikipedia.org/wiki/Two%27s_complement) 624 | - [ ] count set bits 625 | - [4 ways to count bits in a byte (video)](https://youtu.be/Hzuzo9NJrlc) 626 | - [Count Bits](https://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetKernighan) 627 | - [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) 628 | - [ ] round to next power of 2: 629 | - [Round Up To Next Power Of Two](http://bits.stephan-brumme.com/roundUpToNextPowerOfTwo.html) 630 | - [ ] swap values: 631 | - [Swap](http://bits.stephan-brumme.com/swap.html) 632 | - [ ] absolute value: 633 | - [Absolute Integer](http://bits.stephan-brumme.com/absInteger.html) 634 | 635 | ## Trees 636 | 637 | - ### Trees - Notes & Background 638 | - [ ] [Series: Core Trees (video)](https://www.coursera.org/learn/data-structures-optimizing-performance/lecture/ovovP/core-trees) 639 | - [ ] [Series: Trees (video)](https://www.coursera.org/learn/data-structures/lecture/95qda/trees) 640 | - basic tree construction 641 | - traversal 642 | - manipulation algorithms 643 | - BFS (breadth-first search) 644 | - [MIT (video)](https://www.youtube.com/watch?v=s-CYnVz-uh4&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=13) 645 | - level order (BFS, using queue) 646 | time complexity: O(n) 647 | space complexity: best: O(1), worst: O(n/2)=O(n) 648 | - DFS (depth-first search) 649 | - [MIT (video)](https://www.youtube.com/watch?v=AfSk24UTFS8&list=PLUl4u3cNGP61Oq3tWYp6V_F-5jb5L2iHb&index=14) 650 | - notes: 651 | time complexity: O(n) 652 | space complexity: 653 | best: O(log n) - avg. height of tree 654 | worst: O(n) 655 | - inorder (DFS: left, self, right) 656 | - postorder (DFS: left, right, self) 657 | - preorder (DFS: self, left, right) 658 | - [ ] [[Review] Breadth-first search in 4 minutes (video)](https://youtu.be/HZ5YTanv5QE) 659 | - [ ] [[Review] Depth-first search in 4 minutes (video)](https://youtu.be/Urx87-NMm6c) 660 | - [ ] [[Review] Tree Traversal (playlist) in 11 minutes (video)](https://www.youtube.com/playlist?list=PL9xmBV_5YoZO1JC2RgEi04nLy6D-rKk6b) 661 | -------------------------------------------------------------------------------- /translations/how-to.md: -------------------------------------------------------------------------------- 1 | Please put new translation README files here. 2 | 3 | I'll migrate the existing translations when they are ready. 4 | 5 | To start a new translation, please: 6 | 7 | 1. Make an issue (for collaboration with other translators) 8 | 2. Make a pull request to collaborate and commit to. 9 | 3. Let me know when it's ready to pull. 10 | 11 | Thank you! 12 | --------------------------------------------------------------------------------