การคำนวณแบบใดที่ "ดีที่สุด"?


41

ใน 1,937 ทัวริงอธิบายเครื่องทัวริง. ตั้งแต่นั้นมาแบบจำลองการคำนวณจำนวนมากได้ถูก decribed ในความพยายามที่จะหารูปแบบที่เหมือนคอมพิวเตอร์จริง แต่ก็ยังง่ายพอที่จะออกแบบและวิเคราะห์อัลกอริทึม

ด้วยเหตุนี้เราจึงมีอัลกอริทึมหลายสิบตัวอย่างเช่น SORT-problem สำหรับแบบจำลองการคำนวณที่แตกต่างกัน น่าเสียดายที่เราไม่สามารถมั่นใจได้ว่าการใช้อัลกอริทึมที่มีเวลารัน O (n) ใน word RAM ที่อนุญาตให้ใช้บิต - เวกเตอร์จะทำงานได้เร็วกว่าการใช้อัลกอริทึมที่มีรันไทม์ O (n⋅logn) ใน คำ RAM (ฉันกำลังพูดถึงการใช้งาน "ดี" เท่านั้นแน่นอน)

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


1
ข้ามการโพสต์ใน MathOverflow ( mathoverflow.net/questions/44558/… ) แต่ถูกเปลี่ยนเส้นทางที่นี่
Dave Clarke

@Tatiana คำถามที่ดีคุณหมายถึงอะไร "the best"? คุณหมายถึงโมเดลที่มีเวลาทำงานตามทฤษฎีซึ่งใกล้เคียงกับรันไทม์ "ของจริง" หรือไม่?
Mohammad Al-Turkistany

8
หากคุณกำลังมองหาโมเดลเวลาทำงาน "ของจริง" ที่ถูกต้องดูเหมือนว่าอาจเป็นเรื่องสำคัญที่จะต้องสร้างโมเดลแคชอย่างแม่นยำ โดยเฉพาะอย่างยิ่งการคำนวณสมัยใหม่นั้นมีหลายระดับของการแคช (CPU, RAM, Disk, etc ... ) โดยบางเลเยอร์เป็นคำสั่งของขนาดที่ช้ากว่าตัวอื่น ๆ มันไม่ได้เป็นคำถามสำหรับรันไทม์ "ของจริง" ของอัลกอริทึมที่จะถูกกำหนดโดยจำนวนของแคชที่หายไป โดยทั่วไปฉันได้ยินมาว่าเหตุผลหนึ่งที่วิธีการเชิงเส้นในการโปรแกรมเชิงเส้นทำงานได้ดีแม้จะมีการรับประกันทางทฤษฎีที่ไม่ดีก็ตามเพราะพวกเขามักจะมีประสิทธิภาพในการแคช
mhum

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

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

คำตอบ:


30

ฉันคิดเสมอว่ารุ่นของ Word RAM มาตรฐานจะ "ดีที่สุด" ในแง่ของคุณ ทุกคนที่เรียนรู้ที่จะเขียนโปรแกรมในภาษาอย่าง C (หรือสิ่งที่เทียบเท่าอย่าง Java หรืออื่น ๆ ) มีรูปแบบนี้ในใจเมื่อพวกเขานึกถึงคอมพิวเตอร์

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

O(n)O(nlgn)nn

คำพูดสุดท้ายเกี่ยวกับอัลกอริทึมและ "ความจริง": ระลึกไว้เสมอว่าคุณกำลังพยายามทำอะไรอยู่ เมื่อเราทำงานในอัลกอริธึมเรากำลังพยายามแก้ไขปัญหาที่ยากที่สุด (เช่น SAT บนตัวแปร 50 ตัวหรือเรียงลำดับหมายเลขหนึ่งพันล้านหมายเลข) หากคุณพยายามจัดเรียงตัวเลข 200 หมายเลขหรือแก้ SAT ใน 20 ตัวแปรคุณไม่จำเป็นต้องมีอัลกอริธึมแฟนซี นั่นเป็นเหตุผลที่อัลกอริธึมส่วนใหญ่ในความเป็นจริงเป็นเรื่องไม่สำคัญ นี่ไม่ได้พูดอะไรที่เลวร้ายเกี่ยวกับการวิจัยอัลกอริทึม - เราเพิ่งจะสนใจในปัญหา 1/1000 ที่ผิดปกติที่เกิดขึ้นยาก ...


ขอบคุณสำหรับคำตอบของคุณ ฉันต้องการที่จะเข้าใจซึ่งลักษณะทั่วไปที่มีมูลค่าเพิ่มให้กับ word RAM เราสามารถอธิบายโมเดลซึ่งจะรวมถึงเทคนิคเหล่านี้ทั้งหมดเช่นการดำเนินงานบิต - เวกเตอร์การขนานกันแคชและยังคงง่าย?
Tatiana Starikovskaya

10

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

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

ต้องบอกว่าถ้าคุณแค่อยากรู้ว่าอัลกอริทึมของคุณมีแนวโน้มที่จะทำงานได้เร็วหรือไม่ :-)


2
ฉันคิดว่าถ้าคุณกำลังหลีกเลี่ยงการดำเนินการทางคณิตศาสตร์ bitwise หรือ word-model ในความพยายามที่จะหลีกเลี่ยงปัญหา "เครื่องโตขึ้นด้วยขนาดอินพุต" แต่ยังคงใช้ RAM หรือเครื่องชี้ราคาแบบเดียวกันคุณก็แค่หลอกตัวเอง: รุ่นอื่น ๆ นั้นมีปัญหาเดียวกัน พวกเขาทำดัชนีอินพุตของพวกเขาอย่างไร? คำตอบคือ: คอมพิวเตอร์จริงไม่มีหน่วยความจำหมด แต่แม้ว่ามันจะยังสะดวกกว่าในการออกแบบอัลกอริธึมสำหรับพวกเขาโดยสมมติว่าพวกเขาเป็น RAM (หรืออาจจะดีกว่าที่จะใช้แบบจำลองที่บัญชีสำหรับต้นทุนลำดับชั้นหน่วยความจำ) DFA
David Eppstein

4
แบบจำลอง RAM ที่ Knuth อธิบายเช่นราคา w เวลาในการค้นหาที่อยู่ด้วย w bits และเวลา w ที่คล้ายกันเพื่อเพิ่มหมายเลข w สองบิต (นี่คือวิธีที่เขาได้รับ Theta (n log n) สำหรับเวลาคูณสอง n ตัวเลขบิตในรูปแบบ RAM โดยไม่มีการดำเนินการเกี่ยวกับคำ) เป็นที่น่าสนใจว่าโมเดลที่เป็นที่ยอมรับมากที่สุดมีการเปลี่ยนแปลงอย่างไรในช่วง 20 ปีที่ผ่านมาและจำนวนโมเดลที่ไม่เคยมีการกล่าวถึงในอีกต่อไป
Raphael

8

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

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

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


3
ฉันมีสองข้อคัดค้าน ประการแรกนักทฤษฎีไม่มากที่ใช้อัลกอริทึมและยังเราจะเปรียบเทียบพวกเขาอย่างใด ประการที่สองฉันต้องการเข้าใจว่าคุณลักษณะใดของคอมพิวเตอร์ที่เราอาจเพิ่มลงในแบบจำลองที่ไม่ทำให้ความเรียบง่ายของมันลดลง
Tatiana Starikovskaya

11
วิธีแก้ปัญหาที่เสนอของ David Johnson สำหรับเรื่องนี้คือเพื่อให้ผู้คนจำนวนมากใช้อัลกอริทึม - เขาเริ่ม ALENEX และความท้าทาย DIMACS เพื่อแก้ไขปัญหานี้ ฉันมีประสบการณ์กับสิ่งนี้เช่นกัน ด้วย Ken Clarkson ฉันได้คิดค้นอัลกอริธึมฮัลล์แบบสุ่มที่เราคิดว่าจะทำงานได้ดีในทางปฏิบัติ Clarkson มีนักเรียนภาคฤดูร้อนที่ Bell Labs ใช้งาน ตามแนวคิดของการดำเนินการนี้ความคิดต่าง ๆ ได้ถูกนำไปใช้ในโปรแกรม qhull (เขียนที่ Geometry Center) แต่ด้วยการเร่งความเร็วแบบฮิวริสติกบางตัวซึ่งหมายความว่าอัลกอริทึมไม่ได้รับประกันทฤษฎีว่ามันจะทำงานได้อย่างรวดเร็ว
Peter Shor

5

หากงานการคำนวณของคุณเกี่ยวกับการย้ายข้อมูลมากกว่าการดำเนินการ (เลขคณิต) (ชุดข้อมูลมีขนาดใหญ่มากจนไม่เข้ากับหน่วยความจำหลัก) ดังนั้นโมเดล I / O (แนะนำโดยAggarwal และ Vitter ในปี 1988 ) สามารถแม่นยำมาก สำหรับงานต่าง ๆ เช่นการอนุญาตให้มีองค์ประกอบจำนวนมากในหน่วยความจำหลักมันสามารถช่วยในการใช้อัลกอริธึมที่เหมาะสมกับ I / O (ในการใช้งานอย่างระมัดระวัง)

สำหรับคอมพิวเตอร์แบบ multi-core ที่ทันสมัยตัวแปรขนานที่ได้รับการแนะนำโดยArge, Goodrich, Nelson และ Sitchinava ในปี 2008เป็นแบบจำลองที่แม่นยำ


5

หากคุณหมายถึงรูปแบบการคำนวณที่ดีที่สุดที่จะทำให้ชีวิตของคุณซับซ้อนขึ้นคุณสามารถใช้เครื่องจักรทัวริงทัวริง 2 สัญลักษณ์ 3 สถานะของ Wolfram

ข้อดี : ไม่มียกเว้นความรู้สึกของการเดินเส้นระหว่างเหตุผลและความบ้าคลั่ง;

ข้อเสีย : ตัน ...

:-D (เพียงเรื่องตลกโดยทั่วไปฉันเห็นด้วยกับคำตอบก่อนหน้า ... )


1

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

อ้างจากนามธรรม:

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

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

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