การเรียงลำดับในวิทยาการคอมพิวเตอร์เทียบกับการเรียงลำดับในโลกแห่งความเป็นจริง


87

ฉันกำลังคิดเกี่ยวกับการจัดเรียงอัลกอริทึมในซอฟต์แวร์และวิธีที่เป็นไปได้ที่เราจะเอาชนะO(nlogn)อุปสรรคได้ ฉันไม่คิดว่าจะเรียงลำดับได้เร็วขึ้นในแง่ที่ใช้งานได้จริงดังนั้นโปรดอย่าคิดว่าฉันทำ

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

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

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

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

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

ประเด็นที่ว่าเครื่องหมุนเหวี่ยงที่เป็นฟองแบบขนานนั้นดูเหมือนจะถูกต้องซึ่งมีความซับซ้อนของO(n)เวลา

ฉันเดาความคิดต่อไปคือถ้าธรรมชาติสามารถเรียงลำดับได้O(n)ทำไมคอมพิวเตอร์ไม่ได้?


44
เครื่องหมุนเหวี่ยงเป็นเพียงการใช้งานการเรียงฟองแบบขนานอย่างหนาแน่นไม่มีอะไรน่าสนใจ
el.pescado

3
เมื่อมีnโปรเซสเซอร์ (คอร์) ในการจัดเรียงอาร์เรย์ของเฉพาะnรายการคุณสามารถบรรลุO(n)ความซับซ้อนได้อย่างง่ายดาย ความจริงที่น่าขมขื่นคือเราต้องเรียงอาร์เรย์แบบยาว (หลายพันล้านรายการ) บน CPU ที่มี 2..10 คอร์เท่านั้น
Dmitry Bychenko

24
โปรดทราบว่าบันทึก n n คือจำนวนของรถที่จะต้องทำในการเรียงลำดับที่เปรียบเทียบคู่ของรายการ มีความต้องการที่ขั้นตอนวิธีการเรียงลำดับไม่เปรียบเทียบคู่ของรายการ ; หากคุณสามารถจัดเรียงที่ไม่ทำการเปรียบเทียบแบบคู่คุณสามารถทำให้เร็วกว่า n log n
Eric Lippert

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

4
ฉันโหวตให้ปิดคำถามนี้เป็นนอกประเด็นเพราะเป็นของ cs.stackexchange.com
Robert Fraser

คำตอบ:


71

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

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

บางขั้นตอนวิธีการเรียงลำดับอื่น ๆ ที่ไม่ได้มีการเปรียบเทียบBucket เรียงลำดับและการนับเรียง คุณอาจพบว่าการจัดเรียงถังยังสอดคล้องกับแนวคิดทั่วไปของเครื่องหมุนเหวี่ยง (รัศมีอาจสอดคล้องกับถังขยะ)

อีกประการหนึ่งที่เรียกว่า 'การเรียงลำดับขั้นตอนวิธีการ' ซึ่งแต่ละองค์ประกอบมีการพิจารณาในการแยกเป็นเรียงนอน เวลานี้แทนที่จะเป็นแรงเหวี่ยงทำหน้าที่เป็นขนาดที่ใช้ในการเรียงลำดับ


นี่เป็นคำตอบที่ถูกต้อง - การเรียงลำดับ bin / การเรียงลำดับเรดิกซ์มีความซับซ้อน O (n) หากถังขยะและอินพุตสามารถเข้าถึงได้ในเวลา O (1)
pjc50

5
ฉันจะถามว่า "มีใครคิดถึง Sleep Sort ทันทีไหม"
ถูกใจ

เครื่องหมุนเหวี่ยงทำงานโดยการเปรียบเทียบองค์ประกอบ ฟังก์ชันแฮชคือความหนาแน่น (โดยหลัก) ตัวอย่างเช่นหากคุณหมุนเหวี่ยงส่วนผสมของโพรเพนและอากาศคุณจะได้รับโพรเพนที่เรียงตามขอบเขต แต่ถ้าคุณหมุนเหวี่ยงโพรเพนกับน้ำคุณจะได้รับโพรเพนที่ถูกจัดเรียงไปที่ศูนย์กลาง กระบวนการนี้เกือบจะเหมือนกับกระบวนการทางกายภาพที่ตั้งชื่อ "การเรียงฟอง"
ณัฐ

ความซับซ้อนของ SleepSort ไม่ได้ขึ้นอยู่กับตัวกำหนดตารางเวลาจริงหรือ?
Morwenn

@Morwenn ตัวกำหนดตารางเวลาลินุกซ์เก่าคือ O (1) ในขณะที่ตัวใหม่คือ O (log n) ทั้งสองอย่างนี้มีน้ำหนักเกินดุลจากปัจจัยคงที่ในการนอนหลับ
user1952500

35

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

แบบจำลองการคำนวณแบบหมุนเหวี่ยงมีคุณสมบัติที่น่าสนใจ ตัวอย่างเช่น:

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

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


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

29

เคล็ดลับคือคุณมีความน่าจะเป็นในการจัดเรียงรายการของคุณโดยใช้เครื่องหมุนเหวี่ยงเท่านั้น เช่นเดียวกับประเภทอื่น ๆ ในโลกแห่งความเป็นจริง [ต้องการอ้างอิง] คุณสามารถเปลี่ยนความน่าจะเป็นที่คุณจัดเรียงรายการของคุณได้ แต่อย่ามั่นใจโดยไม่ตรวจสอบค่าทั้งหมด (อะตอม)

ลองพิจารณาคำถาม: "คุณควรใช้เครื่องหมุนเหวี่ยงนานแค่ไหน?"
หากคุณเรียกใช้เพียง picosecond ตัวอย่างของคุณอาจถูกจัดเรียงน้อยกว่าสถานะเริ่มต้น .. หรือถ้าคุณใช้งานไปสองสามวันก็อาจถูกจัดเรียงอย่างสมบูรณ์ อย่างไรก็ตามคุณจะไม่รู้หากไม่ได้ตรวจสอบเนื้อหาจริงๆ


นั่นเป็นจุดที่ดีทีเดียว คุณรู้ได้อย่างไร? ถ้าอย่างนั้นถ้ากฎดีพอคุณจะสนใจที่จะรู้หรือไม่? (กล่าวคือถ้าคุณทำให้ความน่าจะเป็นต่ำจนกลายเป็นเรื่องเล็กน้อย)
Kris

คุณสามารถคำนวณระยะเวลาที่อนุภาคจะถึงจุดสิ้นสุดของเครื่องหมุนเหวี่ยงได้เสมอ คุณรู้จักความเร่ง (w ^ 2 * r โดยที่ w คือความเร็วเชิงมุม) และคุณสามารถคำนวณเวลาได้
user1952500

1
ทรู แต่เป็นที่สับสนเคลื่อนที่ , กองกำลังอะตอมอื่น ๆและควอนตัมฟิสิกส์ (ขอบคุณสิ่งเล็ก ๆ !) คุณยังไม่สามารถแน่ใจได้อย่างสมบูรณ์คุณได้เรียงรายการของคุณจนกว่าคุณจะตรวจสอบรัฐ
ti7

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

1
@ คริสเรารู้ว่าเครื่องหมุนเหวี่ยงไม่ได้เรียงลำดับอย่างสมบูรณ์แบบ เราทำไปเรื่อย ๆ จนกว่าความแตกต่างจะไม่สำคัญสำหรับจุดประสงค์ในทางปฏิบัติอีกต่อไปเช่นการป้องกันการแข็งตัวของเลือดในเครื่องหมุนเหวี่ยงเลือดของคุณ แต่ดูที่เครื่องหมุนเหวี่ยงยูเรเนียมซึ่งจำเป็นต้องจัดเรียงรายการที่ "ใกล้กว่า" มาก (แยกยากกว่า) และต้องการสิ่งอำนวยความสะดวกขนาดใหญ่ที่จัดเรียงซ้ำแล้วซ้ำอีกด้วยค่าใช้จ่ายจำนวนมากเพื่อผลิตวัสดุที่ต้องการจำนวนเล็กน้อย และเครื่องหมุนเหวี่ยงมีขนาดที่แน่นอนและเวลาในการแยกเป็นสัดส่วนกับความกว้างของท่อและ ... คุณไม่สามารถพูดว่า O (n) เย้!
Luaan

5

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

สำหรับ "การเรียงลำดับ" โดรนอาจถูกตั้งโปรแกรมให้สร้างเส้นหรือรูปแบบตามลำดับที่เฉพาะเจาะจงโดยเริ่มแรกจะถูกปล่อยออกมาในรูปแบบการเรียงสับเปลี่ยนหรือรูปร่างใด ๆ และรวมกันและขนานกันอย่างรวดเร็วพวกมันจะสร้างบรรทัดหรือรูปแบบที่สั่ง

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

รู้ตำแหน่งของแต่ละองค์ประกอบ

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


4

IMHO คนคิดมาก log (n) O (nlog (n)) เป็นจริง O (n) และคุณต้องมี O (n) เพื่ออ่านข้อมูล

อัลกอริทึมหลายอย่างเช่น Quicksort เป็นวิธีที่รวดเร็วมากในการจัดเรียงองค์ประกอบ คุณสามารถใช้ Quicksort รูปแบบต่างๆซึ่งจะรวดเร็วมากในทางปฏิบัติ

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

จากความคิดเห็น:

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

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


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

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

ขีด จำกัด นั้นใช้กับออบเจ็กต์ QM ด้วยหรือไม่ แค่อยากรู้อยากเห็น
Kris

1
@ คริสฉันไม่เข้าใจ QM ในเชิงลึกมากพอที่จะตอบได้
ElKamina

ไม่ต้องห่วง! ฉันแค่อยากรู้อยากเห็นมากและดูเหมือนจะนอนไม่หลับฮ่า ๆ ขอบคุณสำหรับคำตอบที่น่าสนใจ
Kris

4

ฉันทำงานในออฟฟิศช่วงฤดูร้อนหลังมัธยมปลายเมื่อฉันเริ่มเรียนวิทยาลัย ผมได้ศึกษาใน AP วิทยาการคอมพิวเตอร์ในสิ่งอื่น ๆเรียงลำดับและการค้นหา

ฉันใช้ความรู้นี้ในระบบทางกายภาพหลายอย่างที่ฉันจำได้:

การเรียงลำดับการผสานตามธรรมชาติเพื่อเริ่มต้น ...

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

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

จากนั้นผสานสแต็กแต่ละคู่เข้าด้วยกันทำให้ได้สแต็กที่ใหญ่ขึ้น ทำซ้ำจนกว่าจะมีเพียงกองเดียว

…เรียงลำดับการแทรกให้เสร็จสมบูรณ์

ง่ายกว่าในการยื่นการ์ดที่เรียงลำดับเนื่องจากแต่ละใบถัดไปอยู่ห่างออกไปเล็กน้อยในลิ้นชักที่เปิดอยู่เดียวกัน

เรียง Radix

สิ่งนี้ไม่มีใครเข้าใจว่าฉันทำมันเร็วขนาดนี้ได้อย่างไรแม้จะพยายามสอนมันซ้ำแล้วซ้ำเล่า

ต้องจัดเรียงกล่องตรวจสอบขนาดใหญ่ (ขนาดของบัตรเจาะรู) ดูเหมือนการเล่นไพ่คนเดียวบนโต๊ะขนาดใหญ่ - แจกไพ่สแต็คอัพเล่นซ้ำ

โดยทั่วไป

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

ก้าวไปไกลกว่าการเทียบเท่าที่เข้าใจกันดี

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

จากนั้นจับมัดแล้วแตะปลายด้านหนึ่งบนโต๊ะ พวกเขาจัดแนวที่ขอบด้านล่างและตอนนี้พวกเขาถูกจัดเรียงแล้ว คุณสามารถถอดอันที่ยาวที่สุดออกเล็กน้อยแล้วทำซ้ำ การอ่านค่ายังเป็น O (n)

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

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

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


การเรียงสปาเก็ตตี้เป็นเรื่องสนุก ฉันสนุกกับการคิดเรื่องนี้ แต่ฉันวิจารณ์การสแกนหาเส้นก๋วยเตี๋ยวที่ยาวที่สุด นี่ไม่ใช่การดำเนินการ O (1) จริงๆเนื่องจากคุณสแกนบะหมี่ ลองนึกภาพบะหมี่หมื่นเส้นและอีกสองสามเส้นที่มีความยาวใกล้เคียงกัน ... มันไม่ใช่การทำ O (1) "eyeball it" ในความเป็นจริงเราต้องสแกนบะหมี่ที่ไม่ได้เรียงลำดับทั้งหมดเพื่อหาเส้นที่ยาวที่สุด
ThisClark

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

1
@ThisClark คุณต้องการจิ๊กที่แม่นยำกว่านี้: ระนาบแบนขนานกับตัวหยุดที่ด้านล่างที่จัดแนวเส้นก๋วยเตี๋ยว ค่อยๆลดมันลงจนกว่าเส้นก๋วยเตี๋ยว (ที่สูงที่สุด) จะถูกแตะและวางไว้ภายใต้การบีบอัด การเปรียบเทียบความสูงของระนาบกับเส้นก๋วยเตี๋ยวทุกเส้นจะทำควบคู่กันโดยเส้นก๋วยเตี๋ยวนั้น คุณกำลังแนะนำว่าจำเป็นต้องมีค่าสัมประสิทธิ์ที่สูงขึ้น แต่อาร์กิวเมนต์นั้นไม่ได้เปลี่ยน Big-O
JDługosz

3

การเรียงลำดับยังคงเป็นเวลารวม O (n) ว่ามันจะเร็วกว่าที่เป็นเพราะของแบบขนาน

คุณสามารถมองว่าเครื่องหมุนเหวี่ยงเป็นBucketsortของ n อะตอมขนานกันเหนือแกน n (แต่ละอะตอมทำหน้าที่เป็นตัวประมวลผล)

คุณสามารถเรียงลำดับได้เร็วขึ้นโดยการขนาน แต่ด้วยปัจจัยคงที่เท่านั้นเนื่องจากจำนวนโปรเซสเซอร์มี จำกัด O (n / C) ยังคงเป็น O (n) (โดยปกติแล้ว CPU จะมี <10 คอร์และ GPU <6000)


2

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

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

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


1

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

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

สิ่งที่คล้ายกับเครื่องหมุนเหวี่ยงซึ่งแต่ละองค์ประกอบเท่านั้นที่สนใจเกี่ยวกับตำแหน่งสัมพัทธ์ในอวกาศ (สัมพันธ์กับโหนดอื่น ๆ )

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

ดังนั้นเพื่อตอบคำถามนี้เราไม่ได้ทำบางอย่างในการเรียงลำดับตามซอฟต์แวร์จริงหรือ?


1
ฉันคิดว่าคุณพูดถูก ฉันคิดว่าจุดที่ฉันสูญเสียการเปรียบเทียบตรงนี้คือฉันลืมไปว่าแต่ละโมเลกุลทำหน้าที่ขนานกัน มันจะเหมือนการเรียงฟองแบบขนาน ...
คริส

1

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

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

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


0

อีกมุมมองหนึ่งคือสิ่งที่คุณกำลังอธิบายด้วยเครื่องหมุนเหวี่ยงนั้นคล้ายคลึงกับสิ่งที่เรียกว่า "spaghetti sort" ( https://en.wikipedia.org/wiki/Spaghetti_sort ) สมมติว่าคุณมีแท่งสปาเก็ตตี้ดิบๆหนึ่งกล่องที่มีความยาวต่างกัน จับมันไว้ในกำปั้นของคุณและคลายมือของคุณเพื่อลดลงในแนวตั้งเพื่อให้ปลายทั้งหมดวางอยู่บนโต๊ะแนวนอน ตูม! เรียงตามความสูง O (คงที่) เวลา (หรือ O (n) ถ้าคุณรวมเอาแท่งออกตามความสูงแล้ววางไว้ใน a.. ชั้นสปาเก็ตตี้ฉันเดาว่า?)

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


นั่นคือสิ่งเดียวกับที่ฉันพูดเมื่อ 11 ชั่วโมงก่อนหน้านี้ และฉันได้อธิบายต่อไปว่าระบบทางกายภาพให้คุณหารด้วย n หรือด้วยn²และคงรูปแบบของ algoritms และการคำนวณไว้ได้อย่างไร
JDługosz

0

ลองพิจารณา: "การจัดเรียงเครื่องหมุนเหวี่ยง" มีขนาดที่ดีขึ้นจริงหรือ ลองนึกถึงสิ่งที่เกิดขึ้นเมื่อคุณขยายขนาด

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

นอกจากนี้ยังควรพิจารณาปัญหาอื่น ๆ เกี่ยวกับการจัดเรียงเครื่องหมุนเหวี่ยง ตัวอย่างเช่นคุณสามารถใช้งานได้เฉพาะในขนาดที่แคบเท่านั้น อัลกอริธึมการจัดเรียงคอมพิวเตอร์สามารถจัดการกับจำนวนเต็มตั้งแต่ 1 ถึง 2 ^ 1024 ขึ้นไปได้โดยไม่ต้องเสียเหงื่อ ใส่สิ่งที่มีน้ำหนัก 2 ^ 1024 เท่าของไฮโดรเจนอะตอมลงในเครื่องหมุนเหวี่ยงและนั่นคือหลุมดำและกาแลคซีถูกทำลาย อัลกอริทึมล้มเหลว

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

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