เดิมทีฉันสร้างสิ่งนี้ขึ้นมาเป็นรายการหัวข้อการศึกษาสั้นๆ สำหรับการเป็นวิศวกรซอฟต์แวร์ แต่กลับกลายเป็นรายการใหญ่ที่คุณเห็นในปัจจุบัน หลังจากศึกษาตามแผนการศึกษานี้แล้ว ฉันก็ได้รับการว่าจ้างให้เป็น Software Development Engineer ที่ Amazon! คุณอาจจะไม่ต้องเรียนมากเหมือนฉัน อย่างไรก็ตาม ทุกสิ่งที่คุณต้องการอยู่ที่นี่แล้ว
ฉันเรียนประมาณ 8-12 ชั่วโมงต่อวันเป็นเวลาหลายเดือน นี่คือเรื่องราวของฉัน: เหตุใดฉันจึงเรียนเต็มเวลาเป็นเวลา 8 เดือนเพื่อสัมภาษณ์กับ Google
โปรดทราบ: คุณไม่จำเป็นต้องเรียนมากเท่าฉัน ฉันเสียเวลาไปมากกับสิ่งที่ฉันไม่จำเป็นต้องรู้ ข้อมูลเพิ่มเติมเกี่ยวกับสิ่งนั้นอยู่ด้านล่าง ฉันจะช่วยให้คุณไปถึงที่นั่นโดยไม่เสียเวลาอันมีค่าของคุณ
รายการที่ระบุไว้ในที่นี้จะเตรียมคุณให้พร้อมสำหรับการสัมภาษณ์ทางเทคนิคที่บริษัทซอฟต์แวร์เกือบทุกแห่ง รวมถึงยักษ์ใหญ่อย่าง Amazon, Facebook, Google และ Microsoft
ขอให้โชคดีกับคุณ!
บาฮาซาอินโดนีเซีย
บัลแกเรีย
สเปน
เยอรมัน
ญี่ปุ่น (日本語)
ภาษามราฐี
ขัด
โปรตุเกส บราซิลเลียโร
ภาษารัสเซีย
TiếngViết - เวียดนาม
ภาษาอูรดู - اردو
อุซเบก
বাংলা - บังคลา
ខមែរ - เขมร
简体中文
繁體中文
ชาวแอฟริกัน
ภาษาอาหรับ
ภาษาฝรั่งเศส
กรีก
ภาษาอิตาลี
เกาหลี(เกาหลี)
มาลายาลัม
เปอร์เซีย - ฟาร์ซี
เตลูกู
แบบไทย
ภาษาตุรกี
Укра́ська
עברית
हिन्दी
ร่วมเป็นผู้สนับสนุน และสนับสนุน Coding Interview University!
นี่คือแผนการศึกษาหลายเดือนของฉันสำหรับการเป็นวิศวกรซอฟต์แวร์ให้กับบริษัทขนาดใหญ่
ที่จำเป็น:
มีประสบการณ์เล็กน้อยเกี่ยวกับการเขียนโค้ด (ตัวแปร ลูป วิธีการ/ฟังก์ชัน ฯลฯ)
ความอดทน
เวลา
โปรดทราบว่านี่คือแผนการศึกษาสำหรับ วิศวกรรมซอฟต์แวร์ ไม่ใช่วิศวกรรมส่วนหน้าหรือการพัฒนาแบบฟูลสแตก มีโรดแมปและหลักสูตรที่ยอดเยี่ยมจริงๆ สำหรับเส้นทางอาชีพเหล่านั้นในที่อื่นๆ (ดู https://roadmap.sh/ สำหรับข้อมูลเพิ่มเติม)
มีหลายสิ่งที่ต้องเรียนรู้ในหลักสูตรวิทยาการคอมพิวเตอร์ของมหาวิทยาลัย แต่การรู้เพียง 75% เท่านั้นก็เพียงพอสำหรับการสัมภาษณ์ ดังนั้นนั่นคือสิ่งที่ฉันจะกล่าวถึงที่นี่ สำหรับโปรแกรมที่สอนด้วยตนเองด้านวิทยาการคอมพิวเตอร์ที่สมบูรณ์ ทรัพยากรสำหรับแผนการศึกษาของฉันได้รวมอยู่ในแผนการทำงานด้านวิทยาการคอมพิวเตอร์ของ Kamran Ahmed: https://roadmap.sh/computer-science
มันคืออะไร?
ทำไมต้องใช้มัน?
วิธีการใช้งาน
อย่ารู้สึกว่าคุณไม่ฉลาดพอ
หมายเหตุเกี่ยวกับทรัพยากรวิดีโอ
เลือกภาษาการเขียนโปรแกรม
หนังสือเกี่ยวกับโครงสร้างข้อมูลและอัลกอริทึม
หนังสือเตรียมสอบสัมภาษณ์
อย่าทำผิดของฉัน
สิ่งที่คุณจะไม่เห็นครอบคลุม
แผนรายวัน
แบบฝึกหัดคำถามการเข้ารหัส
ปัญหาการเข้ารหัส
ความซับซ้อนของอัลกอริทึม / Big-O / การวิเคราะห์เชิงกำกับ
โครงสร้างข้อมูล
อาร์เรย์
รายการที่เชื่อมโยง
สแต็ค
คิว
ตารางแฮช
ความรู้เพิ่มเติม
การค้นหาแบบไบนารี
การดำเนินการระดับบิต
ต้นไม้
ต้นไม้ - บทนำ
แผนผังการค้นหาแบบไบนารี: BST
ฮีป / คิวลำดับความสำคัญ / ฮีปไบนารี
แผนผังการค้นหาที่สมดุล (แนวคิดทั่วไป ไม่ใช่รายละเอียด)
การข้ามผ่าน: การสั่งซื้อล่วงหน้า, การสั่งซื้อ, การสั่งซื้อภายหลัง, BFS, DFS
การเรียงลำดับ
การเลือก
การแทรก
ฮีปเรียงลำดับ
การเรียงลำดับอย่างรวดเร็ว
การผสาน
กราฟ
กำกับ
ไม่ได้กำหนดทิศทาง
เมทริกซ์ที่อยู่ติดกัน
รายการที่อยู่ติดกัน
การเดินทาง: BFS, DFS
ความรู้เพิ่มเติมอีกด้วย
การเรียกซ้ำ
การเขียนโปรแกรมแบบไดนามิก
รูปแบบการออกแบบ
Combinatorics (n เลือก k) และความน่าจะเป็น
NP, NP-Complete และการประมาณอัลกอริธึม
คอมพิวเตอร์ประมวลผลโปรแกรมอย่างไร
แคช
กระบวนการและเธรด
การทดสอบ
การค้นหาสตริงและการจัดการ
พยายาม
หมายเลขจุดลอยตัว
ยูนิโค้ด
ความเอนเดียนเนส
เครือข่าย
รีวิวครั้งสุดท้าย
อัปเดตเรซูเม่ของคุณ
หางาน
กระบวนการสัมภาษณ์และการเตรียมการสัมภาษณ์ทั่วไป
คิดถึงเมื่อการสัมภาษณ์มาถึง
มีคำถามสำหรับผู้สัมภาษณ์
เมื่อคุณได้งานแล้ว
---------------- ทุกอย่างที่อยู่ด้านล่างจุดนี้เป็นทางเลือก ----------------
หนังสือเพิ่มเติม
การออกแบบระบบ ความสามารถในการปรับขนาด การจัดการข้อมูล (หากคุณมีประสบการณ์ 4 ปีขึ้นไป)
การเรียนรู้เพิ่มเติม
ต้นไม้เอวีแอล
พ่นต้นไม้
ต้นไม้สีแดง/ดำ
ต้นไม้ค้นหา 2-3 ต้น
2-3-4 ต้น (หรือที่เรียกว่า 2-4 ต้น)
ต้นไม้ N-ary (K-ary, M-ary)
บี-ทรีส์
คอมไพเลอร์
Emacs และ vi(m)
เครื่องมือบรรทัดคำสั่ง Unix
ทฤษฎีสารสนเทศ
ความเท่าเทียมกันและรหัส Hamming
เอนโทรปี
การเข้ารหัส
การบีบอัด
ความปลอดภัยของคอมพิวเตอร์
เก็บขยะ
การเขียนโปรแกรมแบบขนาน
ระบบการส่งข้อความ การทำให้เป็นอนุกรม และการจัดคิว
เอ*
การแปลงฟูเรียร์เร็ว
ฟิลเตอร์บลูม
HyperLogLog
การแฮชที่ละเอียดอ่อนต่อท้องถิ่น
ต้นแวน เอ็มเด โบอาส
โครงสร้างข้อมูลเสริม
ต้นไม้การค้นหาที่สมดุล
เคดี ทรีส์
ข้ามรายการ
การไหลของเครือข่าย
ชุดที่ไม่ต่อเนื่องและการค้นหายูเนี่ยน
คณิตศาสตร์เพื่อการประมวลผลที่รวดเร็ว
ทรีป
การเขียนโปรแกรมเชิงเส้น
เรขาคณิต, ตัวถังนูน
คณิตศาสตร์แบบไม่ต่อเนื่อง
รายละเอียดเพิ่มเติมในบางวิชา
ซีรีย์วิดีโอ
หลักสูตรวิทยาการคอมพิวเตอร์
เอกสาร
หากคุณต้องการทำงานเป็นวิศวกรซอฟต์แวร์ให้กับบริษัทขนาดใหญ่ นี่คือสิ่งที่คุณต้องรู้
หากคุณพลาดปริญญาสาขาวิทยาการคอมพิวเตอร์เหมือนฉัน สิ่งนี้จะช่วยคุณและช่วยชีวิตคุณได้สี่ปี
เมื่อฉันเริ่มโปรเจ็กต์นี้ ฉันไม่รู้สแต็กจากฮีป ไม่รู้อะไรเลยเกี่ยวกับ Big-O หรืออะไรเกี่ยวกับต้นไม้ หรือวิธีสำรวจกราฟ ถ้าฉันต้องเขียนโค้ดอัลกอริธึมการเรียงลำดับ ฉันบอกได้เลยว่ามันแย่มาก โครงสร้างข้อมูลทุกอย่างที่ฉันเคยใช้ถูกสร้างขึ้นเป็นภาษา และฉันไม่รู้ว่ามันทำงานอย่างไรภายใต้ประทุนเลย ฉันไม่เคยต้องจัดการหน่วยความจำ เว้นแต่กระบวนการที่ฉันกำลังดำเนินการอยู่จะมีข้อผิดพลาด "หน่วยความจำไม่เพียงพอ" จากนั้นฉันก็ต้องหาวิธีแก้ปัญหา ในชีวิตของฉันฉันใช้อาเรย์หลายมิติและอาเรย์เชื่อมโยงนับพัน แต่ฉันไม่เคยสร้างโครงสร้างข้อมูลตั้งแต่เริ่มต้น
มันเป็นแผนระยะยาว อาจใช้เวลาหลายเดือน หากคุณคุ้นเคยกับสิ่งนี้มามากแล้ว คุณจะใช้เวลาน้อยลงมาก
⬆ กลับไปด้านบน
ทุกอย่างด้านล่างนี้เป็นเพียงโครงร่าง และคุณควรจัดการรายการต่างๆ ตามลำดับจากบนลงล่าง
ฉันใช้คุณลักษณะพิเศษของ GitHub รวมถึงรายการงานเพื่อติดตามความคืบหน้า
ข้อมูลเพิ่มเติมเกี่ยวกับมาร์กดาวน์รส GitHub
ในหน้านี้ คลิกปุ่มรหัสใกล้ด้านบน จากนั้นคลิก "ดาวน์โหลด ZIP" แตกไฟล์และคุณสามารถทำงานกับไฟล์ข้อความได้
หากคุณเปิดด้วยโปรแกรมแก้ไขโค้ดที่เข้าใจมาร์กดาวน์ คุณจะเห็นทุกสิ่งมีรูปแบบที่สวยงาม
สร้างสาขาใหม่เพื่อให้คุณสามารถตรวจสอบรายการเช่นนี้ เพียงใส่ x ไว้ในวงเล็บ: [x]
แยก repo GitHub: https://github.com/jwasham/coding-interview-university
โดยคลิกที่ปุ่ม Fork
โคลนไปยัง repo ในพื้นที่ของคุณ:
โคลน git https://github.com/<YOUR_GITHUB_USERNAME>/coding-interview-university.gitcd coding-interview-university git ระยะไกลเพิ่มอัปสตรีม https://github.com/jwasham/coding-interview-university.git git remote set-url --push upstream DISABLE # เพื่อที่คุณจะได้ไม่ผลักดันความคืบหน้าส่วนตัวของคุณกลับไปเป็น repo ดั้งเดิม
ทำเครื่องหมายทุกช่องด้วย X หลังจากที่คุณทำการเปลี่ยนแปลงเสร็จแล้ว:
git commit -am "ทำเครื่องหมายความคืบหน้าส่วนบุคคล" git pull upstream main # ทำให้ fork ของคุณทันสมัยอยู่เสมอด้วยการเปลี่ยนแปลงจาก repogit ดั้งเดิม push # เพียงแค่กดไปที่ fork ของคุณ
⬆ กลับไปด้านบน
วิศวกรซอฟต์แวร์ที่ประสบความสำเร็จนั้นฉลาด แต่หลายคนกลับไม่มั่นใจว่าตนไม่ฉลาดพอ
วิดีโอต่อไปนี้อาจช่วยให้คุณเอาชนะความไม่มั่นคงนี้ได้:
ตำนานของโปรแกรมเมอร์อัจฉริยะ
การอยู่คนเดียวมันอันตราย: การต่อสู้กับสัตว์ประหลาดที่มองไม่เห็นในเทคโนโลยี
⬆ กลับไปด้านบน
วิดีโอบางรายการสามารถดูได้เฉพาะเมื่อลงทะเบียนในชั้นเรียน Coursera หรือ EdX เท่านั้น สิ่งเหล่านี้เรียกว่า MOOC บางครั้งชั้นเรียนไม่อยู่ในภาคเรียน ดังนั้นคุณต้องรอสองสามเดือนจึงเข้าไม่ได้
เป็นการดีที่จะแทนที่แหล่งข้อมูลของหลักสูตรออนไลน์ด้วยแหล่งข้อมูลสาธารณะที่ให้บริการฟรีและพร้อมใช้งานตลอดเวลา เช่น วิดีโอ YouTube (ควรเป็นการบรรยายในมหาวิทยาลัย) เพื่อให้ผู้คนของคุณสามารถศึกษาสิ่งเหล่านี้ได้ตลอดเวลา ไม่ใช่แค่เฉพาะในช่วงที่มีหลักสูตรออนไลน์เฉพาะเจาะจงเท่านั้น
⬆ กลับไปด้านบน
คุณจะต้องเลือกภาษาการเขียนโปรแกรมสำหรับการสัมภาษณ์การเขียนโค้ด แต่คุณจะต้องค้นหาภาษาที่คุณสามารถใช้ศึกษาแนวคิดด้านวิทยาการคอมพิวเตอร์ด้วย
ควรเป็นภาษาเดียวกัน ดังนั้นคุณจะต้องมีความเชี่ยวชาญเพียงภาษาเดียวเท่านั้น
ตอนที่ฉันทำแผนการเรียน ฉันใช้ 2 ภาษาเป็นส่วนใหญ่: C และ Python
C: ระดับต่ำมาก ช่วยให้คุณจัดการกับพอยน์เตอร์และการจัดสรร/จัดสรรหน่วยความจำ เพื่อให้คุณรู้สึกถึงโครงสร้างข้อมูลและอัลกอริธึมในกระดูกของคุณ ในภาษาระดับสูงเช่น Python หรือ Java ภาษาเหล่านี้จะถูกซ่อนไว้จากคุณ ในการทำงานในแต่ละวันนั้นยอดเยี่ยมมาก แต่เมื่อคุณเรียนรู้ว่าโครงสร้างข้อมูลระดับต่ำเหล่านี้ถูกสร้างขึ้นอย่างไร คุณจะรู้สึกใกล้ชิดกับโลหะเป็นอย่างมาก
นี่เป็นหนังสือขนาดสั้น แต่จะช่วยให้คุณเข้าใจภาษา C ได้เป็นอย่างดี และหากคุณฝึกฝนเพียงเล็กน้อย คุณจะเชี่ยวชาญได้อย่างรวดเร็ว การทำความเข้าใจภาษา C ช่วยให้คุณเข้าใจวิธีการทำงานของโปรแกรมและหน่วยความจำ
คุณไม่จำเป็นต้องลงลึกในหนังสือมากนัก (หรืออ่านให้จบด้วยซ้ำ) เพียงไปที่จุดที่คุณสบายใจในการอ่านและเขียนในภาษาซี
ซีมีอยู่ทุกที่ คุณจะเห็นตัวอย่างในหนังสือ การบรรยาย วิดีโอ ทุกที่ ในขณะที่คุณกำลังเรียน
ภาษาการเขียนโปรแกรม C รุ่นที่ 2
Python: ทันสมัยและแสดงออกได้ดีมาก ฉันได้เรียนรู้เพราะมันมีประโยชน์สุดๆ และยังช่วยให้ฉันเขียนโค้ดน้อยลงในการสัมภาษณ์อีกด้วย
นี่คือการตั้งค่าของฉัน คุณทำสิ่งที่คุณชอบแน่นอน
คุณอาจไม่จำเป็นต้องใช้ แต่นี่คือบางเว็บไซต์สำหรับการเรียนรู้ภาษาใหม่:
การออกกำลังกาย
โค้ดวอร์ส
แฮกเกอร์เอิร์ธ
หัวข้อ Scaler (Java, C++)
ความท้าทายของชุมชน Programiz PRO)
คุณสามารถใช้ภาษาที่คุณสะดวกเขียนโค้ดในการสัมภาษณ์ได้ แต่สำหรับบริษัทขนาดใหญ่ ตัวเลือกเหล่านี้เป็นทางเลือกที่ดี:
ซี++
ชวา
หลาม
คุณสามารถใช้สิ่งเหล่านี้ได้ แต่ควรอ่านให้ละเอียดก่อน อาจมีข้อแม้:
จาวาสคริปต์
ทับทิม
นี่คือบทความที่ฉันเขียนเกี่ยวกับการเลือกภาษาสำหรับการสัมภาษณ์: เลือกหนึ่งภาษาสำหรับการสัมภาษณ์การเขียนโค้ด นี่คือบทความต้นฉบับที่โพสต์ของฉันมีพื้นฐานมาจาก: การเลือกภาษาการเขียนโปรแกรมสำหรับการสัมภาษณ์
คุณต้องมีความสบายใจในการใช้ภาษาและมีความรู้
อ่านเพิ่มเติมเกี่ยวกับตัวเลือก:
เลือกภาษาที่เหมาะสมสำหรับการสัมภาษณ์การเขียนโค้ดของคุณ
ดูแหล่งข้อมูลเฉพาะภาษาได้ที่นี่
⬆ กลับไปด้านบน
หนังสือเล่มนี้จะสร้างรากฐานสำหรับวิทยาการคอมพิวเตอร์ของคุณ
เพียงเลือกหนึ่งรายการในภาษาที่คุณพอใจ คุณจะต้องอ่านและเขียนโค้ดเป็นจำนวนมาก
อัลกอริทึมใน C ส่วนที่ 1-5 (บันเดิล) ฉบับที่ 3
ความรู้พื้นฐาน โครงสร้างข้อมูล การเรียงลำดับ การค้นหา และอัลกอริธึมกราฟ
โครงสร้างข้อมูลและอัลกอริทึมใน Python
โดย Goodrich, Tamassia, Goldwasser
ฉันรักหนังสือเล่มนี้ มันครอบคลุมทุกอย่างและอีกมากมาย
รหัสหลาม
รายงานหนังสือที่เร่าร้อนของฉัน: https://startupnextdoor.com/book-report-data-structors-and-algorithms-in-python/
ทางเลือกของคุณ:
กู๊ดริช, ทามาสเซีย, โกลด์วาสเซอร์
โครงสร้างข้อมูลและอัลกอริทึมใน Java
เซดจ์วิคและเวย์น:
อัลกอริทึม I
อัลกอริทึม II
อัลกอริทึม
หลักสูตร Coursera ฟรีที่ครอบคลุมหนังสือ (สอนโดยผู้เขียน!):
ทางเลือกของคุณ:
กู๊ดริช ทามาสเซีย และเมาท์
โครงสร้างข้อมูลและอัลกอริทึมใน C ++ รุ่นที่ 2
เซดจ์วิคและเวย์น
อัลกอริทึมในภาษา C++ ส่วนที่ 1-4: ความรู้พื้นฐาน โครงสร้างข้อมูล การเรียงลำดับ การค้นหา
อัลกอริทึมใน C ++ ตอนที่ 5: อัลกอริทึมกราฟ
⬆ กลับไปด้านบน
คุณไม่จำเป็นต้องซื้อสิ่งเหล่านี้มากมาย พูดตามตรงว่า "การแคร็กการสัมภาษณ์การเขียนโค้ด" อาจจะเพียงพอแล้ว แต่ฉันซื้อเพิ่มเพื่อฝึกฝนตัวเองให้มากขึ้น แต่ฉันมักจะทำมากเกินไป
ฉันซื้อทั้งสองอย่าง พวกเขาให้ฉันฝึกฝนมากมาย
การสัมภาษณ์การเขียนโปรแกรมที่เปิดเผย: การเขียนโค้ดผ่านการสัมภาษณ์ ฉบับที่ 4
คำตอบในภาษา C++ และ Java
นี่เป็นการอุ่นเครื่องที่ดีสำหรับ Cracking the Coding Interview
ไม่ยากเกินไป ปัญหาส่วนใหญ่อาจจะง่ายกว่าที่เจอในการสัมภาษณ์ (จากที่อ่านมา)
ถอดรหัสบทสัมภาษณ์การเขียนโค้ด ฉบับที่ 6
คำตอบใน Java
เลือกหนึ่งรายการ:
องค์ประกอบของการสัมภาษณ์การเขียนโปรแกรม (เวอร์ชัน C++)
องค์ประกอบของการสัมภาษณ์การเขียนโปรแกรมใน Python
องค์ประกอบของการสัมภาษณ์การเขียนโปรแกรม (เวอร์ชัน Java) - โครงการร่วม - Stub วิธีและกรณีทดสอบสำหรับทุกปัญหาในหนังสือ
⬆ กลับไปด้านบน
รายการนี้เติบโตขึ้นในช่วงหลายเดือน และใช่ มันล้นมือแล้ว
นี่คือข้อผิดพลาดที่ฉันทำเพื่อให้คุณได้รับประสบการณ์ที่ดีขึ้น และคุณจะประหยัดเวลาได้หลายเดือน
ฉันดูวิดีโอหลายชั่วโมงและจดบันทึกมากมาย และหลายเดือนต่อมาก็มีหลายอย่างที่ฉันจำไม่ได้ ฉันใช้เวลา 3 วันในการทบทวนบันทึกและทำแฟลชการ์ด เพื่อจะได้ทบทวนได้ ฉันไม่ต้องการความรู้ทั้งหมดนั้น
โปรดอ่านเพื่อที่คุณจะได้ไม่ทำผิดพลาด:
การรักษาความรู้ด้านวิทยาการคอมพิวเตอร์
เพื่อแก้ปัญหานี้ ฉันได้สร้างไซต์แฟลชการ์ดเล็กๆ ขึ้นมาซึ่งฉันสามารถเพิ่มแฟลชการ์ดได้ 2 ประเภท ได้แก่ แบบทั่วไปและโค้ด การ์ดแต่ละใบมีรูปแบบที่แตกต่างกัน ฉันสร้างเว็บไซต์ที่เน้นอุปกรณ์เคลื่อนที่เป็นอันดับแรก ดังนั้นฉันจึงสามารถรีวิวบนโทรศัพท์หรือแท็บเล็ตได้ทุกที่
สร้างของคุณเองฟรี:
ที่เก็บเว็บไซต์ Flashcards
ฉันไม่แนะนำให้ใช้แฟลชการ์ดของฉัน มีมากเกินไปและส่วนใหญ่เป็นเกร็ดความรู้ที่คุณไม่ต้องการ
แต่ถ้าคุณไม่อยากฟังฉัน คุณก็ไป:
ฐานข้อมูลแฟลชการ์ดของฉัน (1,200 ใบ):
ฐานข้อมูลแฟลชการ์ดของฉัน (การ์ดมาก - 1800 ใบ):
โปรดจำไว้ว่าฉันใช้งานมากเกินไปและมีการ์ดที่ครอบคลุมทุกอย่างตั้งแต่ภาษาแอสเซมบลีและความรู้เกี่ยวกับ Python ไปจนถึงการเรียนรู้ของเครื่องและสถิติ มันมากเกินไปสำหรับสิ่งที่จำเป็น
หมายเหตุเกี่ยวกับแฟลชการ์ด: ครั้งแรกที่คุณรู้ว่าคุณรู้คำตอบ อย่าทำเครื่องหมายว่ารู้คำตอบ คุณต้องดูไพ่ใบเดียวกันและตอบให้ถูกต้องหลายครั้งก่อนที่คุณจะรู้จริงๆ การทำซ้ำจะทำให้ความรู้นั้นลึกลงไปในสมองของคุณ
อีกทางเลือกหนึ่งนอกเหนือจากการใช้ไซต์ flashcard ของฉันคือ Anki ซึ่งได้รับการแนะนำให้กับฉันหลายครั้ง ใช้ระบบการทำซ้ำเพื่อช่วยให้คุณจดจำ ใช้งานง่าย ใช้ได้กับทุกแพลตฟอร์ม และมีระบบซิงค์บนคลาวด์ มีค่าใช้จ่าย 25 ดอลลาร์บน iOS แต่ฟรีบนแพลตฟอร์มอื่น
ฐานข้อมูล flashcard ของฉันในรูปแบบ Anki: https://ankiweb.net/shared/info/25173560 (ขอบคุณ @xiewenya)
นักเรียนบางคนกล่าวถึงปัญหาการจัดรูปแบบของช่องว่างซึ่งสามารถแก้ไขได้โดยทำดังนี้: เปิดสำรับ แก้ไขการ์ด คลิกการ์ด เลือกปุ่มตัวเลือก "สไตล์" และเพิ่มสมาชิก "white-space: pre;" ไปที่คลาสการ์ด
นี่เป็นสิ่งสำคัญมาก
เริ่มถามคำถามสัมภาษณ์การเขียนโค้ดในขณะที่คุณกำลังเรียนรู้โครงสร้างข้อมูลและอัลกอริธึม
คุณต้องใช้สิ่งที่คุณเรียนรู้มาแก้ปัญหา ไม่เช่นนั้นคุณจะลืม ฉันทำผิดพลาดนี้
เมื่อคุณได้เรียนรู้หัวข้อและรู้สึกสบายใจกับหัวข้อนั้นแล้ว เช่น รายการที่เชื่อมโยง :
เปิดหนังสือสัมภาษณ์การเขียนโค้ดเล่มใดเล่มหนึ่ง (หรือเว็บไซต์ปัญหาการเขียนโค้ดตามรายการด้านล่าง)
ทำคำถาม 2 หรือ 3 ข้อเกี่ยวกับรายการที่เชื่อมโยง
ไปยังหัวข้อการเรียนรู้ถัดไป
ต่อมา ให้ย้อนกลับไปแก้ไขปัญหา Linked List อีก 2 หรือ 3 ข้อ
ทำสิ่งนี้กับแต่ละหัวข้อใหม่ที่คุณเรียนรู้
ทำปัญหาต่อไปในขณะที่คุณกำลังเรียนรู้สิ่งเหล่านี้ ไม่ใช่หลังจากนั้น
คุณไม่ได้ถูกจ้างให้มีความรู้ แต่คุณถูกจ้างให้นำความรู้ไปใช้อย่างไร
มีแหล่งข้อมูลมากมายสำหรับสิ่งนี้ ดังรายการด้านล่าง ทำต่อไป.
มีเรื่องกวนใจมากมายที่อาจต้องใช้เวลาอันมีค่า สมาธิและสมาธิเป็นเรื่องยาก เปิดเพลงที่ไม่มีเนื้อเพลงแล้วคุณจะสามารถมีสมาธิได้ค่อนข้างดี
⬆ กลับไปด้านบน
เทคโนโลยีเหล่านี้เป็นเทคโนโลยีที่แพร่หลายแต่ไม่ได้เป็นส่วนหนึ่งของแผนการศึกษานี้:
จาวาสคริปต์
HTML, CSS และเทคโนโลยีส่วนหน้าอื่น ๆ
SQL
⬆ กลับไปด้านบน
หลักสูตรนี้ครอบคลุมหลายวิชา แต่ละครั้งอาจใช้เวลาสองสามวันหรืออาจเป็นสัปดาห์หรือมากกว่านั้น ขึ้นอยู่กับตารางเวลาของคุณ
ในแต่ละวัน ให้เรียนวิชาถัดไปในรายการ ดูวิดีโอเกี่ยวกับวิชานั้น จากนั้นเขียนการนำโครงสร้างข้อมูลหรืออัลกอริทึมไปใช้ในภาษาที่คุณเลือกสำหรับหลักสูตรนี้
คุณสามารถดูรหัสของฉันได้ที่นี่:
ค
ซี++
หลาม
คุณไม่จำเป็นต้องจดจำทุกอัลกอริทึม คุณเพียงแค่ต้องสามารถเข้าใจมันได้มากพอที่จะเขียนการใช้งานของคุณเองได้
⬆ กลับไปด้านบน
Why is this here? I'm not ready to interview.
แล้วกลับไปอ่านเรื่องนี้
ทำไมคุณต้องฝึกทำโจทย์ปัญหาการเขียนโปรแกรม:
การรับรู้ปัญหา และโครงสร้างข้อมูลและอัลกอริธึมที่ถูกต้องเหมาะสม
การรวบรวมข้อกำหนดสำหรับปัญหา
พูดคุยถึงปัญหาเช่นเดียวกับที่คุณทำในการสัมภาษณ์
การเขียนโค้ดบนไวท์บอร์ดหรือกระดาษ ไม่ใช่คอมพิวเตอร์
คำนึงถึงความซับซ้อนด้านเวลาและพื้นที่สำหรับโซลูชันของคุณ (ดู Big-O ด้านล่าง)
ทดสอบโซลูชันของคุณ
มีการแนะนำที่ดีสำหรับการแก้ปัญหาอย่างมีระเบียบวิธีและการสื่อสารในการสัมภาษณ์ คุณจะได้รับสิ่งนี้จากหนังสือสัมภาษณ์การเขียนโปรแกรมด้วย แต่ฉันพบว่าสิ่งนี้โดดเด่น: ผืนผ้าใบการออกแบบอัลกอริทึม
เขียนโค้ดบนไวท์บอร์ดหรือกระดาษ ไม่ใช่คอมพิวเตอร์ ทดสอบกับอินพุตตัวอย่างบางส่วน จากนั้นพิมพ์และทดสอบบนคอมพิวเตอร์
หากคุณไม่มีไวท์บอร์ดที่บ้าน ให้ไปซื้อกระดานวาดภาพขนาดใหญ่จากร้านขายงานศิลปะ คุณสามารถนั่งบนโซฟาและฝึกซ้อมได้ นี่คือ "โซฟาไวท์บอร์ด" ของฉัน ฉันเพิ่มปากกาในรูปภาพเพื่อขยายขนาดเท่านั้น หากคุณใช้ปากกา คุณจะอยากที่จะลบได้ เลอะเทอะอย่างรวดเร็ว ฉันใช้ดินสอและยางลบ
แบบฝึกหัดคำถามการเขียนโค้ดไม่ได้เกี่ยวกับการจำคำตอบของปัญหาการเขียนโปรแกรม
⬆ กลับไปด้านบน
อย่าลืมหนังสือสัมภาษณ์การเขียนโค้ดที่สำคัญของคุณที่นี่
การแก้ปัญหา:
จะหาทางแก้ไขได้อย่างไร
วิธีแยกคำชี้แจงปัญหาของ Topcoder
วิดีโอคำถามสัมภาษณ์การเข้ารหัส:
IDeserve (88 วิดีโอ)
Tushar Roy (5 เพลย์ลิสต์)
สุดยอดสำหรับคำแนะนำการแก้ปัญหา
Nick White - LeetCode Solutions (187 วิดีโอ)
คำอธิบายที่ดีของโซลูชันและโค้ด
คุณสามารถรับชมหลายรายการได้ในเวลาอันสั้น
FisherCoder - โซลูชั่น LeetCode
สถานที่ท้าทาย/ฝึกซ้อม:
ลีทโค้ด
ไซต์ปัญหาการเข้ารหัสที่ฉันชื่นชอบ คุ้มค่ากับการสมัครสมาชิกในช่วง 1-2 เดือนที่คุณน่าจะเตรียมการ
ดูวิดีโอของ Nick White และ FisherCoder ด้านบนเพื่อดูคำแนะนำเกี่ยวกับโค้ด
แฮกเกอร์แรงค์
ท็อปโคเดอร์
โค้ดฟอร์ซ
ความเป็นกันเอง
กี๊กสำหรับกี๊ก
อัลโกผู้เชี่ยวชาญ
สร้างโดยวิศวกรของ Google นี่เป็นแหล่งข้อมูลที่ดีเยี่ยมในการฝึกฝนทักษะของคุณ
โปรเจ็กต์ออยเลอร์
เน้นคณิตศาสตร์มาก และไม่เหมาะกับการสัมภาษณ์การเขียนโค้ดจริงๆ
⬆ กลับไปด้านบน
เอาล่ะ พูดพอแล้ว มาเรียนรู้กันดีกว่า!
แต่อย่าลืมทำโจทย์การเขียนโค้ดจากด้านบนในขณะที่คุณเรียนรู้!
ไม่ต้องดำเนินการใดๆ ที่นี่ คุณเพียงแค่ดูวิดีโอและจดบันทึก! เย้!
มีวิดีโอมากมายที่นี่ ดูให้พอเข้าใจก็พอ สามารถกลับมาทบทวนได้ตลอดเวลา
ไม่ต้องกังวลหากคุณไม่เข้าใจคณิตศาสตร์ทั้งหมดที่อยู่เบื้องหลัง
คุณเพียงแค่ต้องเข้าใจวิธีแสดงความซับซ้อนของอัลกอริทึมในแง่ของ Big-O
Harvard CS50 - สัญลักษณ์เชิงเส้นกำกับ (วิดีโอ)
Big O Notations (บทช่วยสอนด่วนทั่วไป) (วิดีโอ)
Big O Notation (และ Omega และ Theta) - คำอธิบายทางคณิตศาสตร์ที่ดีที่สุด (วิดีโอ)
สกีนา (วิดีโอ)
UC Berkeley Big O (วิดีโอ)
การวิเคราะห์ค่าตัดจำหน่าย (วิดีโอ)
TopCoder (รวมถึงความสัมพันธ์ที่เกิดซ้ำและทฤษฎีบทหลัก):
ความซับซ้อนในการคำนวณ: ส่วนที่ 1
ความซับซ้อนในการคำนวณ: ส่วนที่ 2
แผ่นโกง
[รีวิว] วิเคราะห์อัลกอริทึม (เพลย์ลิสต์) ใน 18 นาที (วิดีโอ)
เอาล่ะ แค่นั้นก็เพียงพอแล้ว
เมื่อคุณอ่าน "Cracking the Coding Interview" จะมีบทหนึ่งเกี่ยวกับเรื่องนี้ และในตอนท้ายจะมีแบบทดสอบเพื่อดูว่าคุณสามารถระบุรันไทม์ที่ซับซ้อนของอัลกอริทึมต่างๆ ได้หรือไม่ เป็นการทบทวนและทดสอบที่ยอดเยี่ยม
⬆ กลับไปด้านบน
ต่อเนื่องกันในหน่วยความจำ ความใกล้ชิดจึงช่วยเพิ่มประสิทธิภาพ
พื้นที่ที่ต้องการ = (ความจุของอาร์เรย์ซึ่งก็คือ >= n) * ขนาดของรายการ แต่ถึงแม้จะเป็น 2n ก็ยัง O(n)
O(1) เพื่อเพิ่ม/ลบเมื่อสิ้นสุด (ตัดจำหน่ายเพื่อจัดสรรพื้นที่เพิ่มเติม) จัดทำดัชนี หรืออัปเดต
O(n) เพื่อแทรก/ลบที่อื่น
ฝึกเขียนโค้ดโดยใช้อาร์เรย์และพอยน์เตอร์ และคณิตศาสตร์ของพอยน์เตอร์เพื่อข้ามไปยังดัชนีแทนที่จะใช้การทำดัชนี
อาร์เรย์ข้อมูลดิบใหม่พร้อมหน่วยความจำที่จัดสรร
ขนาด() - จำนวนรายการ
ความจุ() - จำนวนสิ่งของที่สามารถเก็บได้
is_empty()
at(index) - ส่งคืนไอเท็มตามดัชนีที่กำหนด จะระเบิดหากดัชนีอยู่นอกขอบเขต
ผลักดัน (รายการ)
insert(index, item) - แทรก item ที่ดัชนี เลื่อนค่าของดัชนีและองค์ประกอบต่อท้ายไปทางขวา
prepend(item) - สามารถใช้การแทรกด้านบนที่ดัชนี 0
pop() - ลบออกจากจุดสิ้นสุด ส่งคืนค่า
ลบ(ดัชนี) - ลบรายการที่ดัชนี โดยเลื่อนองค์ประกอบต่อท้ายทั้งหมดไปทางซ้าย
ลบ (รายการ) - ค้นหาค่าและลบดัชนีที่ถืออยู่ (แม้ว่าจะอยู่ในหลายแห่ง)
find(item) - ค้นหาค่าและส่งกลับดัชนีแรกที่มีค่านั้น -1 หากไม่พบ
ปรับขนาด (new_capacity) // ฟังก์ชั่นส่วนตัว
สามารถจัดสรร int array ภายใต้ประทุนได้ เพียงแต่ไม่ใช้ฟีเจอร์ของมัน
เริ่มต้นด้วย 16 หรือถ้าเลขเริ่มต้นมากกว่าให้ใช้เลขยกกำลัง 2 – 16, 32, 64, 128
เมื่อคุณถึงความจุแล้ว ให้ปรับขนาดเป็นสองเท่า
เมื่อเปิดรายการ หากขนาดคือ 1/4 ของความจุ ให้ปรับขนาดเป็นครึ่งหนึ่ง
อาร์เรย์ CS50 มหาวิทยาลัยฮาร์วาร์ด
อาร์เรย์ (วิดีโอ)
UC Berkeley CS61B - อาร์เรย์เชิงเส้นและหลายมิติ (วิดีโอ) (เริ่มรับชมจาก 15 นาที 32 วินาที)
อาร์เรย์แบบไดนามิก (วิดีโอ)
Jagged Arrays (วิดีโอ)
เกี่ยวกับอาร์เรย์:
ใช้เวกเตอร์ (อาร์เรย์ที่ไม่แน่นอนพร้อมการปรับขนาดอัตโนมัติ):
เวลา
ช่องว่าง
คำอธิบาย (วิดีโอ)
ไม่จำเป็นต้องปฏิบัติ
size() - ส่งคืนจำนวนองค์ประกอบข้อมูลในรายการ
ว่างเปล่า() - บูลคืนค่าจริงถ้าว่างเปล่า
value_at(index) - ส่งกลับค่าของรายการที่ n (เริ่มต้นที่ 0 สำหรับรายการแรก)
push_front(value) - เพิ่มรายการไปที่ด้านหน้าของรายการ
pop_front() - ลบรายการที่อยู่ข้างหน้าและส่งคืนค่า
push_back(value) - เพิ่มรายการต่อท้าย
pop_back() - ลบรายการสุดท้ายและส่งกลับค่าของมัน
front() - รับค่าของ front item
back() - รับค่าของรายการสุดท้าย
insert(index, value) - ใส่ค่าที่ดัชนี ดังนั้นรายการปัจจุบันที่ดัชนีนั้นจึงชี้ไปที่รายการใหม่ที่ดัชนี
ลบ (ดัชนี) - ลบโหนดตามดัชนีที่กำหนด
value_n_from_end(n) - ส่งกลับค่าของโหนดที่ตำแหน่งที่ n จากจุดสิ้นสุดของรายการ
Reverse() - ย้อนกลับรายการ
Remove_value(value) - ลบรายการแรกในรายการที่มีค่านี้
ตัวชี้ไปยังตัวชี้
รายการเชื่อมโยงหลักเทียบกับอาร์เรย์ (วิดีโอ)
ในรายการเชื่อมโยงในโลกแห่งความเป็นจริงกับอาร์เรย์ (วิดีโอ)
รายการที่เชื่อมโยง CS50 Harvard University - สิ่งนี้สร้างสัญชาตญาณ
รายการที่เชื่อมโยงเดี่ยว (วิดีโอ)
CS 61B - รายการที่เชื่อมโยง 1 (วิดีโอ)
CS 61B - รายการที่เชื่อมโยง 2 (วิดีโอ)
[รีวิว] ลิงค์ลิสต์ใน 4 นาที (วีดีโอ)
คำอธิบาย:
รหัส C (วิดีโอ) - ไม่ใช่วิดีโอทั้งหมด เป็นเพียงบางส่วนเกี่ยวกับโครงสร้างโหนดและการจัดสรรหน่วยความจำ
รายการที่เชื่อมโยงเทียบกับอาร์เรย์:
ทำไมคุณควรหลีกเลี่ยงรายการที่เชื่อมโยง (วิดีโอ)
Gotcha: คุณต้องมีความรู้เกี่ยวกับตัวชี้ต่อตัวชี้: (สำหรับเมื่อคุณส่งตัวชี้ไปยังฟังก์ชันที่อาจเปลี่ยนที่อยู่ซึ่งตัวชี้นั้นชี้) หน้านี้เป็นเพียงเพื่อให้เข้าใจถึง ptr ถึง ptr ฉันไม่แนะนำรูปแบบการสำรวจเส้นทางรายการนี้ ความสามารถในการอ่านและการบำรุงรักษาต้องทนทุกข์ทรมานจากความฉลาด
นำไปใช้ (ฉันทำกับตัวชี้หาง & ไม่มี):
รายการที่เชื่อมโยงแบบทวีคูณ
สแต็ค (วิดีโอ)
[รีวิว] ซ้อนใน 3 นาที (วิดีโอ)
จะไม่ปฏิบัติ การใช้งานอาเรย์นั้นเป็นเรื่องเล็กน้อย
การใช้งานที่ไม่ถูกต้องโดยใช้รายการที่เชื่อมโยงซึ่งคุณเข้าคิวที่ส่วนหัวและ dequeue ที่ส่วนท้ายจะเป็น O(n) เพราะคุณต้องการองค์ประกอบที่อยู่ถัดจากองค์ประกอบสุดท้าย ทำให้เกิดการข้ามผ่านแบบเต็มของแต่ละ dequeue
เข้าคิว: O(1) (ตัดจำหน่าย รายการลิงก์ และอาร์เรย์ [การตรวจสอบ])
dequeue: O(1) (รายการลิงก์และอาร์เรย์)
ว่างเปล่า: O(1) (รายการลิงก์และอาร์เรย์)
enqueue(value) - เพิ่มรายการเมื่อสิ้นสุดพื้นที่เก็บข้อมูลที่มีอยู่
dequeue() - ส่งคืนค่าและลบองค์ประกอบที่เพิ่มล่าสุดน้อยที่สุด
ว่างเปล่า()
เต็ม()
enqueue(value) - เพิ่มมูลค่าที่ตำแหน่งส่วนท้าย
dequeue() - ส่งคืนค่าและลบองค์ประกอบที่เพิ่มล่าสุดน้อยที่สุด (ด้านหน้า)
ว่างเปล่า()
คิว (วิดีโอ)
บัฟเฟอร์แบบวงกลม/FIFO
[รีวิว] ต่อคิวใน 3 นาที (วีดีโอ)
ใช้งานโดยใช้รายการที่เชื่อมโยงโดยมีตัวชี้ส่วนท้าย:
ใช้งานโดยใช้อาร์เรย์ขนาดคงที่:
ค่าใช้จ่าย:
hash(k, m) - m คือขนาดของตารางแฮช
เพิ่ม (คีย์, ค่า) - หากมีคีย์อยู่แล้ว ให้อัปเดตค่า
มีอยู่(กุญแจ)
รับ (กุญแจ)
ลบ (คีย์)
ตารางแฮชหลัก (วิดีโอ)
โครงสร้างข้อมูล (วิดีโอ)
ปัญหาสมุดโทรศัพท์ (วิดีโอ)
ตารางแฮชแบบกระจาย:
การอัปโหลดและการเพิ่มประสิทธิภาพการจัดเก็บในทันทีใน Dropbox (วิดีโอ)
ตารางแฮชแบบกระจาย (วิดีโอ)
การแฮชด้วยการผูกมัด (วิดีโอ)
การเพิ่มตารางเป็นสองเท่า Karp-Rabin (วิดีโอ)
เปิดที่อยู่, การแฮชแบบเข้ารหัส (วิดีโอ)
PyCon 2010: พจนานุกรมอันยิ่งใหญ่ (วิดีโอ)
PyCon 2017: พจนานุกรมที่ยิ่งใหญ่กว่า (วิดีโอ)
(ขั้นสูง) การสุ่มตัวอย่าง: Universal & Perfect Hashing (วิดีโอ)
(ขั้นสูง) การแฮชที่สมบูรณ์แบบ (วิดีโอ)
[รีวิว] ตารางแฮชใน 4 นาที (วิดีโอ)
วิดีโอ:
หลักสูตรออนไลน์:
นำไปใช้กับอาร์เรย์โดยใช้การตรวจวัดเชิงเส้น
⬆ กลับไปด้านบน
การค้นหาแบบไบนารี (ในอาร์เรย์ที่เรียงลำดับของจำนวนเต็ม)
การค้นหาแบบไบนารีโดยใช้การเรียกซ้ำ
การค้นหาแบบไบนารี (วิดีโอ)
การค้นหาแบบไบนารี (วิดีโอ)
รายละเอียด
พิมพ์เขียว
[รีวิว] การค้นหาแบบไบนารี่ใน 4 นาที (วิดีโอ)
ดำเนินการ:
จำนวนเต็มสัมบูรณ์
แลกเปลี่ยน
4 วิธีในการนับบิตเป็นไบต์ (วิดีโอ)
นับบิต
วิธีการนับจำนวนบิตที่ตั้งไว้ในจำนวนเต็ม 32 บิต
ไบนารี่: ข้อดีและข้อเสีย (ทำไมเราใช้ส่วนเสริมของสอง) (วิดีโอ)
ส่วนประกอบ 1 วินาที
ส่วนเสริม 2 วินาที
คำ
บทนำที่ดี: การจัดการบิต (วิดีโอ)
บทช่วยสอนการเขียนโปรแกรม C 2-10: ตัวดำเนินการ Bitwise (วิดีโอ)
การจัดการบิต
การดำเนินการระดับบิต
Bithacks
เจ้าบิต ทวิดเลอร์
Bit Twiddler แบบโต้ตอบ
Bit Hacks (วิดีโอ)
ปฏิบัติการฝึกซ้อม
คุณควรรู้พลังของ 2 มากมายตั้งแต่ (2^1 ถึง 2^16 และ 2^32)
แผ่นโกง Bits
รับความเข้าใจที่ดีเกี่ยวกับการจัดการบิตด้วย: &, |, ^, ~, >>, <<
ส่วนเสริม 2s และ 1s
นับบิตชุด
สลับค่า:
ค่าสัมบูรณ์:
⬆ กลับไปด้านบน
บีเอฟเอส หมายเหตุ:
หมายเหตุของดีเอฟเอส:
ลำดับระดับ (BFS โดยใช้คิว)
ความซับซ้อนของเวลา: O(n)
ความซับซ้อนของพื้นที่: ดีที่สุด: O(1), แย่ที่สุด: O(n/2)=O(n)
ความซับซ้อนของเวลา: O(n)
ความซับซ้อนของพื้นที่: ดีที่สุด: O(log n) - เฉลี่ย ความสูงของต้นไม้แย่ที่สุด: O(n)
ไม่เป็นระเบียบ (DFS: ซ้าย, ตัวเอง, ขวา)
postorder (DFS: ซ้าย, ขวา, ตัวเอง)
สั่งซื้อล่วงหน้า (DFS: ตัวเอง, ซ้าย, ขวา)
ข้อมูลเบื้องต้นเกี่ยวกับต้นไม้ (วิดีโอ)
การสำรวจต้นไม้ (วิดีโอ)
BFS(การค้นหาแบบกว้างก่อน) และ DFS(การค้นหาเชิงลึกก่อน) (วิดีโอ)
[รีวิว] ค้นหาแบบกว้างก่อนใน 4 นาที (วิดีโอ)
[รีวิว] ค้นหาเชิงลึกก่อนใน 4 นาที (วิดีโอ)
[รีวิว] Tree Traversal (เพลย์ลิสต์) ใน 11 นาที (วิดีโอ)
insert // ใส่ค่าลงใน tree
get_node_count // รับจำนวนค่าที่เก็บไว้
print_values // พิมพ์ค่าในแผนผังจากต่ำสุดถึงสูงสุด
ลบ_ทรี
is_in_tree // คืนค่าเป็นจริงหากค่าที่กำหนดอยู่ในแผนผัง
get_height // ส่งกลับความสูงในโหนด (ความสูงของโหนดเดียวคือ 1)
get_min // ส่งคืนค่าต่ำสุดที่เก็บไว้ในแผนผัง
get_max // ส่งคืนค่าสูงสุดที่เก็บไว้ในแผนผัง
is_binary_search_tree
ลบ_ค่า
get_successor // ส่งคืนค่าสูงสุดถัดไปในแผนผังหลังจากค่าที่กำหนด -1 หากไม่มี
แผนผังการค้นหาแบบไบนารี - การใช้งานใน C/C++ (วิดีโอ)
การใช้งาน BST - การจัดสรรหน่วยความจำในสแต็กและฮีป (วิดีโอ)
ค้นหาองค์ประกอบขั้นต่ำและสูงสุดในแผนผังการค้นหาแบบไบนารี (วิดีโอ)
ค้นหาความสูงของต้นไม้ไบนารี (วิดีโอ)
Binary Tree Traversal - กลยุทธ์แบบกว้างก่อนและลึกก่อน (วิดีโอ)
แผนผังไบนารี: การข้ามลำดับระดับ (วิดีโอ)
การสำรวจต้นไม้แบบไบนารี: สั่งซื้อล่วงหน้า, สั่งซื้อ, สั่งซื้อภายหลัง (วิดีโอ)
ตรวจสอบว่าต้นไม้ไบนารีเป็นต้นไม้ค้นหาแบบไบนารีหรือไม่ (วิดีโอ)
ลบโหนดออกจาก Binary Search Tree (วิดีโอ)
Inorder Successor ในแผนผังการค้นหาแบบไบนารี (วิดีโอ)
การตรวจสอบต้นไม้การค้นหาแบบไบนารี (วิดีโอ)
บทนำ (วิดีโอ)
เอ็มไอที (วิดีโอ)
ซี/ซี++:
ดำเนินการ:
แทรก
sift_up - จำเป็นสำหรับการแทรก
get_max - ส่งคืนรายการสูงสุดโดยไม่ต้องลบออก
get_size() - ส่งคืนจำนวนองค์ประกอบที่เก็บไว้
is_empty() - คืนค่าเป็นจริงหากฮีปไม่มีองค์ประกอบใด ๆ
extract_max - ส่งคืนรายการสูงสุด โดยลบออก
sift_down - จำเป็นสำหรับ extract_max
ลบ(x) - ลบรายการที่ดัชนี x
heapify - สร้างฮีปจากอาร์เรย์ขององค์ประกอบที่จำเป็นสำหรับ heap_sort
heap_sort() - นำอาร์เรย์ที่ไม่ได้เรียงลำดับแล้วแปลงให้เป็นอาร์เรย์ที่เรียงลำดับโดยใช้ฮีปสูงสุดหรือฮีปขั้นต่ำ
มองเห็นเป็นต้นไม้ แต่มักจะเป็นเส้นตรงในการจัดเก็บข้อมูล (อาร์เรย์, รายการที่เชื่อมโยง)
กอง
บทนำ (วิดีโอ)
ต้นไม้ไบนารี (วิดีโอ)
หมายเหตุความสูงของต้นไม้ (วิดีโอ)
การใช้งานขั้นพื้นฐาน (วิดีโอ)
ต้นไม้ไบนารีที่สมบูรณ์ (วิดีโอ)
ซูโดโค้ด (วิดีโอ)
การเรียงลำดับฮีป - ข้ามไปยังจุดเริ่มต้น (วิดีโอ)
การเรียงลำดับฮีป (วิดีโอ)
การสร้างฮีป (วิดีโอ)
MIT 6.006 อัลกอริทึมเบื้องต้น: ไบนารีฮีป
CS 61B การบรรยายที่ 24: คิวลำดับความสำคัญ (วิดีโอ)
BuildHeap เวลาเชิงเส้น (ฮีปสูงสุด)
[รีวิว] ฮีป (เพลย์ลิสต์) ใน 13 นาที (วิดีโอ)
ใช้ฮีปสูงสุด:
⬆ กลับไปด้านบน
หมายเหตุ:
ฉันไม่แนะนำให้เรียงลำดับรายการที่เชื่อมโยง แต่การเรียงลำดับแบบผสานสามารถทำได้
ผสานการเรียงลำดับสำหรับรายการที่เชื่อมโยง
การเรียงลำดับความเสถียรของอัลกอริทึม
ความเสถียรในการเรียงลำดับอัลกอริทึม
ความเสถียรในการเรียงลำดับอัลกอริทึม
การเรียงลำดับอัลกอริทึม - ความเสถียร
ไม่มีการเรียงลำดับฟอง - มันแย่มาก - O(n^2) ยกเว้นเมื่อ n <= 16
ดำเนินการเรียงลำดับและทราบกรณีที่ดีที่สุด/กรณีที่แย่ที่สุด ความซับซ้อนโดยเฉลี่ยของแต่ละกรณี:
ความเสถียรในอัลกอริธึมการเรียงลำดับ ("Quicksort เสถียรหรือไม่")
อัลกอริธึมใดที่สามารถใช้กับรายการที่เชื่อมโยงได้ ซึ่งในอาร์เรย์? อันไหนของทั้งสอง?
สำหรับฮีปเรียงลำดับ โปรดดูโครงสร้างข้อมูลฮีปด้านบน การเรียงลำดับฮีปนั้นดีแต่ไม่เสถียร
Sedgewick - ผสาน (5 วิดีโอ)
1. การผสาน
2. การผสานจากล่างขึ้นบน
3. การเรียงลำดับความซับซ้อน
4. เครื่องเปรียบเทียบ
5. ความมั่นคง
Sedgewick - Quicksort (4 วิดีโอ)
1. การเรียงลำดับอย่างรวดเร็ว
2. การคัดเลือก
3. คีย์ซ้ำ
4. การเรียงลำดับระบบ
ยูซี เบิร์กลีย์:
CS 61B การบรรยายที่ 29: การเรียงลำดับ I (วิดีโอ)
CS 61B การบรรยายที่ 30: การเรียงลำดับ II (วิดีโอ)
CS 61B การบรรยายที่ 32: การเรียงลำดับ III (วิดีโอ)
CS 61B การบรรยายที่ 33: การเรียงลำดับ V (วิดีโอ)
CS 61B 21-04-2557: Radix Sort(วิดีโอ)
การจัดเรียงแบบบับเบิ้ล (วิดีโอ)
การวิเคราะห์ Bubble Sort (วิดีโอ)
การเรียงลำดับการแทรก การเรียงลำดับแบบผสาน (วิดีโอ)
การเรียงลำดับการแทรก (วิดีโอ)
ผสานการเรียงลำดับ (วิดีโอ)
การเรียงลำดับด่วน (วิดีโอ)
การเรียงลำดับการเลือก (วิดีโอ)
รวมรหัสการจัดเรียง:
การใช้อาร์เรย์เอาท์พุต (C)
การใช้อาร์เรย์เอาท์พุต (Python)
ในตำแหน่ง (C++)
รหัสการจัดเรียงด่วน:
การนำไปปฏิบัติ (C)
การนำไปปฏิบัติ (C)
การนำไปใช้งาน (Python)
[รีวิว] คัดแยก (playlist) ใน 18 นาที
จัดเรียงด่วนใน 4 นาที (วิดีโอ)
การเรียงลำดับฮีปใน 4 นาที (วิดีโอ)
รวมการเรียงลำดับใน 3 นาที (วิดีโอ)
เรียงลำดับฟองใน 2 นาที (วิดีโอ)
เรียงลำดับการเลือกใน 3 นาที (วิดีโอ)
เรียงลำดับการแทรกใน 2 นาที (วิดีโอ)
ดำเนินการ:
การผสาน: O(n log n) ค่าเฉลี่ยและแย่ที่สุด