อัลกอริทึมที่เร็วขึ้นหมายถึงอะไรในวิทยาศาสตร์คอมพิวเตอร์เชิงทฤษฎี


18

หากมีอัลกอริทึมทำงานในเวลาสำหรับปัญหาบางอย่าง A และบางคนเกิดอัลกอริธึมที่ทำงานในเวลาโดยที่g (n) = o (f (n))ถือว่าเป็นการปรับปรุงขั้นตอนวิธีก่อนหน้าหรือไม่?O(f(n))O(f(n)/g(n))g(n)=o(f(n))

ในแง่ของวิทยาศาสตร์คอมพิวเตอร์เชิงทฤษฎีแล้วมันสมเหตุสมผลหรือไม่ที่จะเกิดอัลกอริธึมแบบนี้ขึ้นมา?


4
โดย "อัลกอริธึมที่เร็วกว่า" เราหมายถึง
Yuval Filmus

@YuvalFilmus คุณหมายถึงอะไรกับ "asymptotically"
ไม่ได้กำหนด

1
ทำงานในเวลาo(f(n))(n))
Yuval Filmus

คำตอบ:


26

ไม่อัลกอริทึมที่ทำงานในเวลาO(f(n)/g(n))โดยที่g(n)=o(f(n))ไม่จำเป็นต้องพิจารณาว่าเป็นการปรับปรุง ตัวอย่างเช่นสมมติว่าf(n)=nและก.(n)=1/n n จากนั้นO((n)/ก.(n))=O(n2)เป็นช่วงเวลาที่เลวร้ายยิ่งกว่าผูกพันO((n))=O(n)(n)

เพื่อที่จะปรับปรุงตามอัลกอริทึมที่ทำงานในเวลา(n)คุณต้องหาอัลกอริธึมที่ทำงานในเวลาโอ((n))นั่นคือในเวลาก.(n)สำหรับบางฟังก์ชันg(n)=o(f(n))(n))

หากคุณรู้ว่าอัลกอริทึมทำงานในเวลาก็ไม่ชัดเจนว่าอัลกอริทึมทำงานในเวลาO (g (n))เป็นการปรับปรุงไม่ว่าจะเป็นf (n), g (n) )คือ นี่เป็นเพราะ O ขนาดใหญ่เป็นเพียงขอบเขตบนของเวลาทำงาน แต่มันเป็นเรื่องธรรมดาที่จะต้องพิจารณาความซับซ้อนเวลาเลวร้ายที่สุดกรณีและเพื่อประเมินว่ามันเป็นใหญ่\ ทีมากกว่าแค่เป็นใหญ่OO ( g ( n ) ) f ( n ) , g ( n ) Θ OO(f(n))O(ก.(n))(n),ก.(n)ΘO


21
การใช้ในย่อหน้าแรกของคุณอาจดีกว่า ใช้ฟังก์ชั่นลดลงรู้สึก cheat-y เล็กน้อย ก.(n)=1
David Richerby

1
@DavidRicherby: อาจจะเล็กน้อย แต่ OP ไม่เคยกล่าวว่าพวกเขามีอัลกอริทึมที่ทำงานในดังนั้นจึงไม่สามารถสันนิษฐานได้ O(ก.(n))
เควิน

7
@ เควินแน่นอน แต่บริบทเป็นวิทยาการคอมพิวเตอร์และในวิทยาการคอมพิวเตอร์สัญกรณ์ใหญ่ -O มักจะใช้สำหรับฟังก์ชั่นที่ไม่ลดลง อาจเป็นเพราะผู้ถามกำลังคิดในแง่เหล่านั้น
David Richerby

11

จำไว้ว่าสัญกรณ์มีความหมายสำหรับการวิเคราะห์ว่างานจะเติบโตอย่างไรสำหรับขนาดอินพุตที่แตกต่างกันและโดยเฉพาะทำให้เกิดปัจจัยหลายตัว, คำที่ต่ำกว่าและค่าคงที่O(...)

สมมติว่าคุณมีอัลกอริทึมซึ่งมีรันไทม์จริงคือ (สมมติว่าคุณสามารถนับคำแนะนำและรู้การกำหนดเวลาที่แน่นอนและอื่น ๆ แล้วสมมติว่าคุณมากับอัลกอริทึมใหม่ที่เกิดขึ้นจะเป็นแต่รันไทม์จริง5000 นอกจากนี้ยังคิดว่าคุณรู้ว่าซอฟแวร์ที่จะใช้ขั้นตอนวิธีนี้จะไม่เคยเห็นขนาดของปัญหาn>1 n 2 + 2 n + 1 O ( n ) 1,000 n + 5000 n > 10O(n2)1n2+2n+1O(n)1000n+5000n>10

ดังนั้นซึ่งคุณจะเลือก - อัลกอริทึมที่จะใช้เวลา 15,000 หน่วยหรือหนึ่งที่จะใช้เพียง 121 หน่วย? ทีนี้หากซอฟต์แวร์ของคุณพัฒนาไปสู่การจัดการปัญหาที่มีขนาดคุณจะเลือกอันไหน คุณจะทำอย่างไรถ้าขนาดของปัญหาแตกต่างกันมาก?O ( n 2 ) n > 100000O(n)O(n2)n>100000


2
"ไม่เคยเห็นปัญหาขนาด n> 10" - จากนั้นเราจะไม่ใช้สัญกรณ์ O เลยเราจะ ...
AnoE

5
@AnoE ตัวเลขง่าย ๆ เพื่อการโต้แย้ง ตรรกะเดียวกันนี้ใช้ไม่ว่าคุณกำลังวิเคราะห์ขนาดของปัญหา 10 vs 1e5 หรือวิเคราะห์สำหรับ 1e6 กับ 1e9
twalberg

1
@AnoE โปรแกรมคอมพิวเตอร์ส่วนใหญ่ไม่พยายามจัดการกับปัญหาที่เพิ่มขึ้นอย่างไม่ จำกัด ดังนั้นจะมีการแลกเปลี่ยน นั่นเป็นสาเหตุที่ big-O สำหรับวิทยาศาสตร์คอมพิวเตอร์เชิงทฤษฎีและแนวคิดสามารถนำไปใช้เพื่อปรับปรุงโปรแกรมจริง
mbomb007

อย่างแน่นอน @ mbomb007 ชื่อคำถามคือ "อัลกอริทึมที่เร็วกว่าหมายถึงอะไรในวิทยาศาสตร์คอมพิวเตอร์เชิงทฤษฎี " และเขามีสิ่งนี้ในร่างกาย: "มันสมเหตุสมผลหรือไม่ในบริบทของวิทยาศาสตร์คอมพิวเตอร์เชิงทฤษฎี ... "
AnoE

@AnoE จากประสบการณ์สัญกรณ์ O จะถูกใช้เมื่อ n <10 ตลอดเวลา! ไม่ใช่ว่ามันเป็นความคิดที่ดี ... แต่มันเป็นสิ่งที่ทำเสร็จแล้ว!
Cort Ammon - Reinstate Monica

5

โดยทั่วไปนั่นหมายความว่าสำหรับอินพุตทุกขนาดที่ใหญ่พอเวลาทำงานที่แย่ที่สุดของอัลกอริทึมเก่าจะช้ากว่าของใหม่ นั่นเทียบเท่ากับแบบแผนโดยที่คือความซับซ้อนของเวลาของอัลกอริทึมใหม่และความซับซ้อนของเวลาของเก่า g fก.(n)โอ((n))ก.

บางครั้งนักวิทยาศาสตร์คอมพิวเตอร์ให้ความสำคัญกับประสิทธิภาพเป็นกรณี ๆ ไป ตัวอย่างคลาสสิกคือ Quicksort: runtime-case ที่แย่ที่สุดคือในขณะที่เรารู้ว่ามีคนอื่นที่ทำงานในเวลา แต่มันถูกใช้อย่างกว้างขวางในทางปฏิบัติเพราะมันเป็นค่าเฉลี่ยที่ดี เวลาทำงาน นอกจากนี้ยังสามารถปรับแต่งให้ทำงานได้อย่างรวดเร็วในกรณีที่พบบ่อยที่สุดในป่าเช่นอาร์เรย์ที่ส่วนใหญ่อยู่ในลำดับที่ถูกต้องΘ ( n log n )Θ(n2)Θ(nเข้าสู่ระบบn)

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


1

ไม่มีคำจำกัดความที่เป็นหนึ่งเดียวของสิ่งที่ "อัลกอริทึมเร็วกว่า" คืออะไร ไม่มีองค์กรปกครองที่ตัดสินใจว่าอัลกอริทึมเร็วกว่าอีกหรือไม่

เพื่อชี้ให้เห็นว่าทำไมนี่คือสิ่งที่ฉันต้องการนำเสนอสองสถานการณ์ที่แตกต่างกันซึ่งแสดงให้เห็นถึงแนวคิดที่มืดมนนี้

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

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

Pick up the jar
Grab the lid
Unscrew the lid

กับ

Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Grab the lid
Unscrew the lid

แม้ในเชิงวิชาการส่วนใหญ่ที่ฉันสามารถนึกถึงได้คุณจะพบว่าผู้คนยอมรับว่าอัลกอริทึมแรกนั้นเร็วกว่าวินาทีแม้ว่าผลสัญกรณ์ของ Oh จะใหญ่เท่ากันก็ตาม

ในทางตรงกันข้ามเราสามารถพิจารณาอัลกอริทึมที่จะทำลายการเข้ารหัส RSA ในขณะนี้เป็นที่รับรู้ว่ากระบวนการนี้อาจเป็น O (2 ^ n) โดยที่ n คือจำนวนบิต พิจารณาอัลกอริธึมใหม่ที่รันเร็วกว่า n ^ 100 ซึ่งหมายความว่ากระบวนการใหม่ของฉันทำงานใน O (2 ^ n / n ^ 100) อย่างไรก็ตามในโลกของการเข้ารหัสลับการเพิ่มความเร็วแบบพหุนามกับอัลกอริธึมแบบเอ็กซ์โพเนนเชียลนั้นโดยทั่วไปแล้วไม่ได้คิดว่าเป็นการเพิ่มความเร็วเชิงทฤษฎีเลย เมื่อทำการพิสูจน์ความปลอดภัยจะสันนิษฐานว่าผู้โจมตีอาจค้นพบความเร็วหนึ่งในนั้นและมันจะไม่มีผลกระทบใด ๆ

ดังนั้นในสถานการณ์หนึ่งเราสามารถเปลี่ยน O (n) เป็น O (n) และเรียกมันได้เร็วขึ้น ในสถานการณ์ที่แตกต่างเราสามารถเปลี่ยน O (2 ^ n) เป็น O (2 ^ n / n ^ 100) และอ้างว่าไม่มีความเร็วที่มีความหมายเลย นี่คือเหตุผลที่ฉันบอกว่าไม่มีคำจำกัดความแบบรวมสำหรับ "อัลกอริทึมที่เร็วกว่า" มันขึ้นอยู่กับบริบทเสมอ


1

ฉันยังไม่สามารถแสดงความคิดเห็นได้ แต่ฉันรู้สึกเหมือนคำตอบปัจจุบันในขณะที่ถูกต้องและให้ข้อมูลอย่าตอบคำถามบางส่วน แรกให้เราเขียนเทียบเท่าแสดงออกถึงความ( n ) O ( F ( n ) )A(n)O((n))

 0<| Lim supnA(n)(n)=

ตอนนี้ให้เราสมมติว่าเรากำลังพูดถึงฟังก์ชั่นที่เพิ่มขึ้นโดยพลการโดยที่และให้เราสร้างฟังก์ชั่น(n)}sup n g ( n ) = h ( n ) = f ( n )ก.(n)Lim supnก.(n)=ชั่วโมง(n)=(n)ก.(n)

เราจะได้รับว่าระยะเวลาของ "ดีขึ้น" อัลกอริทึมอยู่ใน(n)) สมมติว่าระยะเวลาของขั้นตอนวิธีเดิมยังอยู่ใน(n)) สามารถเขียนได้ดังนี้O ( h ( n ) ) A ( n ) O ( h ( n ) )A'(n)O(ชั่วโมง(n))A(n)O(ชั่วโมง(n))

 0ชั่วโมง<| Lim supnA(n)ชั่วโมง(n)=ชั่วโมง

ใช้กฎการ จำกัด เรายังสามารถเขียน:

ชั่วโมง=Lim supnA(n)ชั่วโมง(n)=Lim supnA(n)ก.(n)(n)=Lim supnก.(n)

ตั้งแต่นี้เท่านั้นที่สามารถเป็นจริงถ้า0ชั่วโมง<=0

คำสั่ง contrapositive คือ: ถ้าแล้ว(n))0A(n)O(ชั่วโมง(n))

ในคำพูดคือ "การปรับปรุง" ในภายใต้เงื่อนไขเพิ่มเติมที่และเพิ่มขึ้นโดยพลการA'(n)A(n)A(n)Θ((n))ก.(n)

นอกจากนี้ควรแสดงให้เห็นว่าทำไมคำสั่งที่ไม่แข็งแรงพอที่จะสรุปได้ว่าเป็นการปรับปรุง "หรือไม่ ในระยะสั้นแล้วอาจจะอยู่ใน(n))A(n)O(f(n))A(n)A(n)O(h(n))


1
ขีด จำกัด ของคุณควรเป็นขีด จำกัด ที่เหนือกว่า
Yuval Filmus

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