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


32

ฉันไม่ใช่นักเรียน CS ดังนั้นนี่อาจเป็นคำถามที่โง่ แต่โปรดอดทนกับฉัน ...

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

อย่างไรก็ตามการประดิษฐ์คอมพิวเตอร์สร้างความแตกต่างใหญ่ คอมพิวเตอร์สมัยใหม่สามารถอ่านจาก RAM ได้อย่างรวดเร็วจนตอนนี้เราพิจารณาความซับซ้อนของเวลาในการค้นหาอาร์เรย์เป็น (แม้จะไม่ใช่ในทางเทคนิคเพราะมันใช้เวลามากขึ้นในการย้ายรีจิสเตอร์ในระยะไกล ฯลฯ )O(1)

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

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

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


ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Gilles 'ดังนั้น - หยุดความชั่วร้าย'

คำตอบ:


42

แน่ใจ อย่างแน่นอน นี่คือวิธีการกระทบยอดความรู้สึกไม่สบายของคุณ

เมื่อเราวิเคราะห์เวลาทำงานของอัลกอริทึมเราจะทำการคำนวณด้วยแบบจำลองเฉพาะของการคำนวณ รูปแบบของการคำนวณระบุสิ่งต่าง ๆ เช่นเวลาที่ใช้ในการดำเนินการพื้นฐานแต่ละอย่าง (คือการค้นหาอาร์เรย์เวลาหรือO ( 1 )เวลา) เวลาทำงานของอัลกอริทึมอาจขึ้นอยู่กับรูปแบบการคำนวณO(เข้าสู่ระบบn)O(1)

เมื่อคุณเลือกรูปแบบการคำนวณแล้วการวิเคราะห์อัลกอริทึมคือแบบฝึกหัดทางคณิตศาสตร์ที่เป็นนามธรรมแนวคิดและแนวคิดซึ่งไม่ขึ้นอยู่กับฮาร์ดแวร์อีกต่อไป

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

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


ดังที่คุณกล่าวว่าเราใช้แบบจำลองการเข้าถึงแบบสุ่มเป็นแบบจำลองของการคำนวณ แต่เมื่อเราใช้ GPU สำหรับการคำนวณบางอย่างความซับซ้อนของเวลาสำหรับอัลกอริทึมบางอย่างเปลี่ยนแปลงตามที่ใช้คำสั่ง SIMD
Deep Joshi

6
โปรดสังเกตว่าสัญกรณ์ O () เป็นขอบเขตบน แม้ว่าคุณจะใช้การเปรียบเทียบการค้นหาลิ้นชักในขนาดที่ จำกัด (หน่วยความจำจริงมีขนาด จำกัด ) การสร้างใช้เวลา O (1) แม้ว่าคุณจะใช้เวลา 20 นาทีในการเข้าถึงลิ้นชักที่ไกลที่สุด (แคชทั้งหมดหายไปและคุณต้องโหลดข้อมูลจากการสลับ) ซึ่งยังคงเป็น O (1) เวลาเพราะ 20 นาทีจะเป็นค่าคงที่ซ่อนอยู่สำหรับการเข้าถึงหน่วยความจำ
Goswin von Brederlow

2
O(1)O(n)

1
@CortAmmon: แม้ในอาเรย์ขนาดใหญ่การใช้การค้นหาแบบเชิงเส้นอาจทำได้เร็วกว่าการใช้แฮชแม็พหากทุกอย่าง แต่องค์ประกอบบางอย่างของการค้นหานั้นอยู่ใกล้จุดเริ่มต้น ตัวอย่างเช่นถ้า 50% ขององค์ประกอบตรงกับองค์ประกอบแรก 25% ตรงกับที่สอง 12.5% ​​ตรงกับที่สาม ฯลฯ ยกเว้นว่าองค์ประกอบคี่บอลหนึ่งจะตรงกับสิ่งที่อาจจะเป็นที่ใดก็ได้ในอาร์เรย์จำนวนที่คาดหวังเปรียบเทียบกับ ดำเนินการค้นหา M ในรายการขนาด N จะเป็น 2M + N
supercat

5
@DeepJoshi คำแนะนำ SIMD ไม่เปลี่ยนความซับซ้อนของอัลกอริทึม พวกเขาเปลี่ยนค่าคงที่แบบหลายค่าเท่านั้น
Gilles 'หยุดความชั่วร้าย'

5

ฉันคิดว่ามีความเข้าใจผิดพื้นฐานในคำถาม คุณเปรียบเทียบบุคคลที่ค้นหาวัตถุในรายการที่เรียงลำดับ (เช่นหน้าเฉพาะในหนังสือตามหมายเลข) กับคอมพิวเตอร์เพื่อค้นหารายการจากอาร์เรย์

O(เข้าสู่ระบบn)O(1)

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


2
เพื่อความเป็นธรรมคุณข้ามชิ้นส่วนทั้งหมดในระหว่าง "ตัวควบคุมหน่วยความจำกำหนดแรงดันไฟฟ้าในสายที่อยู่เพื่อการแสดงไบนารีของเจ็ด" และ "ข้อมูลกลับมา" หนึ่งในนั้นคือแผนภูมิการค้นหาแบบไบนารีที่อธิบายโดย OP; แต่มันก็ยังคงดำเนินการอย่างต่อเนื่องในเวลาเพราะบันทึกnจะอยู่ที่ประมาณ 64 สำหรับทุก n
Quuxplusone

@Quuxplusone หน่วยความจำส่วนใดที่ใช้การค้นหาแบบไบนารี บรรทัดที่อยู่เลือกเซลล์หน่วยความจำโดยตรง
David Richerby

เรากำลังปฏิบัติการไกลนอกพื้นที่ของฉันความเชี่ยวชาญ แต่สิ่งที่ผมพยายามที่จะบ่งบอกก็คือการถอดรหัสที่อยู่จะดำเนินการในแง่ของต้นไม้แห่ง demuxers (สมมติว่าเรากดปุ่มหน่วยความจำทางกายภาพโดยตรงโดยไม่สนใจภาวะแทรกซ้อนใด ๆเพิ่มเติมที่มาพร้อมกับการแคช ) อีกครั้งความซับซ้อนพิเศษทั้งหมดนี้เพิ่มเพียงอย่างเดียวO(lg size-of-memory)คือเล็กน้อย - แต่นั่นเป็นบิตที่ OP ถาม
Quuxplusone

2

ไม่ฮาร์ดแวร์ไม่ส่งผลกระทบต่อความซับซ้อนของอัลกอริทึม

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

การค้นหา drawer ที่ถูกต้อง (เป็นการเข้าถึงองค์ประกอบอาร์เรย์) ใช้อัลกอริทึม "open Nth โดยตรงจากดัชนี" ไม่ใช่อัลกอริทึม "ค้นหาเชิงเส้น" หรือ "ทำการค้นหาแบบไบนารี" อัลกอริทึมจะไม่เปลี่ยนแปลง แต่เป็นทางเลือก

ในทางกลับกันการวิเคราะห์ความซับซ้อนของตัวเองหรือค่อนข้างมีความหมายนั้นได้รับผลกระทบอย่างมากจากฮาร์ดแวร์

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

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

สิ่งนี้นำไปสู่ความประหลาดใจตลกเช่นใน Cuckoo Hashing เมื่อไม่กี่ปีที่ผ่านมา ซึ่งเหนือกว่าอย่างมากมายเพราะ [รายการผลประโยชน์ที่ยาวนาน] หลังจากโฆษณาเย็นลงแล้วมันกลับกลายเป็นว่าด้อยกว่าอย่างมากเพราะรับประกันว่าจะพลาดแคชสองรายการ (ความผิดพลาดสำหรับชุดข้อมูลขนาดใหญ่) ในทุกการเข้าถึง

เกิดขึ้นคล้ายกันในการระบุและประมวลผลชุดย่อยของข้อมูล บ่อยครั้งที่วิธีแก้ปัญหาที่ถูกต้องในปัจจุบันคือ: "ทำมันทั้งหมด"เช่นแทนที่จะค้นหาสิ่งที่คุณต้องการในการทำและทำเช่นนั้นประมวลผลชุดข้อมูลที่สมบูรณ์แบบเชิงเส้นแม้ว่าคุณอาจต้องการเพียงครึ่งหนึ่งก็ตาม เพราะเชื่อหรือไม่ว่าเร็วกว่านี้เนื่องจากไม่มีการคาดคะเนความผิดพลาดจากสาขาไม่มีการพลาดแคชไม่มีข้อบกพร่องของหน้า
ต้องการอ่าน 8kB แรกและ 3kB สุดท้ายของไฟล์ 3MB หรือไม่ อ่านไฟล์ที่สมบูรณ์แล้วทิ้งสิ่งที่คุณไม่ต้องการเพราะการค้นหาในนั้นจะช้ากว่าการอ่านสิ่งที่สมบูรณ์สิบเท่า

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

ดังนั้นจึงไม่ใช่อัลกอริทึมต่อ se ที่ได้รับผลกระทบ แต่มีประโยชน์และเป็นทางเลือก

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