อัลกอริทึมที่มีประสิทธิภาพคืออะไร?


10

จากมุมมองของพฤติกรรมแบบซีมโทติควิธีใดที่ถือว่าเป็น "ประสิทธิภาพ" อัลกอริทึม? มาตรฐาน / เหตุผลในการวาดเส้นตรงนั้นคืออะไร? โดยส่วนตัวแล้วฉันคิดว่าอะไรก็ตามที่เป็นสิ่งที่ฉันเรียกว่า "พหุนามย่อย" อย่างไร้เดียงสาเช่นนั้นf(n)=o(n2) เช่น n1+ϵ จะมีประสิทธิภาพและอะไรก็ตามที่เป็น Ω(n2)จะเป็น "ไม่มีประสิทธิภาพ" อย่างไรก็ตามฉันได้ยินอะไรก็ตามที่มีคำสั่งพหุนามเรียกว่ามีประสิทธิภาพ อะไรคือเหตุผล


คำตอบ:


11

ขึ้นอยู่กับบริบท ในวิทยาการคอมพิวเตอร์เชิงทฤษฎีโดยปกติอัลกอริธึมเวลาพหุนามทุกอันถือว่ามีประสิทธิภาพ ในขั้นตอนวิธีการประมาณเช่นรันไทม์ของn1/ϵ1/ϵ จะถือว่ามีประสิทธิภาพแม้ว่าจะไม่สามารถใช้งานได้ในทางปฏิบัติสำหรับมูลค่าที่เหมาะสมของ ϵ. อัลกอริทึมสำหรับ SAT ที่ทำงานn2100 จะเป็นการพัฒนาที่น่าอัศจรรย์

ในอัลกอริทึมแบบคลาสสิกนั่นคืออัลกอริธึมจากยุค 80 และก่อนหน้านี้รันไทม์ด้านล่าง n3หรือดังนั้น (คิดว่าการคูณเมทริกซ์การจับคู่ราคาต่ำสุดการไหลการเขียนโปรแกรมเชิงเส้น) ถือว่ามีประสิทธิภาพ พวกเขายังถือว่ามีประสิทธิภาพโดยคนส่วนใหญ่ฉันจะบอกว่า แน่นอนn2 อัลกอริทึมไม่ถือว่ามีประสิทธิภาพถ้า nlogn อัลกอริทึมเป็นที่รู้จักเช่นการเรียงลำดับเช่น

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

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


9
กล่าวโดยย่อ: ประสิทธิภาพเป็นสิ่งที่แก้ปัญหาของคุณในกรอบเวลาที่เหมาะกับคุณ
Raphael

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

บางทีคำว่า "มีประสิทธิภาพ" อาจไม่ใช่คำศัพท์ที่ถูกต้องตั้งแต่แรก? ฉันเพิ่งตรวจสอบหนังสือแคลคูลัสเล่มใดเล่มหนึ่งและผู้เขียนเรียกพหุนามพหุนามว่า "แบบง่าย" และแบบเอกซ์โปเนนเชียล "แบบว่ายาก"
Robert S. Barnes

1
@ RobertS.Barnes: คำที่ต่างกันปัญหาเดียวกัน
Raphael

4

2 เซ็นต์ของฉันจากมุมของอัลกอริทึมแบบกระจาย: เมื่อดูที่เครือข่ายขนาดใหญ่ (P2P, เครือข่ายทางสังคมและอื่น ๆ ) อัลกอริทึมแบบกระจายจะถือว่ามีประสิทธิภาพหากเวลาทำงานของมันคือO(logcn) สำหรับบางค่าคงที่ c>0 และอัลกอริทึมใช้ข้อความของO(logn)เกร็ด โปรดทราบว่าข้อกำหนดเกี่ยวกับขนาดข้อความมักจะให้ความสำคัญมากกว่าเวลาทำงานโดยเฉพาะอย่างยิ่งสำหรับปัญหา "ทั่วโลก" ที่มีขอบเขตล่างที่ใหญ่กว่าในเวลาทำงานเช่น MST แบบกระจาย


3

เหตุผลที่อยู่เบื้องหลังก็คือจากมุมมองพฤติกรรมเชิงซีโมติกอัตราการเติบโตของพหุนามนั้นน้อยกว่าอัตราการเติบโตของพหุนามเล็กน้อย ในทางปฏิบัติอัลกอริธึมเวลาแบบพหุนามวิ่งเร็วกว่าอัลกอริธึมแบบพหุนามแบบเร็วมากเมื่อขนาดอินพุตเพิ่มขึ้น

แน่นอนว่าไม่มีใครจะพูดได้ว่าอัลกอริทึมที่มีความซับซ้อนของพหุนามยกตัวอย่างเช่น O(n2000) คือ "มีประสิทธิภาพ" แต่อัลกอริธึมส่วนใหญ่แทบจะไม่ซับซ้อนเกินกว่าความซับซ้อนของ O(n5).

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


3

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

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


ในขณะที่ฉันสามารถเข้าใจได้ว่าหากสิ่งใดเป็นอัลกอริทึมที่รู้จักกันเร็วที่สุดสำหรับปัญหาเฉพาะมันก็อาจพิจารณาได้ว่า "มีประสิทธิภาพ" จากมุมมองนั้นมันเป็นเรื่องยากสำหรับฉันที่จะคิดว่าอะไรก็ตาม :-)
Robert S. Barnes

สำหรับพหุนามพหุนาม "ประสิทธิภาพ" เป็นเพียงคำเดียวและทำให้เข้าใจผิดที่
Raphael

@ ราฟาเอลบางทีอาจเป็นคำที่ดีกว่าที่จะใช้ ... ?
Robert S. Barnes

1
@ RobertS.Barnes: ไม่ค่อยดีเท่าไหร่หรอก imho "Tractable" มีความสัมพันธ์เหมือนกับ "มีประสิทธิภาพ" ทุกบิต
Raphael

0

ปัญหาบางอย่างง่ายบางปัญหา การอัลกอริทึมนั้น "มีประสิทธิภาพ" หรือไม่นั้นขึ้นอยู่กับว่ามันถูกเปรียบเทียบกับความซับซ้อนของปัญหาหรือไม่ หากคุณพบอัลกอริทึมที่คำนึงถึงตัวเลข n หลักใด ๆ ใน O (n3) การดำเนินการและฉันพบอัลกอริทึมที่เรียงลำดับหมายเลข n ใน O (n2) การดำเนินการแล้วอัลกอริทึมของคุณจะมีประสิทธิภาพมากขึ้น (เพราะมันเป็นอะไรที่มนุษย์รู้จากปัจจัยขนาดใหญ่ในขณะที่ของฉันช้าเท่าที่คุณคาดหวังจากมือใหม่)


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