បង្កើតដោយ: @John Washam
បកប្រែជាភាសារខ្មែរដោយ: @Vortana Say
ពីដំបូងខ្ញុំបង្កើតនេះជាបញ្ជីប្រធានបទត្រូវធ្វើខ្លីដើម្បីក្លាយជាវិស្វករអភិវឌ្ឍន៍កម្មវិធី ប៉ុន្តែវាបានកើនឡើងដល់បញ្ជីធំដែលអ្នកបានឃើញសព្វថ្ងៃនេះ។ បន្ទាប់ពីឆ្លងកាត់គំរោងសិក្សានេះ ខ្ញុំបានក្លាយ ជាវិស្វករអភិវឌ្ឍន៍កម្មវិធីនៅអាមាហ្សូន (Amazon) អ្នកប្រហែលជាមិនចាំបាច់សិក្សាច្រេីនដូចខ្ញុំទេ។ ទោះយ៉ាងណាក៏ដោយអ្វីគ្រប់យ៉ាងដែលអ្នកត្រូវការគឺនៅទីនេះ។
ខ្ញុំបានសិក្សាប្រហែលជា ៨ ទៅ ១២ ម៉ោងក្នុងមួយថ្ងៃអស់រយៈពេលជាច្រើនខែ។ អ្នកអាចអានារឿងរបស់ខ្ញុំ៖ ហេតុអ្វីខ្ញុំសិក្សាពេញម៉ោងរយៈពេល ៨ ខែសំរាប់ការសំភាសន៍ហ្គូហ្គល
ចំណុចដែលបានរាយនៅទីនេះនឹងជួយអ្នករៀបចំការសំភាសន៍បច្ចេកទេសនៅក្រុមហ៊ុនកម្មវិធីណាមួយ។ រាប់បញ្ចូលទាំងក្រុមហ៊ុនធំៗដូចជា Amazon, Facebook, Google និង Microsoft ។
សូមសំណាងល្អដល់អ្នក!
ការបកប្រែ៖
ភាសារដែលកំពុងបកប្រែ:
- តើវាគឺជាអ្វី?
- ហេតុអ្វីប្រើវា?
- របៀបប្រើវា
- កុំមានអារម្មណ៍ថាអ្នកមិនឆ្លាតគ្រប់គ្រាន់
- ធនធានវីដេអូ
- ដំណើរការសម្ភាសន៍ និង ការត្រៀមសម្ភាសន៍ទូទៅ
- ជ្រើសរើសភាសាមួយសម្រាប់ការសម្ភាសន៍
- បញ្ជីសៀវភៅ
- មុនពេលអ្នកចាប់ផ្តើម
- អ្វីដែលអ្នកនឹងមិនឃើញ
- ចំណេះដឹងជាមុនដែលគួរមាន
- ផែនការប្រចាំថ្ងៃ
- ភាពស្មុគស្មាញនៃក្បួនដោះស្រាយ / Big-O / ការវិភាគ អាសុីមតុតិច (Asymptotic analysis)
- Data Structures
- ចំណេះដឹងបន្ថែម
- Trees
- Trees - កំណត់សំគាល់ និង ប្រវត្តិ
- Binary search trees: BSTs
- Heap / Priority Queue / Binary Heap
- balanced search trees (គំនិតទូទៅ តែពុំមែនព័ត៌មានលម្អិតទេ)
- traversals: preorder, inorder, postorder, BFS, DFS
- Sorting
- selection
- insertion
- heapsort
- quicksort
- merge sort
- Graphs
- directed
- undirected
- adjacency matrix
- adjacency list
- traversals: BFS, DFS
- ចំណេះដឹងបន្ថែមទៀត
- System Design, Scalability, Data Handling (if you have 4+ years experience)
- ពិនិត្យចុងក្រោយ
- អនុវត្តសំណួរសរសេរកូដ
- លំហាត់សរសេរកូដ / បញ្ហា
- នៅពេលអ្នកជិតដល់ការសំភាសន៍
- ប្រវត្តិរូបសង្ខេបរបស់អ្នក
- ត្រូវគិតអំពីពេលសម្ភាសន៍មកដល់
- មានសំណួរសម្រាប់អ្នកសម្ភាសន៍យេីង
- នៅពេលដែលទទួលបានការងារធ្វើ
នេះគឺជាគំរោងសិក្សារបស់ខ្ញុំដែលមានរយៈពេលជាច្រើនខែសំរាប់ការរៀនក្លាយពីអ្នកបង្កើតគេហទំព័រ (បង្រៀនដោយខ្លួនឯង និង មិនមានសញ្ញាប័ត្រ វិទ្យាសាស្ត្រកុំព្យូទ័រ) រហូតដល់ក្លាយជាវិស្វករអភិវឌ្ឍន៍កម្មវិធីសំរាប់ក្រុមហ៊ុនធំ។!
នេះមានន័យថាសម្រាប់ "វិស្វករអភិវឌ្ឍន៍កម្មវិធីថ្មី" ឬអ្នកដែលប្តូរពី ការអភិវឌ្ឍន៍កម្មវិធី / អ្នកបង្កេីតវេបសាយ (ដែលត្រូវការចំណេះដឹងផ្នែកវិទ្យាសាស្ត្រកុំព្យូទ័រ) ។ ប្រសិនបើអ្នកមាន បទពិសោធជាច្រើនឆ្នាំក្នុងការអភិវឌ្ឍន៍កម្មវិធី នោះអ្នកអាចនឹងរំពឹងថាមានបទសម្ភាសន៍ពិបាក។
ប្រសិនបើអ្នកមានបទពិសោធន៍អភិវឌ្ឍន៍កម្មវិធី ឬ វេបសាយច្រើនឆ្នាំ សូមកត់សម្គាល់ថាក្រុមហ៊ុនធំ ៗ ដូចជាហ្គូហ្គោល(Google) អាម៉ាហ្សូន (Amazon) ហ្វេសប៊ុក (Facebook) និង ម៉ៃក្រូសូហ្វ (Microsoft) មានទស្សនៈថាវិស្វករអភិវឌ្ឍន៍កម្មវិធី ខុសគ្នាពីអ្នកបង្កេីតកម្មវិធី ឬ ការអភិវឌ្ឍន៍គេហទំព័រវេបសាយ ហើយពួកគេត្រូវការចំណេះដឹងផ្នែកវិទ្យាសាស្ត្រកុំព្យូទ័រ។
ប្រសិនបើអ្នកចង់ក្លាយជាវិស្វករដែលអាចទុកចិត្តបានឬវិស្វករប្រតិបត្តិការសូមសិក្សាបន្ថែមពីបញ្ជីជម្រើស (បណ្តាញ និង សុវត្ថិភាព) ។
នៅពេលដែលខ្ញុំចាប់ផ្តើមគំរោងនេះ ខ្ញុំមិនដឹងពី stack, heap, Big-O, trees និង មិនដឹងរបៀបឆ្លងកាត់ក្រាហ្វ។ ប្រសិនបើខ្ញុំត្រូវសរសេរកូដដោះស្រាយ Sort ខ្ញុំអាចប្រាប់អ្នកថាវានឹងមិនល្អទេ។
Data Structure ទាំងអស់ដែលខ្ញុំធ្លាប់បានប្រើត្រូវបានបង្កើតឡើងមកជាមួយភាសា ហើយខ្ញុំមិនដឹងពីរបៀប និង ដំណេីរការដែល Data Structure។ ខ្ញុំមិនដែលត្រូវគ្រប់គ្រង Programming Memory ទេលុះត្រាតែកម្មវិធីខ្ញុំសរសេរមានបញ្ហា "អស់ Memory" ហើយបន្ទាប់មកខ្ញុំត្រូវរកដំណោះស្រាយបណ្តោះអាសន្ន។ ខ្ញុំបានប្រើ Multidiemsional arrays ពីរបីនៅក្នុងជីវិតរបស់ខ្ញុំ និង រាប់ពាន់នៃ Associate arrays ប៉ុន្តែខ្ញុំមិនដែលបង្កើត Data Structure ពីដំបូងឡើយ។
វាជាផែនការវែង។ វាអាចចំណាយពេលច្រើនខែ។ ប្រសិនបើអ្នកធ្លាប់ស្គាល់រឿងនេះរួចហើយវានឹងនាំអ្នកចំណាយពេលតិចជាងមុន។
អ្វីគ្រប់យ៉ាងខាងក្រោមគឺជាគ្រោង អ្នកគួរតែដោះស្រាយតាមលំដាប់ពីលើចុះក្រោម។
ខ្ញុំកំពុងប្រើសញ្ញាសម្គាល់ពិសេសរបស់ GitHub រួមទាំងបញ្ជីភារកិច្ចដើម្បីពិនិត្យមើលវឌ្ឍនភាពការងារខ្ញុំ។
បង្កើតសាខាថ្មី ដូច្នេះអ្នកអាចពិនិត្យមើលដូចនេះគ្រាន់តែដាក់សញ្ញា x ក្នុងតង្កៀប៖ [x]
ដាក់សាខាមួយ ហើយធ្វើតាមពាក្យបញ្ជាខាងក្រោម
git checkout -b progress
git remote add jwasham https://github.com/jwasham/coding-interview-university
git fetch --all
គូសសញ្ញា X ក្នុងប្រអប់ទាំងអស់បន្ទាប់ពីអ្នកបានបញ្ចប់ការកែសម្រួល
git add .
git commit -m "Marked x"
git rebase jwasham/master
git push --force
[ព័ត៌មានបន្ថែមអំពីសញ្ញាសម្គាល់ Github]](https://guides.github.com/features/mastering-markdown/#GitHub-flavored-markdown)
- វិស្វករអភិវឌ្ឍន៍កម្មវិធីដែលទទួលបានជោគជ័យគឺឆ្លាត ប៉ុន្តែមនុស្សជាច្រើនមានអារម្មណ៍ដែលពួកគេមិនឆ្លាតគ្រប់គ្រាន់។
- រឿងរបស់អ្នកសរសេរកម្មវិធីដែលមានទេពកោសល្យ
- វាមានគ្រោះថ្នាក់ក្នុងការទៅតែម្នាក់ឯង: ការប្រយុទ្ធនឹងសត្វចម្លែកដែលចេះបំបាំងកាយនៅក្នុងបច្ចេកវិទ្យា
វីដេអូខ្លះអាចប្រើបានតែតាមរយៈការចុះឈ្មោះចូលរៀនវគ្គ Coursera ឬ EdX ប៉ុណ្ណោះ។ ទាំងនេះត្រូវបានគេហៅថា MOOCs ។ ពេលខ្លះថ្នាក់រៀនមិននៅក្នុងវគ្គដូច្នេះអ្នកត្រូវរង់ចាំពីរបីខែសិន។
ខ្ញុំសូមកោតសរសើរចំពោះជំនួយរបស់អ្នកក្នុងការបន្ថែមប្រភពសាធារណៈដែលអាចរកបានដោយឥតគិតថ្លៃជានិច្ចដូចជាវីដេអូយូធ្យូប (YouTube) ដើម្បីភ្ជាប់វីដេអូវគ្គសិក្សាតាមអ៊ីនធឺណិត។
ខ្ញុំចូលចិត្តប្រើការបង្រៀនសាកលវិទ្យាល័យ។
- ABC: តែងតែសរសេរកូដ
- ការប្រេីប្រាស់ក្តារខៀន
- ការប្រេីប្រាស់ក្តារខៀនមានប្រសិទ្ធិភាពក្នុងពេលសម្ភាសន៍កម្មវិធី
- ជ្រើសរើសបុគ្គលិកជំនាញបច្ចេកវិទ្យា
- វិធីរកការងារនៅក្រុមហ៊ុនធំ ៤៖
- [បំបែកការសម្ភាសន៍ការសរសេរកូដ ១៖
- បំបែកបទសម្ភាសន៍កូដហ្វេសប៊ុក
- វគ្គសិក្សាត្រៀម:
- សំភាសន៍វិស្វករអភិវឌ្ឍន៍កម្មវិធី (មិនបានបង់ប្រាក់)៖
- រៀនពីរបៀបដើម្បីត្រៀមខ្លួនសម្រាប់ការសម្ភាសន៍វិស្វករអភិវឌ្ឍន៍កម្មវិធីពីអ្នកសំភាសន៍របស់ហ្គូហ្គោល (Google) ។
- Python សម្រាប់រចនាសម្ព័ន្ធទិន្នន័យក្បួនដោះស្រាយនិងសំភាសន៍ (វគ្គសិក្សាបង់លុយ)៖
- វគ្គសិក្សាសំភាសន៍ Python ដែលផ្តោតលើរចនាសម្ព័ន្ធទិន្នន័យក្បួនដោះស្រាយ ការសំភាសន៍សាកល្បងនិងច្រើនទៀត។
- ការណែនាំអំពីរចនាសម្ព័ន្ធទិន្នន័យនិងក្បួនដោះស្រាយដោយប្រើ Python (វគ្គសិក្សាឥតគិតថ្លៃរបស់ Udacity)៖
- រចនាសម្ព័នធ័រណេតនិងអ័រហ្គ្រែនដោយឥតគិតថ្លៃ។
- រចនាសម្ព័នទិន្នន័យនិងក្បួនដោះស្រាយ! (Udacity បង់ Nanodegree)៖
- ទទួលបានការអនុវត្តជាក់ស្តែងជាមួយនឹងរចនាសម្ព័ន្ធទិន្នន័យជាង ១០០ លំហាត់ និងការណែនាំពីអ្នកបងៀនដើម្បីជួយរៀបចំអ្នកសម្រាប់ការសម្ភាសន៍ និង ដាក់ការងារ។
- សំភាសន៍វិស្វករអភិវឌ្ឍន៍កម្មវិធី (មិនបានបង់ប្រាក់)៖
អ្នកអាចប្រើភាសាដែលអ្នកមានភាពងាយស្រួលក្នុងការសរសេរកូដសំភាសន៍ប៉ុន្តែសម្រាប់ក្រុមហ៊ុនធំ ៗ ទាំងនេះគឺជាជំរើសដ៏រឹងមាំ៖
- C ++
- Java
- Python
អ្នកក៏អាចប្រើរបស់ទាំងនេះដែរប៉ុន្តែត្រូវអានជាមុនសិន។ វាអាចមានការនិយាយតៗគ្នា៖
- JavaScript
- Ruby
នេះគឺជាអត្ថបទមួយដែលខ្ញុំបានសរសេរអំពីការជ្រើសរើសភាសាសម្រាប់ការសម្ភាសន៍៖ ជ្រើសរើសយកភាសាមួយសម្រាប់ការសម្ភាសន៍សរសេរកូដ
អ្នកគួររេីសភាសាដែលអ្នកទំលាប់ជាមួយ និង មានចំណេះដឹង។
សូមអានបន្ថែមអំពីជំរើស៖
- http://www.byte-by-byte.com/choose-the-right-language-for-your-coding-interview/
- http://blog.codingforinterviews.com/best-programming-language-jobs/
អ្នកនឹងឃើញការរៀន C, C ++ និង Python ខាងក្រោមព្រោះខ្ញុំកំពុងរៀន។ មានសៀវភៅពីរបីដែលពាក់ព័ន្ធសូមមើលនៅខាងក្រោម។
នេះគឺជាបញ្ជីខ្លីជាងអ្វីដែលខ្ញុំបានប្រើ។ នេះត្រូវបានសង្ខេបដើម្បីជួយសន្សំសំចៃពេលវេលារបស់អ្នក។
- សំភាសន៍ការសរសេរកម្មវិធីបង្ហាញ: ការសរសេរកូដវិធីរបស់អ្នកតាមរយៈការសំភាសន៍, បោះពុម្ពលើកទី ៤
- ចម្លើយសរសេរ C++ និង Java
- នេះគឺជាសមដ៏ល្អសម្រាប់ការបំបែកសំភាសន៍កូដ
- មិនពិបាកពេកទេ បញ្ហាភាគច្រើនប្រហែលជាងាយស្រួលជាងអ្វីដែលអ្នកបានឃើញក្នុងបទសម្ភាសន៍ (ពីអ្វីដែលខ្ញុំបានអាន)
- ការសំភាសន៍ការសរសេរកូដការបោះពុម្ពលើកទី ៦
- ចម្លើយនសរសេរជា Java
ជ្រើសរើសមួយ:
- ធាតុផ្សំនៃបទសម្ភាសន៍សរសេរកម្មវិធី (កំណែ C ++)
- ធាតុផ្សំនៃការសំភាសន៍សរសេរកម្មវិធីក្នុង Python
- ធាតុនៃការសំភាសន៍សរសេរកម្មវិធី (កំណែ Java)
អ្នកត្រូវជ្រើសរើសភាសាសំរាប់សំភាសន៍ (សូមមើលខាងលើ) ។
នេះជាអ្នីដែលខ្ញុំគិតថាអ្នកគួរមេីល។ ខ្ញុំមិនមានធនធានសម្រាប់ភាសាទាំងអស់ទេ។ ខ្ញុំស្វាគមន៍ការដាក់បន្ថែមពីអ្នក។
ប្រសិនបើអ្នកអានចំណុចមួយក្នុងចំណោមចំណុចទាំងនេះអ្នកគួរតែមានចំនេះដឹង Data Structure និងចំណេះដឹងអំពីក្បួនដោះស្រាយ (Algorithm) ដែលអ្នកត្រូវចាប់ផ្តើមធ្វើបញ្ហាសរសេរកូដ។
អ្នកអាចរំលងការបង្រៀនវីដេអូទាំងអស់នៅក្នុងគម្រោងនេះ លើកលែងតែអ្នកចង់ពិនិត្យឡើងវិញ។
ខ្ញុំមិនបានអានទាំងពីរនេះទេ ប៉ុន្តែវាត្រូវបានវាយតម្លៃនិងសរសេរយ៉ាងខ្ពស់ដោយ Sedgewick ។ គាត់អស្ចារ្យណាស់។
- វិធីដោះស្រាយក្នុង C++, ផ្នែក ១-៤៖ មូលដ្ឋានគ្រឹះរចនាសម្ព័ន្ធទិន្នន័យ (Data Structure) តម្រៀប (Sort) ស្វែងរក (Searching)
- វិធីដោះស្រាយក្នុង C++ ភាគ ៥៖ ក្បួនដោះស្រាយក្រាហ្វិច
ប្រសិនបើអ្នកមានអនុសាសន៍ល្អប្រសើរសម្រាប់ C++ សូមប្រាប់ខ្ញុំឱ្យដឹង។ រកមើលធនធានទូលំទូលាយ។
- វិធីដោះស្រាយ (Sedgewick និង Wayne)
- វីដេអូដែលមានមាតិកាសៀវភៅ (និង Sedgewick!) លើវគ្គសិក្សា៖
រឺ៖
- រចនាសម្ព័ន្ធទិន្នន័យ (Data Structure) និងក្បួនដោះស្រាយ Java
- ដោយហ្គ្រីដល (Goodrich), តាតសាសៀ (Tamassia), ហ្គោវីស (Goldwasser)
- អត្ថបទសម្រាប់វគ្គសិក្សាសំរាប់ថ្នាក់ដំបូងរបស់វិទ្យាសាស្ត្រកុំព្យូទ័រនៅឯ UC Berkeley
- សូមមើលរបាយការណ៍សៀវភៅរបស់ខ្ញុំស្តីពីកំណែ Python ខាងក្រោម។ សៀវភៅនេះមានប្រធានបទដូចគ្នា។
- រចនាសម្ព័ន្ធទិន្នន័យ (Data Structure) និងក្បួនដោះស្រាយ (Algorithm) ក្នុង Python
- ដោយហ្គ្រីដល (Goodrich), តាតសាសៀ (Tamassia), ហ្គោវីស (Goldwasser)
- ខ្ញុំចូលចិត្តសៀវភៅនេះ។ វាគ្របដណ្តប់អ្វីៗគ្រប់យ៉ាងនិងច្រើនទៀត។
- លេខកូដព្យញ្ជនៈ
- របាយការណ៍សៀវភៅរបស់ខ្ញុំ៖ https://startupnextdoor.com/book-report-data-structures-and-al algorithms-in-python/
បញ្ជីនេះបានកើនឡើងអស់រយៈពេលជាច្រើនខែហើយ ។
នេះគឺជាកំហុសមួយចំនួនដែលខ្ញុំបានធ្វើដូច្នេះអ្នកនឹងមានបទពិសោធប្រសើរជាងមុន។
ខ្ញុំបានមើលវីដេអូជាច្រើនម៉ោងនិងកត់ចំណាំគួរអោយចង់សើច ហើយប៉ុន្មានខែក្រោយមកមានរឿងជាច្រើនដែលខ្ញុំមិនចាំ។ ខ្ញុំចំណាយពេល ៣ ថ្ងៃទៀត តាមរយៈកំណត់ចំណាំរបស់ខ្ញុំនិងធ្វើប័ណ្ណបញ្ជាក់ដូច្នេះខ្ញុំអាចពិនិត្យមើលឡើងវិញ។
សូមមេត្តាអានដូច្នេះអ្នកនឹងមិនធ្វើឱ្យខ្ញុំខុសទេ។
រក្សាចំណេះដឹងវិទ្យាសាស្ត្រកុំព្យូទ័រ ។
វគ្គសិក្សាដែលបានណែនាំដល់ខ្ញុំ (មិនបានសិក្សាវាទេ)៖ ការរៀនពីរបៀបរៀន
ដើម្បីដោះស្រាយបញ្ហា ខ្ញុំបានបង្កើតវេបសាយកាតតូចមួយដែលខ្ញុំអាចបន្ថែមកាតចំនួន ២ ប្រភេទគឺទូទៅនិងលេខកូដ។ កាតនីមួយៗមានទ្រង់ទ្រាយខុសៗគ្នា។
ខ្ញុំបានបង្កើតវេបសាយសំរាប់ទូរស័ព្ទដំបូងមួយ ដូច្នេះខ្ញុំអាចពិនិត្យមើលឡើងវិញនៅលើទូរស័ព្ទ និង ថេប្លេតរបស់ខ្ញុំទោះបីខ្ញុំនៅទីណាក៏ដោយ។
អ្នកអាចបង្កេីតដោយឥតគិតថ្លៃ៖
- បណ្តាញឃ្លាំងផ្ទុកកាតឡើងវិញ
- មូលដ្ឋានទិន្នន័យកាតរបស់ខ្ញុំ (កាតចាស់ - ១២០០ កាត)៖
- ប្រព័ន្ធទិន្នន័យកាតរបស់ខ្ញុំ (កាតថ្មី - ១៨០០)៖
សូមចងចាំថាខ្ញុំបានឡើងលើក្តារហើយមានកាតគ្របដណ្តប់លើអ្វីៗទាំងអស់ចាប់ពីភាសាការជួបប្រជុំគ្នា និង សំនួរទាក់ទងនឹង Python រហូតដល់ការរៀនម៉ាស៊ីននិងស្ថិតិ។ វាជាវិធីច្រើនពេកសម្រាប់អ្វីដែលត្រូវការ។
កំណត់ចំណាំនៅលើបណ្ណបង្ហាញ៖ ជាលើកដំបូងដែលអ្នកទទួលស្គាល់អ្នកដឹងពីចម្លើយ សូមកុំសម្គាល់វាថាត្រូវបានគេស្គាល់។ អ្នកត្រូវតែមើល កាតដូចគ្នានិងឆ្លើយវាច្រើនដងឱ្យបានត្រឹមត្រូវមុនពេលដែលអ្នកពិតជាដឹង។ ពាក្យដដែលៗនឹងធ្វើឱ្យចំណេះដឹងនោះកាន់តែស៊ីជម្រៅ ខួរក្បាលរបស់អ្នក។
ជំរើសមួយផ្សេងទៀតក្នុងការប្រើប្រាស់បណ្តាញកាតរបស់ខ្ញុំគឺ Anki ដែលត្រូវបានណែនាំអោយខ្ញុំច្រើនដង។ វាប្រើប្រព័ន្ធពាក្យដដែលៗដើម្បីជួយអ្នកចងចាំ។ វាមានភាពងាយស្រួលសម្រាប់អ្នកប្រើដែលមាននៅលើគ្រប់វេទិកាទាំងអស់និងមានប្រព័ន្ធធ្វើសមកាលកម្មពពក។ វាមានតម្លៃ ២៥ ដុល្លារលើប្រព័ន្ធប្រតិបត្តិការ iOS ប៉ុន្តែមិនគិតថ្លៃនៅលើវេទិកាផ្សេងទៀតទេ។
មូលដ្ឋានទិន្នន័យបណ្ណបង្ហាញរបស់ខ្ញុំក្នុងទំរង់អាគី (Anki) ៖ https://ankiweb.net/shared/info/25173560 (សូមអរគុណ @xiewenya
៣. ចាប់ផ្តើមធ្វើសំណួរសម្ភាសន៍សរសេរកូដខណៈពេលដែលអ្នកកំពុងរៀនរចនាសម្ព័ន្ធទិន្នន័យ (Data Structure) និង ក្បួនដោះស្រាយ (Algorithm)
អ្នកត្រូវអនុវត្តអ្វីដែលអ្នកកំពុងរៀនដើម្បីដោះស្រាយបញ្ហាឬអ្នកនឹងភ្លេច។ ខ្ញុំបានធ្វើកំហុសនេះ។ នៅពេលដែលអ្នកបានរៀនប្រធានបទមួយ ហើយមានអារម្មណ៍ស្រួលជាមួយវាដូចជាបញ្ជីភ្ជាប់បើកសៀវភៅសម្ភាសន៍កូដសរសេរមួយហើយធ្វើសំណួរពីរបីទាក់ទងនឹង បញ្ជីដែលបានភ្ជាប់។ បន្ទាប់មកបន្តទៅប្រធានបទសិក្សាបន្ទាប់។ បន្ទាប់មកពេលក្រោយ ត្រលប់ក្រោយហើយធ្វើបញ្ហាបញ្ជីដែលបានភ្ជាប់ផ្សេងទៀត ឬបញ្ហាការហៅឡើងវិញឬអ្វីផ្សេងទៀត។ ប៉ុន្តែនៅតែធ្វើបញ្ហានៅពេលអ្នកកំពុងរៀន។ អ្នកមិនត្រូវបានគេជួលដើម្បីចំណេះដឹងទេ ប៉ុន្តែរបៀបដែលអ្នកអនុវត្តចំណេះដឹង។ មានសៀវភៅនិងគេហទំព័រជាច្រើនដែលខ្ញុំសូមណែនាំ។ សូមមើលនៅទីនេះសម្រាប់ព័ត៌មានបន្ថែម: ការអនុវត្តសំណួរសំណួរសរសេរកូដ
ខ្ញុំរក្សាទុកសន្លឹកបន្លំមួយសន្លឹកនៅលើ ASCII, OSI stack, សញ្ញាណសំគាល់ធំ ៗ (Big-O) និងច្រើនទៀត។ ខ្ញុំសិក្សាវានៅពេលខ្ញុំមានពេលទំនេរខ្លះ។
សម្រាកពីបញ្ហាសរសេរកម្មវិធីរយៈពេលកន្លះម៉ោង ហើយអានកាតរបស់អ្នក។
មានការរំខានជាច្រើនដែលអាចចំណាយពេលដ៏មានតម្លៃ។ ការផ្តោតអារម្មណ៍គឺពិបាក។ បើកតន្ត្រីមួយចំនួនដែលគ្មានទំនុកច្រៀងទេអ្នកនឹងអាចផ្តោតអារម្មណ៍បានល្អ។
ទាំងនេះជាបច្ចេកវិទ្យាដែលមានជាទូទៅប៉ុន្តែមិនមែនជាផ្នែកនៃផែនការសិក្សានេះទេ៖
- SQL
- Javascript
- HTML, CSS និងបច្ចេកវិទ្យាផ្នែក front-end
មុខវិជ្ជាខ្លះចំណាយពេលមួយថ្ងៃហើយ មុខវិជ្ជាខ្លះនឹងចំណាយពេលច្រើនថ្ងៃ។ អ្នកខ្លះរៀនតែគ្មានអ្វីអនុវត្ត។
ជារៀងរាល់ថ្ងៃខ្ញុំយកប្រធានបទមួយចេញពីបញ្ជីខាងក្រោមមើលវីដេអូអំពីប្រធានបទនោះហើយសរសេរកូតនៅក្នុង៖
- C - ប្រើរចនាសម្ព័ន្ធ និង មុខងារដែលយករចនាសម្ព័ន្ធ * និង អ្វីផ្សេងទៀតជា Arguments។
- C++ - ដោយមិនប្រើមុខងារដែលភ្ជាប់មកជាមួយនឹង ភាសា
- C++ - ប្រើប្រភេទដែលមានស្រាប់ដូចជា STL's::list សម្រាប់បញ្ជីភ្ជាប់ (Linked list)
- Python - ប្រើប្រភេទដែលមានស្រាប់ (ដើម្បីរំលឹក Python)
- និងសរសេរការធ្វើតេស្តដើម្បីធានាថាខ្ញុំធ្វើវាបានត្រឹមត្រូវពេលខ្លះគ្រាន់តែប្រើសេចក្តីថ្លែងអះអាងសាមញ្ញ assert()
- អ្នកអាចធ្វើ Jav ឬ អ្វីផ្សេងទៀតនេះគ្រាន់តែជារឿងរបស់ខ្ញុំប៉ុណ្ណោះ។
អ្នកមិនត្រូវការរបស់ទាំងអស់នេះទេ។ អ្នកត្រូវការតែ ភាសាមួយសម្រាប់ការសម្ភាសន៍ ។
ហេតុអ្វីត្រូវកូដទាំងអស់នេះ?
- អនុវត្ត អនុវត្ត អនុវត្តរហូតដល់ខ្ញុំច្បាស់ហើយអាចធ្វើវាដោយគ្មានបញ្ហា (អ្នកខ្លះមានករណីកំរច្រើន និង ព័ត៌មានលំអិតនៃការរក្សាទុកសៀវភៅដើម្បីចងចាំ)
- ធ្វើការនៅក្នុងឧបសគ្គ (បែងចែក / លុបចេញអង្គចងចាំ (Memory) ដោយគ្មានជំនួយពីការប្រមូលសំរាម (Gabage Collection) (លើកលែងតែ Python ឬ Java))
- ប្រើប្រភេទដែលមានស្រាប់ដូច្នេះខ្ញុំមានបទពិសោធន៍ប្រើឧបករណ៍ដែលមានស្រាប់សម្រាប់ការប្រើប្រាស់ដូចពេលធ្វេីការ (មិនមែនថាសរសេរការអនុវត្តន៍បញ្ជី (Linked List) របស់ខ្ញុំផ្ទាល់ក្នុងពេលធ្វេីការ)
ខ្ញុំប្រហែលជាមិនមានពេលវេលាដើម្បីធ្វើការទាំងអស់សម្រាប់មុខវិជ្ជាទាំងអស់នោះទេប៉ុន្តែខ្ញុំនឹងព្យាយាម។
អ្នកអាចឃើញកូដរបស់ខ្ញុំនៅទីនេះ៖
អ្នកមិនចាំបាច់ទន្ទេញចាំគ្រប់ក្បួនដោះស្រាយទាំងអស់។
សរសេរកូដនៅលើក្ដារខៀនឬក្រដាស មិនមែនកុំព្យូទ័រទេ។ សាកល្បងជាមួយធាតុចូលគំរូមួយចំនួន។ បន្ទាប់មកសាកល្បងវានៅលើកុំព្យូទ័រ។
-
រៀន C
-
C គឺនៅគ្រប់ទីកន្លែង។ អ្នកនឹងឃើញឧទាហរណ៍នៅក្នុងសៀវភៅការបង្រៀនវីដេអូ នៅគ្រប់ទីកន្លែង ពេលអ្នកកំពុងសិក្សា។
-
- នេះគឺជាសៀវភៅខ្លីមួយប៉ុន្តែវានឹងផ្តល់ឱ្យអ្នកនូវភាសា C យ៉ាងល្អហើយប្រសិនបើអ្នកអនុវត្តវាបន្តិច អ្នកនឹងឆាប់ស្ទាត់ជំនាញ។ ការយល់ដឹង C ជួយអ្នកឱ្យយល់ពីរបៀបដែលកម្មវិធីនិងការចងចាំដំណើរការ។
- ចម្លើយចំពោះសំណួរ
-
-
របៀបដែលកុំព្យូទ័រដំណើរការកម្មវិធី:
- គ្មានអ្វីត្រូវអនុវត្តទេ
- មានវីដេអូជាច្រើននៅទីនេះ។ គ្រាន់តែមើលឱ្យបានគ្រប់គ្រាន់រហូតដល់អ្នកយល់។ អ្នកអាចត្រលប់មកពិនិត្យឡើងវិញជានិច្ច។
- ប្រសិនបើការបង្រៀនមួយចំនួនមានភាពស្រងូតស្រងាត់អ្នកអាចរំលងដល់ក្រោមហើយមើលវីដេអូគណិតវិទ្យាដែលដាច់ពីគ្នាដើម្បីទទួលបានចំណេះដឹងជាមូលដ្ឋាន។
- Harvard CS50 - Asymptotic Notation (វីដេអូ)
- កំណត់ចំណាំ Big-O (ការបង្រៀនរហ័សទូទៅ) (វីដេអូ)
- Big O Notation (និង Omega និង Theta) - ការពន្យល់គណិតវិទ្យាល្អបំផុត (វីដេអូ)
- Skiena៖ - វីដេអូ - ស្លាយ
- ការណែនាំមួយចំពោះការវិភាគស្មុគស្មាញនៃគណិតវិទ្យា
- លំដាប់នៃការលូតលាស់ (វីដេអូ)
- ការវិភាគអាមីស្តូតូទិក (Amortized) (វីដេអូ)
- UC Berkeley Big O (មានវីដេអូ)
- UC Berkeley Big Omega (វីដេអូ)
- ការវិភាគរំលោះ (Amortized) (វីដេអូ)
- បង្ហាញរូបភាព "Big-O" (វីដេអូ)
- TopCoder (រួមបញ្ចូលទាំងទំនាក់ទំនងកើតឡើងវិញនិងទ្រឹស្តីបទមេ)៖
- សន្លឹកជំនួយ
-
- អនុវត្តវ៉ិចទ័រប្តូរទំហំដោយស្វ័យប្រវត្តិ។
- ការពិពណ៌នា៖
- អនុវត្តវ៉ិចទ័រ (បំលែង Arrays ដោយប្តូរទំហំស្វ័យប្រវត្តិ)៖
- អនុវត្តការសរសេរកូដដោយប្រើArrays និង ទ្រនិចចង្អុល និង គណិតទ្រនិចដើម្បីលោតទៅសន្ទស្សន៍មួយ។
- Arrays ទិន្នន័យថ្មីដែលមានអង្គចងចាំបម្រុងទុក
- អាចបែងចែកArraysនៅក្រោមក្រណាត់ដោយគ្រាន់តែមិនប្រើលក្ខណៈពិសេសរបស់វា
- ចាប់ផ្តើមជាមួយលេខ ១៦ ឬបើលេខចាប់ផ្តើមធំជាងប្រើថាមពល ២ - ១៦, ៣២, ៦៤, ១២៨
- size() - ចំនួនធាតុ
- capacity() - ចំនួនធាតុដែលវាអាចផ្ទុកបាន
- is_empty()
- at(index) - ត្រឡប់ធាតុនៅទីតាំងដែលបានផ្តល់ឱ្យ បេីទីតាំងនៅក្រៅព្រំដែន វានឹង មានកុំហស
- push(item)
- insert(index, item) - បញ្ចូលធាតុនៅទីតាំង ប្តូរតម្លៃទីតាំង និងធាតុនៅខាងក្រោមទៅខាងស្តាំ
- prepend (item) - អាចប្រើបញ្ចូលខាងលើនៅទីតាំង ០
- pop() - ដកចេញពីចុងបញ្ចប់តម្លៃត្រឡប់មកវិញ
- delete(index) - លុបធាតុនៅទីតាំងដែលអោយ ផ្លាស់ប្តូរធាតុនៅពីក្រោយទាំងអស់
- remove(item) - រកមើលតម្លៃនិងយកទីតាំងចេញដែលផ្ទុកវាចេញ (ទោះបីជានៅកន្លែងច្រើនក៏ដោយ)
- find(item) - រកមើលតម្លៃហើយត្រឡប់វិញនៅទីតាំងដំបូងជាមួយតម្លៃនោះ បើរកមិនឃើញត្រលប់វិញ -1
- resize(new_capacity) // មុខងារឯកជន
- ពេលទំហំ Array ដល់កំណត់, ផ្លាស់ប្តូរទំហំទ្វេដងទំហំ
- នៅពេលដែលចាប់យកវត្ថុមួយ ប្រសិនបើទំហំគឺ 1/4 នៃទំហំសរុប, ផ្លាស់ប្តូរទំហំដល់ពាក់កណ្តាល
- ពេលវេលា
- O(១) ត្រូវបន្ថែម / ដកចេញនៅចុងបញ្ចប់ (សងវិញសម្រាប់ការបែងចែកសម្រាប់ទំហំបន្ថែម) ទីតាំង
- O(n) ដើម្បីបញ្ចូល / ដកចេញនៅកន្លែងផ្សេងទៀត
- លំហ
- ជាប់ទាក់ទងនឹងការចងចាំដូច្នេះភាពជិតស្និទ្ធជួយដល់ការអនុវត្ត
- ទំហំត្រូវការ = (ទំហំ Array, ដែល >= n) * ទំហំនៃធាតុ, ប៉ុន្តែបើទោះបីជា 2n, នៅតែ O (n)
-
- ការពិពណ៌នា៖
- កូដ C (វីដេអូ)
- មិនមែនវីដេអូទាំងមូលទេគឺគ្រាន់តែជាផ្នែកអំពីរចនាសម្ព័ន្ធ (Data Structure) និងការបែងចែក Memory ។
- Linked List vs Arrays:
- ហេតុអ្វីអ្នកគួរចៀសវាង linked lists (វីដេអូ)
- Gotcha: you need pointer to pointer knowledge: (សម្រាប់ពេលអ្នកហុច pointer ទៅមុខងារមួយដែលអាចផ្លាស់ប្តូរអាស័យដ្ឋានដែលព្រួញចង្អុល) ទំព័រនេះគ្រាន់តែដើម្បីស្វែងយល់ពី pointer ទៅ pointer ។ ខ្ញុំមិនណែនាំបញ្ជីឈ្មោះបែបត្រាប់តាមនេះទេ។ ភាពងាយស្រួលក្នុងការអាននិងរក្សាបាននូវភាពលំបាកដោយសារតែភាពឆ្លាតវៃ។
- អនុវត្ត (ខ្ញុំបានធ្វើដោយប្រើទ្រនិចកន្ទុយនិងដោយគ្មាន)៖
- size() - ត្រឡប់ចំនួនធាតុទិន្នន័យក្នុងបញ្ជី
- empty() - bool ត្រឡប់ពិតបើទទេ
- value_at(index) - ត្រឡប់តម្លៃនៃធាតុទី (ចាប់ផ្តើមពីលេខ ០ ដំបូង)
- push_front(តម្លៃ) - បន្ថែមធាតុនៅខាងមុខបញ្ជី
- pop_front() - យកធាតុខាងមុខចេញហើយប្រគល់តម្លៃរបស់វាមកវិញ
- push_back(តម្លៃ) - បន្ថែមធាតុនៅចុងបញ្ចប់
- pop_back() - យកធាតុបញ្ចប់ហើយត្រឡប់តម្លៃរបស់វា
- front() - ទទួលបានតម្លៃនៃធាតុខាងមុខ
- back() - ទទួលបានតម្លៃនៃធាតុបញ្ចប់
- insert(index, តម្លៃ) - បញ្ចូលតម្លៃនៅindex ដូច្នេះធាតុបច្ចុប្បន្ននៅindexនោះត្រូវបានចង្អុលទៅធាតុថ្មីនៅindex។
- erase(index) - យក Node ចេញនៅ index ដែលបានផ្តល់ឱ្យ
- value_n_from_end(n) - ត្រឡប់តម្លៃ Node ទីពីខាងចុងបញ្ជី
- reverse() - បញ្ច្រាស់បញ្ជី
- remove_value(តម្លៃ) - លុបធាតុដំបូងក្នុងបញ្ជីជាមួយតម្លៃនេះ
- Doubly-linked List
- ការពិពណ៌នា (វីដេអូ)
- មិនចាំបាច់អនុវត្តទេ
-
- Stack (វីដេអូ)
- ការប្រើ Stack ចូលមុនចេញក្រោយ (វីដេអូ)
- នឹងមិនអនុវត្តទេ។ ការអនុវត្តជាមួយ Array គឺមិនសំខាន់។
-
- ការប្រើ Queue ចូលមុនចេញមុន(វីដេអូ)
- Queue (វីដេអូ)
- [ ] Circular buffer/FIFO
- [ ] Queue អាទិភាព (វីដេអូ)
- [ ] ប្រើ linked-list ដែលមានភ្ជាប់ជាមួយទ្រនិចនៅកន្ទុយ៖
- enqueue(តម្លៃ) - បន្ថែមតម្លៃនៅទីតាំងនៅកន្ទុយ
- dequeue() - ត្រឡប់តម្លៃនិងយកធាតុដែលបានបន្ថែមថ្មីៗចេញ (ផ្នែកខាងមុខ)
- empty() - [ ] អនុវត្តដោយប្រើអារេ Array ទំហំថេរ៖
- enqueue(តម្លៃ) - បន្ថែមធាតុនៅចុងបញ្ចប់នៃការផ្ទុកដែលមាន
- dequeue() - ត្រឡប់តម្លៃនិងយកធាតុដែលបានបន្ថែមថ្មីៗចេញ
- empty()
- full() - [ ] ថ្លៃ៖
- ការអនុវត្តមិនល្អដោយប្រើlinked listដែលអ្នករៀបជាជួរនៅនឹងក្បាលនិងដេស្កាយនៅកន្ទុយប្រហែលជា O(n) ដោយសារតែអ្នកត្រូវការនៅជាប់នឹងធាតុចុងក្រោយ, បណ្តាលឱ្យ dequeue គ្នាឆ្លងកាត់ពេញលេញ
- enqueue: O(1) (amortized, linked list and array [probing])
- dequeue: O(1) (linked list and array)
- empty: O(1) (linked list and array)
-
-
វីដេអូ៖
-
វគ្គសិក្សាអនឡាញ៖
- ស្វែងយល់អំពីមុខងារ Hash (វីដេអូ)
- ការប្រើតារាងHash (វីដេអូ)
- [គាំទ្រ Hash (វីដេអូ)](https://archive.org/details/0102WhatYouShouldKnow/06_04- ឧបត្ថម្ភគាំទ្រហាន់ឌ្រី)
- តារាងជំនួយភាសា Hash(វីដេអូ)
- Core Hash Tables (វីដេអូ)
- រចនាសម្ព័ន្ធទិន្នន័យ (វីដេអូ)
- បញ្ហាសៀវភៅទូរស័ព្ទ (វីដេអូ)
- [តារាងចែកចាយ]
-
អនុវត្តជាមួយអារេដោយប្រើការស៊ើបអង្កេតលីនេអ៊ែរ
- hash(k, m) - m គឺជាទំហំនៃតារាង hash
- add(key, value) - ប្រសិនបើមានកូនសោររួចហើយ, ធ្វើបច្ចុប្បន្នភាពតម្លៃ
- exists(key)
- get(key)
- remove(key)
-
-
- Binary search (វីដេអូ)
- Binary search (វីដេអូ)
- លម្អិត
- អនុវត្ត៖
- Binary search (នៅលើជួរអារេនៃចំនួនគត់)
- Binary search ដោយប្រើការហៅខ្លួនឯង
-
- សន្លឹកជំនួយ Bits
- អ្នកគួរតែស្គាល់ អំណាច ២ ពី (២ ^ ១ ដល់ ២ ^ ១៦ និង ២ ^ ៣២)
- ទទួលបានការយល់ដឹងដ៏ល្អអំពីការរៀបចំBitsជាមួយ៖ &, |, ^, ~, >>, <<
- ពាក្យ
- ការណែនាំល្អ៖ ការធ្វើចលនាBits (វីដេអូ)](https://www.youtube.com/watch?v=7jkIUgLC29I)
- C ការបង្រៀនសរសេរកម្មវិធី ២-១០: ប្រតិបត្តិការ Bitwise (វីដេអូ)
- ការរៀបចំBits - [ ] ប្រតិបតិ្តការ Bitwise
- Bithacks
- The Bit Twiddler
- The Bit Twiddler Interactive
- Bit Hacks (វីដេអូ)
- 2s និង 1s បំពេញបន្ថែម
- រាប់សំណុំ bits
- វិធី ៤ យ៉ាងដើម្បីរាប់ប៊ីតជាសាមសិបប៊ីត (វីដេអូ)
- រាប់ប៊ីត
- [របៀបរាប់ចំនួនសំណុំប៊ីតក្នុងចំនួនគត់ ៣២ ប៊ីត](http://stackoverflow.com/questions/109023/how-to-count-the-number-of-set-bits-in-a-32-bit- ចំនួនគត់)
- ប្តូរតម្លៃ
- តម្លៃដាច់ខាត:
- សន្លឹកជំនួយ Bits
-
- ស៊េរី៖ ចំនុចសំខាន់ Trees (វីដេអូ)
- ស៊េរី៖ Trees (វីដេអូ)
- ការសាងសង់ tree
- ការឆ្លងកាត់ tree
- ក្បួនដោះស្រាយ
- BFS(breadth-first search) និង DFS(depth-first search) (វីដេអូ)
- កំណត់សំគាល់របស់ BFS:
- level order (BFS, ដោយប្រេី queue)
- ភាពស្មុគស្មាញពេលវេលា: O(n)
- ភាពស្មុគស្មាញនៃលំហ: ល្អបំផុត៖ O(1), អាក្រក់បំផុត៖ O(n/2)=O(n)
- DFS notes:
- ភាពស្មុគស្មាញពេលវេលា: O(n)
- ភាពស្មុគស្មាញនៃលំហ: ល្អបំផុត៖ O(log n) - មធ្យមកម្ពស់ tree អាក្រក់បំផុត៖ O(n)
- inorder (DFS: ឆ្វេង, ខ្លួនឯង, ស្តាំ)
- postorder (DFS: ឆ្វេង, ស្តាំ, ខ្លួនឯង)
- preorder (DFS: self, left, right)
- កំណត់សំគាល់របស់ BFS:
-
- ការពិនិត្យឡើងវិញ Binary Search Tree (វីដេអូ)
- ស៊េរី (វីដេអូ)
- ចាប់ផ្តើមជាមួយតារាងនិមិត្តសញ្ញាហើយឆ្លងកាត់ការអនុវត្ត BST
- សេចក្តីផ្តើម (វីដេអូ)
- MIT (វីដេអូ)
- C/C++:
- Binary search tree - ការអនុវត្តក្នុង C/C++ (វីដេអូ)
- BST ការអនុវត្តក្នុង - ការបែងចែក memory ក្នុង stack និង heap (វីដេអូ)
- ស្វែងរកធាតុតូចបំផុត និង ធំបំផុតនៅក្នុង binary search tree (វីដេអូ)
- រកកំពស់ binary tree (វីដេអូ)
- Binary tree traversal - យុទ្ធសាស្ត្រ breadth-first និង depth-first (វីដេអូ)
- Binary tree: Level Order Traversal (វីដេអូ)
- Binary tree traversal: Preorder, Inorder, Postorder (វីដេអូ)
- ពិនិត្យមើលថាតើ binary tree គឺ binary search tree រឺទេ (វីដេអូ)
- លុបធាតុពី Binary Search Tree (វីដេអូ)
- Inorder Successor ក្នុង binary search tree មួយ (video)
- ការអនុវត្ត:
- insert // ដាក់ធាតុក្នុង tree
- get_node_count // ទទួលចំនួនធាតុដែលផ្ទុក
- print_values // បង្ហាញតម្លៃក្នុង tree, ពី តូច ទៅ ធំ
- delete_tree
- is_in_tree // ត្រឡប់វិញ ពិត ប្រសិនបេីតម្លៃក្នុង tree
- get_height // ត្រឡប់វិញ កំពស់ក្នុង nodes (កំពស់ single node គឺ 1)
- get_min // ត្រឡប់វិញ ធាតុតូចជាងគេ
- get_max // ត្រឡប់វិញ ធាតុធំជាងគេ
- is_binary_search_tree
- delete_value
- get_successor // ត្រឡប់តម្លៃខ្ពស់បំផុតបន្ទាប់នៅក្នុងtreeបន្ទាប់ពីតម្លៃដែលបានផ្ដល់ ៕ បើគ្មានត្រឡប់ -1
-
- visualized as a tree, but is usually linear in storage (array, linked list)
- Heap
- សេចក្តីផ្តើម (វីដេអូ)
- ការអនុវត្តដំបូង (វីដេអូ)
- Binary Trees (វីដេអូ)
- កំពស់ Tree (វីដេអូ)
- ប្រតិបត្តិការមូលដ្ឋាន (វីដេអូ)
- Binary Trees ពេញលេញ (វីដេអូ)
- Pseudocode (វីដេអូ)
- Heap Sort - លោតដើម្បីចាប់ផ្ដើម (វីដេអូ)
- Heap Sort (វីដេអូ)
- ការកសាង heap (វីដេអូ)
- MIT: Heaps និង Heap Sort (វីដេអូ)
- CS 61B មេរៀន 24: Priority Queues (វីដេអូ)
- Linear Time BuildHeap (max-heap)
- ការអនុវត្ត max-heap:
- insert
- sift_up - ត្រូវការសំរាប់បញ្ចូល
- get_max - ត្រឡប់ធាតុអតិបរិមាដោយមិនយកវាចេញ
- get_size() - ត្រឡប់ចំនួននៃធាតុដែលបានរក្សាទុក
- is_empty() - ត្រឡប់ពិតប្រសិនបើ heap មិនមានធាតុ
- extract_max - ត្រឡប់ធាតុអតិបរិមាយកវាចេញ
- sift_down - ត្រូវការសំរាប់ extract_max
- remove(i) - យកធាតុចេញនៅ index x
- heapify - បង្កើតheap ពីធាតុជាច្រើនដែលត្រូវការសម្រាប់ heap_sort
- heap_sort() - យកarray ដែលមិនបានតម្រៀបហើយប្រែក្លាយវាទៅជាកន្លែងដែលបានតម្រៀបតាមកន្លែងដោយប្រើheapអតិបរមា។ t
- ចំណាំ៖ ការប្រើ heap តូច ជំនួសនឹងជួយសន្សំប្រតិបត្តិការ ប៉ុន្តែត្រូវការទំហំទ្វេដង (មិនអាចធ្វើនៅនឹងកន្លែង) ។
-
កំណត់សំគាល់:
- អនុវត្ត sorts និងដឹងពីករណីដែលល្អ និង ដែលអាក្រក់, ភាពស្មុគស្មាញជាមធ្យមនីមួយៗ:
- កុំប្រេី bubble sort - វាមិនល្អ - O(n^2), លុះត្រាតែ n <= 16
- ស្ថេរភាពក្នុងក្បួនដោះស្រាយ sorting ("តើ Quicksort មានស្ថេរភាពឬ?")
- តើក្បួនដោះស្រាយអ្វីខ្លះអាចត្រូវបានប្រើ linked lists? អាចត្រូវបានប្រើ arrays? អាចត្រូវបានប្រើទាំងពីរ?
- ខ្ញុំនឹងមិនណែនាំឱ្យ Sort ជាមួយ linked list ប៉ុន្តែអាចប្រេី Merge Sort។
- Merge Sort សំរាប់ Linked List
- អនុវត្ត sorts និងដឹងពីករណីដែលល្អ និង ដែលអាក្រក់, ភាពស្មុគស្មាញជាមធ្យមនីមួយៗ:
-
សំរាប់ heapsort, សូមមេីល Heap data structure ខាងលេី. Heap sort គឺល្អ, ប៉ុន្តែមិនមានស្ថេរភាពទេ.
-
UC Berkeley:
-
កូដ Merge sort:
-
កូដ Quick sort:
-
អនុវត្ត:
- Mergesort: O(n log n) ករណីមធ្យម និង អាក្រក់បំផុត
- Quicksort O(n log n) ករណីមធ្យម
- Selection sort និង insertion sort ទាំងពីរគឺ O(n^2) សំរាប់ករណីមធ្យម និង អាក្រក់បំផុត
- ចំពោះ heapsort, សូមមេីល Heap data structure ខាងលេី.
-
មិនចាំបាច់ទេ ប៉ុន្តែខ្ញុំសូមណែនាំពួកគេ:
ជាការសង្ខេបនេះគឺជាការបង្ហាញជាក់ស្តែងនៃ ១៥ វិធីដោះស្រាយ Sorting ។ ប្រសិនបើអ្នកត្រូវការព័ត៌មានលម្អិតបន្ថែមលើប្រធានបទនេះសូមមើលផ្នែក "Sorting" នៅក្នុង ព័ត៌មានលំអិតលើប្រធានបទមួយចំនួន
Graphs អាចត្រូវបានប្រើដើម្បីបង្ហាញពីបញ្ហាជាច្រើននៅក្នុងវិទ្យាសាស្ត្រកុំព្យូទ័រ ដូចជា Trees និង Sorting។
-
កំណត់ចំណាំ:
- មានវិធីជាមូលដ្ឋានចំនួន ៤ ដើម្បីតំណាង graph ក្នុង memory:
- objects និង pointers
- adjacency matrix
- adjacency list
- adjacency map
- ស្គាល់ខ្លួនឯងជាមួយនឹង Graphs និង គុណសម្បត្តិនិងគុណវិបត្តិរបស់វា
- BFS និង DFS - ដឹងពីភាពស្មុគស្មាញក្នុងការគណនាការជួញដូររបស់ពួកគេ និង វិធីអនុវត្តកូដពិតប្រាកដ
- នៅពេលសួរសំណួរសូមស្វែងរកដំណោះស្រាយដែលមានមូលដ្ឋានលើ Graphs ជាមុនសិនបន្ទាប់មកបន្តទៅមុខទៀតប្រសិនបើគ្មាន។
- មានវិធីជាមូលដ្ឋានចំនួន ៤ ដើម្បីតំណាង graph ក្នុង memory:
-
MIT(វីដេអូ):
-
ការបង្រៀន Skiena - ការណែនាំ:
- CSE373 2012 - មេរៀនទី 11 - Graph Data Structures (វីដេអូ)
- CSE373 2012 - មេរៀនទី 12 - Breadth-First Search (វីដេអូ)
- CSE373 2012 - មេរៀនទី 13 - Graph Algorithms (វីដេអូ)
- CSE373 2012 - មេរៀនទី 14 - Graph Algorithms (បន្ត) (វីដេអូ)
- CSE373 2012 - មេរៀនទី 15 - Graph Algorithms (បន្ត 2) (វីដេអូ)
- CSE373 2012 - មេរៀនទី 16 - Graph Algorithms (បន្ត 3) (វីដេអូ)
-
Graphs (ពិនិត្យឡើងវិញ និង ច្រើនទៀត):
- 6.006 Single-Source Shortest Paths Problem (វីដេអូ)
- 6.006 Dijkstra (វីដេអូ)
- 6.006 Bellman-Ford (វីដេអូ)
- 6.006 Speeding Up Dijkstra (វីដេអូ)
- Aduni: Graph Algorithms I - Topological Sorting, Minimum Spanning Trees, Prim's Algorithm - មេរៀនទី 6 (វីដេអូ)
- Aduni: Graph Algorithms II - DFS, BFS, Kruskal's Algorithm, Union Find Data Structure - មេរៀនទី 7 (វីដេអូ)
- Aduni: Graph Algorithms III: Shortest Path - មេរៀនទី 8 (វីដេអូ)
- Aduni: Graph Alg. IV: Intro to geometric algorithms - មេរៀនទី 9 (វីដេអូ)
-
CS 61B 2014 (starting at 58:09) (វីដេអូ) - CS 61B 2014: Weighted graphs (វីដេអូ)
- Greedy Algorithms: Minimum Spanning Tree (វីដេអូ)
- Strongly Connected Components Kosaraju's Algorithm Graph Algorithm (វីដេអូ)
-
វគ្គសិក្សា Coursera:
-
ខ្ញុំនឹងអនុវត្ត:
- DFS ជាមួយ adjacency list (recursive)
- DFS ជាមួយ adjacency list (iterative with stack)
- DFS ជាមួយ adjacency matrix (recursive)
- DFS ជាមួយ adjacency matrix (iterative with stack)
- BFS ជាមួយ adjacency list
- BFS ជាមួយ adjacency matrix
- single-source shortest path (Dijkstra)
- minimum spanning tree
- DFS-based algorithms (សូមមេីល Aduni វីដេអូ ខាងលេី):
- ពិនិត្យ cycle (ត្រូវការសំរាប់ topological sort ព្រោះយើងនឹងពិនិត្យមើលវដ្តមុនពេលចាប់ផ្តើម)
- topological sort
- រាប់សមាសធាតុដែលបានភ្ជាប់នៅក្នុងក្រាហ្វ
- រាយសមាសធាតុដែលភ្ជាប់គ្នាយ៉ាងខ្លាំង
- ពិនិត្យក្រាហ្វិច bipartite
-
- ការបង្រៀនរបស់ Stanford លេី recursion និង backtracking:
- នៅពេលដែលសមរម្យដើម្បីប្រើវា
- តេី tail recursion ប្រសើរជាងអត់?
-
- អ្នកប្រហែលជាមិនឃើញមានបញ្ហានៃការសរសេរកម្មវិធី dynamic programming នៅក្នុងបទសម្ភាសន៍របស់អ្នកទេ ប៉ុន្តែវាសមនឹងទទួលបានការទទួលស្គាល់នូវបញ្ហាមួយក្នុងនាមជាបេក្ខជនសម្រាប់ការសរសេរកម្មវិធី dynamic programming។
- ប្រធានបទនេះអាចជាការពិបាកណាស់, ព្រោះថាបញ្ហារបស់ DP នីមួយៗត្រូវបានកំណត់ថាជាការទាក់ទងគ្នា
- ខ្ញុំស្នើឱ្យក្រឡេកមើលឧទាហរណ៍ជាច្រើននៃបញ្ហា DP រហូតទាល់តែអ្នកមានការយល់ដឹងច្បាស់អំពីគំរូដែលពាក់ព័ន្ធ។
- វីដេអូ:
- វីដេអូ Skiena អាចពិបាកធ្វើតាមព្រោះពេលខ្លះគាត់ប្រើក្តារខៀនដែលវាមើលមិនឃើញ
- Skiena: CSE373 2012 - មេរៀនទី 19 - ការណែនាំអំពី Dynamic Programming (វីដេអូ)
- Skiena: CSE373 2012 - មេរៀនទី 20 - Edit Distance (video)
- Skiena: CSE373 2012 - មេរៀនទី 21 - ឧទាហរណ៍ Dynamic Programming (វីដេអូ)
- Skiena: CSE373 2012 - មេរៀនទី 22 - ការអនុវត្តកម្មវិធី Dynamic Programming (វីដេអូ)
- Simonson: Dynamic Programming 0 (ចាប់ផ្តេីមពី 59:18) (វីដេអូ)
- Simonson: Dynamic Programming I - មេរៀនទី 11 (វីដេអូ)
- Simonson: Dynamic programming II - មេរៀនទី 12 (វីដេអូ)
- បញ្ជីបញ្ហារបស់ DP (នីមួយៗខ្លី): Dynamic Programming (វីដេអូ)
- Yale Lecture notes:
- Coursera: