เวลาที่ซับซ้อนของการเพิ่ม


11

Wikipedia แสดงความซับซ้อนของเวลาในการเพิ่มเป็นโดยที่nคือจำนวนบิตnn

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

มันเป็นไปไม่ได้ในทางทฤษฎีหรือไม่ที่จะได้อัลกอริธึมเพิ่มเติมที่ทำงานใน ? หรือเราผูกพันกับความซับซ้อนเชิงเส้นเพื่อเพิ่มเติมo(n)

คำตอบ:


17

หากอัลกอริทึมของคุณใช้ asymptotically น้อยกว่าเวลาแสดงว่ามันไม่มีเวลามากพอที่จะอ่านตัวเลขทั้งหมดของตัวเลขที่เพิ่มเข้ามา คุณจะจินตนาการว่าคุณกำลังจัดการกับตัวเลขที่มีขนาดใหญ่มาก (เก็บไว้ในไฟล์ข้อความ 8MB) แน่นอนการเพิ่มสามารถทำได้อย่างรวดเร็วมากเมื่อเทียบกับค่าของตัวเลข มันจะทำงานในเวลาO ( log ( N ) )ถ้าNเป็นค่าของผลรวมnO(log(N))N

นี่ไม่ได้หมายความว่าคุณจะเร่งความเร็วของสิ่งต่าง ๆ ได้เล็กน้อย หากตัวประมวลผลของคุณจัดการ 32 บิตในแต่ละการดำเนินการคุณจะใช้เวลา แต่ที่ยังคงเป็นO(n)และไม่ได้o(n)n32O(n)o(n)


คือการอ่านข้อมูลทั้งหมดที่จำเป็นในทางทฤษฎี สำหรับการเพิ่มขึ้นของตัวเลขสองและ, : , + 2 การคำนวณ2 aสามารถทำได้ในการทำงานO ( 1 )ผ่านการเลื่อน ผนวก0 พิจารณาว่า อาจคุณไม่พบการประมาณที่เร็วขึ้นสำหรับผลรวมให้ปรับการประมาณนั้นจนกว่าจะถูกต้อง ในการดำเนินงานน้อยกว่าn ? ab,a:ab,a+b2a2aO(1)0n
Tobi Alafin

3
ใช่มันเป็นความจำเป็นทางทฤษฎีเพราะ: แต่ละบิตของการป้อนข้อมูลจะถูกใช้อย่างไม่สำคัญในผลลัพธ์โดยที่ไม่ใช่เรื่องไร้สาระฉันหมายถึงว่ามันไม่ใช่ฟังก์ชันตัวตน ในของคุณเช่นไม่ว่า2สามารถคำนวณได้ในO ( 1 )เวลาขึ้นอยู่กับรูปแบบการคำนวณ: ถ้าผนวก0คือการดำเนินการอย่างต่อเนื่องเวลาแล้วใช่ หากคุณมีการเข้าถึง RAM คุณต้องใช้เวลาO ( log ( n ) )ในการเขียนที่อยู่ของบิตหากคุณทราบความยาวของaหรือO ( n ) แล้ว2a2aO(1)0O(log(n))aO(n)เวลาถ้าคุณต้องอ่านทุกที่จะหา ในการนี้2ตัวอย่างเช่นบิตออกหลายฟังก์ชั่นที่น่ารำคาญของบิตการป้อนข้อมูล a2a
Lieuwe Vinkhuijzen

ฉันมีขั้นตอนวิธีการที่พบความยาวของที่ในO ( log n ) มันใช้การค้นหาแบบไบนารี aO(logn)
Tobi Alafin

3
@TobiAlafin ถ้ารุ่นของคุณรองรับการระบุที่อยู่แรมการค้นหาแบบไบนารี่ของคุณจะทำงานในขั้นตอนแก้ไข ทัวริงบนเครื่องและในแฟ้มข้อความไม่โหลดลงในหน่วยความจำหลักนี้จะใช้เวลาO ( n )เวลา ในทั้งสองกรณีที่จะตอบคำถามของคุณมีหรือไม่มีแรมอยู่เพื่อเพิ่มความเร็วในการค้นหาขั้นตอนวิธีการของคุณจะต้องมองทุกบิตของการป้อนข้อมูลในการคำนวณ+ สมมติว่ามันไม่ได้และการป้อนข้อมูลของ42บิตก็ไม่ได้ตรวจสอบ6บิต -th จากนั้นฉันสามารถพลิกมันได้และมันจะให้คำตอบที่ผิด O(logn)O(n)a+b426
Lieuwe Vinkhuijzen

1
Ω(n)

7

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

Θ(1)

Θ(|x|)

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


1
Θ(logn)n

3

Ω(n)

ลองนึกภาพอัลกอริทึมของคุณเพิ่ม 1010100110 และ 0010010110 โดยไม่อ่านแต่ละบิต เพื่อให้อัลกอริทึมของคุณสามารถเพิ่มอินพุตโดยพลการฉันควรจะสามารถสุ่มเลือกบิตใดบิตหนึ่งเหล่านี้และอัลกอริทึมยังคงเอาท์พุทที่ถูกต้อง (แต่แตกต่างกัน) แต่ถ้าอัลกอริทึมของคุณไม่อ่านทุกบิตมันจะบอกได้อย่างไรว่าอินพุตอินพุทนั้นแตกต่างจากอินพุตดั้งเดิมอย่างไร


n

อย่างแน่นอน คุณเพียงแค่ต้องกำหนดความหมาย "ประมาณ" ในอัลกอริทึมของคุณ ทั้งนี้ขึ้นอยู่กับความละเอียดที่เพิ่มสองบิตที่สำคัญที่สุดอาจจะเป็นผลรวมโดยประมาณซึ่งสามารถทำได้ในO (n)เวลา เมื่อคุณพูดถึงอัลกอริธึม "การเพิ่ม" ฉันคิดว่าเราทุกคนต่างเข้าใจถึงคำตอบที่แน่นอน
murrdpirate
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.