อะไรคือเหตุผลในการเรียนรู้อัลกอริทึม / โครงสร้างข้อมูลที่แตกต่างกันซึ่งให้บริการเพื่อจุดประสงค์เดียวกัน


91

ฉันสงสัยเกี่ยวกับคำถามนี้ตั้งแต่ฉันเป็นนักเรียนระดับปริญญาตรี มันเป็นคำถามทั่วไป แต่ฉันจะทำอย่างละเอียดพร้อมตัวอย่างด้านล่าง

ฉันได้เห็นอัลกอริทึมมากมาย - ตัวอย่างเช่นสำหรับปัญหาการไหลสูงสุดฉันรู้อัลกอริทึม 3 อย่างที่สามารถแก้ปัญหาได้: ฟอร์ด - ฟัลเกอร์สัน, เอ็ดมันด์ - คาร์ปและดินิกโดย Dinic มีความซับซ้อนที่สุด

สำหรับโครงสร้างข้อมูล - ตัวอย่างเช่น heap - มี binary heaps, binomial heaps & Fibonacci heaps โดยที่ Fibonacci heap มีความซับซ้อนโดยรวมที่ดีที่สุด

สิ่งที่ทำให้ฉันสับสนคือ: มีเหตุผลใดบ้างที่เราจำเป็นต้องรู้จักพวกเขาทั้งหมด? ทำไมไม่เพียงแค่เรียนรู้และทำความคุ้นเคยกับความซับซ้อนที่ดีที่สุด?

ฉันรู้ว่ามันดีที่สุดถ้าเรารู้จักพวกเขาทั้งหมดฉันแค่อยากรู้ว่ามีเหตุผล "ที่ถูกต้องมากกว่า" เช่นปัญหา / อัลกอริทึมบางอย่างสามารถแก้ไขได้โดยใช้Aแต่ไม่ใช่Bเป็นต้น


17
อย่างที่ฉันพูดเสมอ: สิ่งเหล่านี้ (โดยปกติ) ไม่ใช่ "ดีที่สุด" เมื่อคุณกำหนดอย่างชัดเจนว่าคุณหมายถึงอะไรโดย "ดีกว่า" คำตอบจะชัดเจน
Raphael

2
นี่เป็นคำถามที่ดี แต่มันพูดกับสิ่งที่ฉันจะพิจารณาหลุมในการศึกษาของคุณคุณอาจมีลักษณะการแก้ไข นั่นคือประสบการณ์จริงถ้าคุณยังไม่ได้เขียนอัลกอริธึมเหล่านี้ในระหว่างการศึกษาคุณอาจลองเขียนตอนนี้ฉันสงสัยว่าคำตอบของคำถามนี้จะชัดเจนขึ้นอย่างรวดเร็วเมื่อคุณพยายามหาประโยชน์ให้พวกเขา
Sam

@ Sam จากประสบการณ์ของฉันสิ่งที่ฉันคิดว่าคือในการบรรยายหรือหนังสือบางเล่มพวกเขามีข้อมูลแนะนำอัลกอริทึมมากมายการวิเคราะห์ ฯลฯ แต่ไม่ใช่กรณีที่ปฏิบัติจริงหรือสถานการณ์ตัวอย่างจำนวนมากที่ A จะเอาชนะบีพวกเขาอาจ ประเภทของอัลกอริทึม A ถึง Z และปัญหาการบ้านบางอย่าง แต่สำหรับฉันพวกเขาสามารถแก้ไขได้โดย A เท่านั้นหรือโดย Z เท่านั้นเป็นต้นดังนั้นคำถามจึงถาม
shole

5
หากคุณยืนยันที่จะทิ้งความสนใจด้านวิชาการไว้ด้วยเหตุผลเชิงปฏิบัติที่ดีที่สุดในการเรียนรู้น้อยกว่าอัลกอริธึมที่ดีที่สุดคือเพื่อให้คุณสามารถจดจำพวกเขาสำหรับสิ่งที่พวกเขาเป็นและเพิ่มประสิทธิภาพพวกเขาโดยการปรับสภาพให้เหมาะสม คุณไม่สามารถอัปเกรดคันธนูและลูกศรเป็นปืนได้หากคุณไม่ทราบว่าคันธนูและลูกธนูเป็นอะไร
candied_orange

1
เราได้เสนอไซต์ StackExchange เพื่อช่วยตอบคำถามการศึกษาแบบ CS โดยเฉพาะ มาสนับสนุนพวกเราที่นี่: area51.stackexchange.com/proposals/92460/…
vk2015

คำตอบ:


121

มีตำรารอที่จะเขียนในบางจุดเป็นด้วยเรื่องของการทำงานโครงสร้างข้อมูลอัลกอริทึมและ Tradeoffs เกือบทุกอัลกอริทึมหรือโครงสร้างข้อมูลที่คุณน่าจะเรียนรู้ในระดับปริญญาตรีมีคุณสมบัติบางอย่างที่ทำให้ดีขึ้นสำหรับการใช้งานบางอย่างกว่าคนอื่น ๆ

ลองเรียงลำดับเป็นตัวอย่างเนื่องจากทุกคนคุ้นเคยกับอัลกอริธึมการจัดเรียงมาตรฐาน

ก่อนอื่นความซับซ้อนไม่ได้เป็นเพียงความกังวลเท่านั้น ในทางปฏิบัติปัจจัยคงที่มีความสำคัญซึ่งเป็นเหตุผลว่าทำไมการเรียงลำดับอย่างรวดเร็วมีแนวโน้มที่จะใช้มากกว่าการเรียงลำดับฮีปแม้ว่าการเรียงลำดับแบบเร็วจะมีความซับซ้อนในกรณีที่แย่ที่สุด

ประการที่สองมีโอกาสเสมอที่คุณพบว่าตัวเองอยู่ในสถานการณ์ที่คุณกำลังเขียนโปรแกรมภายใต้ข้อ จำกัด ที่แปลก ผมเคยมีที่จะทำสกัด quantile จากเจียมเนื้อเจียมตัวขนาด (1000 หรือดังนั้น) เก็บตัวอย่างเร็วที่สุดเท่าที่เป็นไปได้ แต่มันเป็นไมโครคอนโทรลเลอร์ขนาดเล็กที่มีหน่วยความจำสำรองอ่านเขียนน้อยมากเพื่อให้การปกครองออกมากที่สุดอัลกอริทึมการเรียงลำดับ การเรียงลำดับของเชลล์นั้นเป็นการแลกเปลี่ยนที่ดีที่สุดเนื่องจากเป็น sub-quadratic และไม่ต้องการหน่วยความจำเพิ่มเติมO(nlogn)

ในกรณีอื่น ๆ แนวคิดจากอัลกอริทึมหรือโครงสร้างข้อมูลอาจใช้กับปัญหาวัตถุประสงค์พิเศษ การเรียงลำดับฟองดูเหมือนจะช้ากว่าการเรียงลำดับการแทรกบนฮาร์ดแวร์จริงเสมอ แต่บางครั้งความคิดในการดำเนินการผ่านฟองสบู่ก็เป็นสิ่งที่คุณต้องการ

ลองพิจารณาตัวอย่างเช่นการสร้างภาพ 3 มิติหรือวิดีโอเกมบนการ์ดวิดีโอที่ทันสมัยซึ่งคุณต้องการวาดวัตถุตามลำดับจากกล้องใกล้กับกล้องไปจนถึงกล้องที่อยู่ไกลที่สุดด้วยเหตุผลด้านประสิทธิภาพ แต่ หากคุณไม่ได้รับการสั่งซื้อที่แน่นอนฮาร์ดแวร์จะดูแลมัน หากคุณเคลื่อนที่ไปรอบ ๆ สภาพแวดล้อม 3 มิติลำดับสัมพัทธ์ของวัตถุจะไม่เปลี่ยนแปลงมากนักระหว่างเฟรมดังนั้นการดำเนินการผ่านหนึ่งบับเบิลผ่านทุกเฟรมอาจเป็นการแลกเปลี่ยนที่สมเหตุสมผล (เครื่องยนต์ต้นกำเนิดโดย Valve ทำสิ่งนี้เพื่อผลกระทบของอนุภาค)

การคงอยู่พร้อมกัน, ตำแหน่งแคช, ความสามารถในการปรับขนาดได้บนคลัสเตอร์ / คลาวด์และโฮสต์ของสาเหตุอื่น ๆ ที่อาจเป็นไปได้ว่าเหตุใดโครงสร้างข้อมูลหรืออัลกอริทึมหนึ่งอาจจะเหมาะสมกว่าที่อื่นแม้ว่าจะมีความซับซ้อน

ต้องบอกว่านั่นไม่ได้หมายความว่าคุณควรจดจำอัลกอริธึมและโครงสร้างข้อมูลจำนวนมากในกรณีนี้ การต่อสู้ส่วนใหญ่รู้ตัวว่ามีการแลกเปลี่ยนเพื่อเอาเปรียบในตอนแรกและรู้ว่าจะต้องดูว่าคุณคิดว่าอาจมีบางสิ่งที่เหมาะสม


7
คำตอบที่ยอดเยี่ยมพร้อมตัวอย่างที่ยอดเยี่ยม! ไม่ทราบแม้กระทั่งผ่านฟองมีการใช้งานจริงในโลกจริง ...
shole

1
@shole ฉันไม่มีประสบการณ์ในธุรกิจเกมมากนัก แต่สิ่งที่กล่าวมาทั้งหมดมีความสำคัญต่อองศาที่แตกต่างกัน (เห็นได้ชัดว่าการเรียงลำดับของอัลกอริทึมโครงสร้างข้อมูลและคณิตศาสตร์ที่คุณต้องการสำหรับเกมอาจแตกต่างจากที่จำเป็นสำหรับฐานข้อมูลหรือชีวสารสนเทศหรือสิ่งที่มีคุณ) ถ้าฉันเป็นคุณฉันจะไปที่นี่และเริ่มดู: handmadehero org นอกจากนี้ยังอาจคุ้มค่าที่จะแอบซุ่มอยู่ในgamedev.stackexchange.com
นามแฝง

1
ประสิทธิภาพแคชเป็นปัจจัยสำคัญที่มีการค้นหาบ่อยครั้ง (google "หน่วยความจำกำแพง")
Raphael

6
ระวัง Quicksort นั้นเร็วกว่า Heapsort มากโดยเฉลี่ยแต่ Heapsort นั้นสอดคล้องกันมากกว่านี้ (ความแปรปรวนของเวลาทำงานน้อยกว่าและกรณีที่เลวร้ายที่สุดนั้นดีกว่ามาก) และการกระโดดข้ามแถวของ Heapsort กับการสแกนเชิงเส้นของ Quicksort จากซ้ายและขวาสร้างความแตกต่างอย่างมากเมื่อแคช / การเพจเข้ามาเล่น
vonbrand

1
@shole การพัฒนาเกมประเภทใดที่คุณสนใจ มีฟิลด์ย่อยที่แตกต่างกันอย่างน้อยสองกราฟิก 3D และเกมเพลย์ (ซึ่งรวมถึง AI) ฉันมีประสบการณ์เกี่ยวกับกราฟิกเท่านั้น แต่ฉันสามารถพูดได้ว่าโครงสร้างข้อมูลและคณิตศาสตร์มีความสำคัญอย่างยิ่งในกราฟิกและอัลกอริทึมรวมถึงในระดับที่น้อยกว่า หากคุณใช้เครื่องมือส่วนใหญ่สิ่งนี้จะได้รับการดูแล แต่คุณควรเข้าใจคณิตศาสตร์พื้นฐานของเรขาคณิต 3 มิติ
Gardenhead

51

นอกเหนือจากข้อเท็จจริงที่ว่ามีการวัดค่าใช้จ่ายจำนวนมาก (เวลาทำงานการใช้หน่วยความจำแคชที่หายไปการคาดคะเนสาขาความซับซ้อนในการใช้งานความเป็นไปได้ในการตรวจสอบ ... ) บนเครื่องรุ่นต่างๆ (TM, RAM, PRAM, ... ) ค่าเฉลี่ยเทียบกับกรณีที่เลวร้ายที่สุดรวมถึงการพิจารณาค่าตัดจำหน่ายเพื่อชั่งน้ำหนักซึ่งกันและกันมักจะมีความแตกต่างในการทำงานมากกว่าขอบเขตของข้อกำหนดตำราเรียนพื้นฐาน

ตัวอย่างบางส่วน:

  • การรวมมีความเสถียรโดยที่ Quicksort ไม่ได้เป็น
  • แผนผังการค้นหาแบบไบนารี่จะให้คุณทำซ้ำตามลำดับแฮชเทเบิลทำไม่ได้
  • Bellman-Ford สามารถรับมือกับน้ำหนักที่ติดลบได้ Dijkstra ไม่สามารถทำได้

นอกจากนี้ยังมีข้อควรพิจารณาเกี่ยวกับการสอนเพื่อให้:

  • มันง่ายแค่ไหนที่จะเข้าใจวิธีแก้ปัญหาที่เกี่ยวข้องมากกว่าก่อนที่จะง่ายกว่า? (ต้นไม้ AVL (และการวิเคราะห์) โดยไม่มี BST; Dinic ที่ไม่มี Ford-Fulkerson; ... )
  • คุณเห็นหลักการและรูปแบบเดียวกันนี้หรือไม่เมื่อคุณมีวิธีแก้ปัญหาเพียงปัญหาเดียวต่อปัญหาเมื่อเปรียบเทียบกับวิธีแก้ปัญหาหลายวิธี?
  • การแสดงออกถึงโซลูชั่นเดียวต่อปัญหาช่วยให้มีการฝึกอบรมอย่างเพียงพอหรือไม่
  • คุณควรทราบความกว้างของวิธีการแก้ปัญหาที่ได้รับการค้นพบ (เพื่อป้องกันไม่ให้คุณสร้างพวงมาลัยซ้ำแล้วซ้ำอีก?)
  • เมื่อสัมผัสกับทางออกเดียวต่อปัญหาคุณจะเข้าใจวิธีแก้ไขปัญหาอื่น ๆ ที่คุณพบในสถานการณ์จริงหรือไม่ (พูดในไลบรารีการเขียนโปรแกรมจริงของโลก)?

  1. นี่คือสิ่งที่เราเห็นมากจากโปรแกรมเมอร์ประเภทที่ไม่มีกล่อง CS ที่สมบูรณ์ในการกำจัดของพวกเขา

4
+1 สำหรับการรวมเหตุผลการสอน! เกี่ยวข้องกับเหตุผลหลายประการ (โดยเฉพาะอย่างยิ่งที่สองและสาม) การดูว่าอัลกอริธึมและโครงสร้างข้อมูลได้รับการพัฒนาและปรับให้เหมาะสมอย่างไรสอนเทคนิคการพัฒนาและการปรับให้เหมาะสมและความเข้าใจของการแลกเปลี่ยน (การเรียนรู้ )
Paul A. Clayton

2
สิ่งที่ต้องพิจารณาอีกประการหนึ่งคือการวิเคราะห์ทางเลือกต่าง ๆ เสนอตัวอย่างของเครื่องมือที่มีประโยชน์สำหรับการวิเคราะห์อัลกอริธึมใหม่สำหรับการตั้งค่าที่ผิดปกติ
vonbrand

1
จุดที่ดี @ vonbrand การวิเคราะห์ความซับซ้อนค่าตัดจำหน่ายถูกประดิษฐ์ขึ้นเพื่อทำความเข้าใจพฤติกรรมของต้นไม้ที่ถูกตัดออก แต่ต้นไม้ที่ใช้ในการฝึกก็ไม่ค่อยได้ใช้ ไม่ใช่ต้นไม้ที่ได้รับการตีพิมพ์ เคอร์เนล Windows NT ใช้ต้นสเปรย์เพื่อสร้างแผนที่หน่วยความจำเสมือนที่มีชื่อเสียง แต่จะไม่เรียงลำดับใหม่ในทุกการค้นหา
นามแฝง

1
@ vonbrand ใช่ ฉันจะเข้าใจว่าคนส่วนใหญ่ให้ความสนใจกับกล่องเครื่องมือ - มิติในคลาสอัลกอริทึมจะเย้ยหยันด้วยเหตุผลนั้นอย่างไร
Raphael

7

ในโลกแห่งความเป็นจริงในบางจุดคุณมีแนวโน้มที่จะทำงานเกี่ยวกับซอฟต์แวร์ที่เขียนขึ้นโดยทีมงานของคนอื่น ซอฟต์แวร์นี้บางส่วนจะถูกเขียนขึ้นก่อนที่คุณจะเกิด!

เพื่อให้เข้าใจถึงอัลกอริทึม / โครงสร้างข้อมูลที่ใช้จะเป็นประโยชน์อย่างยิ่งหากได้ทราบจำนวนอัลกอริธึม / โครงสร้างข้อมูลจำนวนมากรวมถึงตัวเลือกที่ไม่ถือว่าเป็น“ สถานะของศิลปะ” อีกต่อไป

คุณจะต้องทำงานกับอัลกอริทึมที่ไม่ได้มาตรฐานและใช้ในแอปพลิเคชันที่คุณกำลังทำงานอยู่ เมื่อคุณต้องปรับปรุงอัลกอริทึมเหล่านี้คุณจะพบว่าสมองของคุณเต็มไปด้วยวิธีที่มีประโยชน์ในการปรับปรุงอัลกอริทึมเนื่องจากคุณได้ศึกษาว่าคนอื่นมีอัลกอริทึมที่ดีขึ้นอย่างไร

นี่คือสิ่งที่ทำให้คนที่เรียนวิทยาศาสตร์คอมพิวเตอร์นอกเหนือจากคนที่เพิ่งเรียนรู้วิธีการเขียนโปรแกรม ในงานส่วนใหญ่ที่ฉันได้ทำงานมามีเวลาเมื่อศึกษาวิชาวิทยาการคอมพิวเตอร์ฉันสามารถแก้ปัญหาที่โปรแกรมเมอร์“ เรียนรู้จากหนังสือ” ไม่สามารถทำได้แต่ 95% ของเวลาที่ฉันพบว่าการศึกษาวิทยาการคอมพิวเตอร์ไม่ได้ประโยชน์อะไรเลย โปรแกรมเมอร์ที่มีประสบการณ์มากกว่าคนอื่น


ยกเว้นว่า 95% ของสิ่งที่คุณกำลังพยายามแก้ไขเกี่ยวข้องกับการเรียนรู้ของเครื่อง ฉันไม่สามารถเห็นได้ว่าโปรแกรมเมอร์ปกติสามารถมีโอกาสที่จะลองใช้ปัญหาที่เกิดขึ้นจากปัญหา ML จริง ๆ ได้อย่างไร
Pinocchio

3
เป้าหมาย: รับงานด้วยอัตราที่ดีกว่า 5%
Raphael

โปรดจำไว้ว่าการเรียน CS นั้นเป็นวิธีที่ดีในการรวบรวมความรู้เกี่ยวกับอัลกอริทึมและโครงสร้างข้อมูล การเข้ารหัสเป็นอาชีพที่ดีที่สุด - สำหรับนักเขียนโค้ด
greybeard

5

หลายคนพูดถูกต้องว่าบ่อยครั้งที่ไม่มีอัลกอริทึมที่ดีที่สุด - ขึ้นอยู่กับสถานการณ์

นอกจากนี้ยังมีความเป็นไปได้ที่วันหนึ่งคุณจะเจอกับสถานการณ์ที่ไม่คุ้นเคย ยิ่งคุณรู้อัลกอริธึมมากเท่าไหร่โอกาสที่คุณจะรู้ว่ามันเกือบจะเป็นทางออกที่คุณสามารถใช้เป็นฐานได้


5
คำตอบนี้ทำซ้ำคะแนนจากคนที่เก่ากว่าเท่านั้น
กราฟิลส์

1

คำตอบที่ดีมากมีบางสิ่งที่ฉันคิดว่าหายไปแม้ว่าคำตอบของราฟาเอลจะพูดถึงเรื่องนี้บ้าง

ความง่ายในการใช้งานเป็นสิ่งที่ต้องคำนึงถึงด้วย
นั่นไม่ใช่ปัญหาของอัลกอริทึมการเรียงลำดับเนื่องจากแพลตฟอร์ม / ภาษาส่วนใหญ่มีการใช้งานแล้ว (และมักจะดีกว่าที่คุณสามารถทำได้) แต่อัลกอริธึมที่ผิดปกติอาจไม่สามารถใช้ได้
ขึ้นอยู่กับปัญหาของคุณคุณอาจไม่จำเป็นต้องใช้อัลกอริธึมที่ดีที่สุดถ้าเวลาการติดตั้งคือ 1 วันกับ 2 สัปดาห์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.