คำถามติดแท็ก sorting

ปัญหาอัลกอริทึมของการสั่งซื้อชุดองค์ประกอบที่เกี่ยวกับความสัมพันธ์ในการสั่งซื้อบางส่วน

11
เหตุใด Quicksort จึงดีกว่าอัลกอริธึมการเรียงลำดับอื่น ๆ ในทางปฏิบัติ
ในหลักสูตรอัลกอริทึมมาตรฐานเราได้รับการสอนว่าquicksortคือโดยเฉลี่ยและในกรณีที่แย่ที่สุด ในเวลาเดียวกันขั้นตอนวิธีการเรียงลำดับอื่น ๆ มีการศึกษาซึ่งเป็นในกรณีที่เลวร้ายที่สุด (เช่นmergesortและheapsort ) และเวลาแม้กระทั่งการเชิงเส้นในกรณีที่ดีที่สุด (เช่นการเรียงลำดับแบบฟอง ) แต่มีความต้องการเพิ่มเติมบางส่วนของหน่วยความจำO ( n 2 ) O ( n log n )O ( n บันทึกn )O(nlog⁡n)O(n \log n)O ( n2)O(n2)O(n^2)O ( n บันทึกn )O(nlog⁡n)O(n \log n) หลังจากมองผ่าน ๆ ในเวลาที่วิ่งเร็วขึ้นมันเป็นเรื่องธรรมดาที่จะบอกว่า quicksort ไม่ควรมีประสิทธิภาพเหมือนกับคนอื่น ๆ นอกจากนี้ให้พิจารณาว่านักเรียนเรียนรู้ในหลักสูตรการเขียนโปรแกรมพื้นฐานที่การเรียกซ้ำโดยทั่วไปไม่ดีนักเพราะอาจใช้หน่วยความจำมากเกินไป ฯลฯ ดังนั้น (และแม้ว่านี่จะไม่ใช่การโต้แย้งจริง) สิ่งนี้ทำให้เกิดความคิดว่า ดีจริงๆเพราะเป็นอัลกอริทึมแบบเรียกซ้ำ เหตุใด quicksort จึงมีประสิทธิภาพสูงกว่าอัลกอริทึมการเรียงลำดับอื่น ๆ …


8
อัลกอริธึมการเรียงลำดับที่เร็วที่สุดสำหรับอาเรย์ของจำนวนเต็มคืออะไร?
ฉันเจออัลกอริธึมการเรียงลำดับจำนวนมากในระหว่างที่เรียนอยู่มัธยม อย่างไรก็ตามฉันไม่เคยรู้ว่าอันไหนเร็วที่สุด (สำหรับอาร์เรย์จำนวนเต็มแบบสุ่ม) ดังนั้นคำถามของฉันคือ: อัลกอริทึมการเรียงลำดับที่รู้จักกันเร็วที่สุดในขณะนี้คืออะไร ในทางทฤษฎีมันเป็นไปได้ไหมที่จะมีคนที่เร็วขึ้น? ดังนั้นการเรียงลำดับที่ซับซ้อนน้อยที่สุดคืออะไร?

5
อัลกอริทึมการเรียงลำดับนี้เป็นอย่างไร³ (n³) และไม่Θ (n²) เป็นกรณีที่เลวร้ายที่สุด?
ฉันเพิ่งเริ่มเรียนหลักสูตรโครงสร้างข้อมูลและอัลกอริธึมและผู้ช่วยสอนของฉันให้รหัสหลอกต่อไปนี้สำหรับการเรียงลำดับอาร์เรย์ของจำนวนเต็ม: void F3() { for (int i = 1; i < n; i++) { if (A[i-1] > A[i]) { swap(i-1, i) i = 0 } } } อาจไม่ชัดเจน แต่ที่นี่คือขนาดของอาร์เรย์ที่เราพยายามเรียงลำดับnnnA ในกรณีใด ๆ ผู้ช่วยสอนอธิบายให้ชั้นเรียนรู้ว่าอัลกอริทึมนี้อยู่ในเวลา (แย่ที่สุดฉันเชื่อ) แต่ไม่ว่าฉันจะผ่านมันไปกี่ครั้งด้วยอาเรย์เรียงกลับด้าน มันดูเหมือนว่าฉันที่มันควรจะเป็นและไม่ได้3)Θ(n3)Θ(n3)\Theta(n^3)Θ(n2)Θ(n2)\Theta(n^2)Θ(n3)Θ(n3)\Theta(n^3) คนที่จะสามารถอธิบายให้ฉันทำไมนี้เป็นΘ(n3)Θ(n3)Θ(n^3)และไม่Θ(n2)Θ(n2)Θ(n^2) ?

3
กรณีที่เลวร้ายที่สุดในการจัดเรียงที่มั่นคง?
ฉันมีปัญหาในการค้นหาแหล่งข้อมูลที่ดีซึ่งเป็นกรณีที่แย่ที่สุดในขั้นตอนวิธีการเรียงลำดับที่เสถียร ไม่มีใครรู้แหล่งข้อมูลที่ดีบ้างไหม?O(nlnn)O(nln⁡n)O(n \ln n) เพียงเตือนความจำในสถานที่หมายความว่ามันใช้อาร์เรย์ส่งผ่านและขั้นตอนวิธีการเรียงลำดับได้รับอนุญาตเท่านั้นที่จะใช้พื้นที่พิเศษคงที่ Stable หมายถึงองค์ประกอบที่มีคีย์เดียวกันปรากฏในลำดับเดียวกันในอาร์เรย์ที่เรียงลำดับเหมือนที่เคยเป็นในต้นฉบับ ตัวอย่างเช่นการเรียงลำดับที่ไร้เดียงสาเป็นกรณีที่เลวร้ายที่สุดและเสถียร แต่ใช้พื้นที่พิเศษquicksort มาตรฐานสามารถทำมั่นคงอยู่ในสถานที่ แต่ที่เลวร้ายที่สุดกรณี2) มี Heapsort อยู่กรณีที่เลวร้ายที่สุดแต่ไม่เสถียร Wikipediaมีแผนภูมิที่ดีซึ่งอัลกอริทึมการเรียงลำดับมีข้อบกพร่องใด โปรดสังเกตว่าไม่มีอัลกอริทึมการเรียงลำดับที่แสดงรายการที่มีเงื่อนไขความเสถียรทั้งสามกรณีที่เลวร้ายที่สุดและอยู่ในตำแหน่งO(nlnn)O(nln⁡n)O(n \ln n)O(n)O(n)O(n)O(n2)O(n2)O(n^2)O(nlnn)O(nln⁡n)O(n \ln n)O(nlnn)O(nln⁡n)O(n \ln n) ฉันได้พบเอกสารที่เรียกว่า"การผสานการใช้งานจริงในสถานที่"โดย Katajainen, Pasanen และ Teuhola ซึ่งอ้างว่ามีกรณีที่เลวร้ายที่สุดในรูปแบบการรวมตัวแปรที่เสถียร ถ้าฉันเข้าใจผลลัพธ์ของพวกเขาถูกต้องพวกมันจะใช้การรวม (bottom-up?) ซ้ำในของอาร์เรย์และหลังของแถวและใช้ตัวที่สองเป็นพื้นที่เริ่มต้นในการรวม ฉันยังคงอ่านผ่านทางนี้ดังนั้นข้อมูลเพิ่มเติมเกี่ยวกับว่าฉันตีความผลของพวกเขาอย่างถูกต้องชื่นชมO(nlnn)O(nln⁡n)O(n \ln n)1414\frac{1}{4}1212\frac{1}{2}1414\frac{1}{4} ฉันก็จะสนใจในกรณีที่เลวร้ายที่สุดในสถานที่ที่มั่นคงอย่างรวดเร็ว จากสิ่งที่ฉันเข้าใจการแก้ไข quicksort เป็นกรณีที่เลวร้ายที่สุดต้องเลือกเดือยที่เหมาะสมซึ่งจะทำลายเสถียรภาพที่ปกติแล้วมันจะสนุกO(nlnn)O(nln⁡n)O(n \ln n)O(nlnn)O(nln⁡n)O(n \ln n) นี่เป็นความสนใจทางทฤษฎีอย่างแท้จริงและฉันไม่มีการใช้งานจริง ฉันแค่อยากจะรู้ว่าอัลกอริทึมที่มีคุณสมบัติทั้งสามนี้

4
วิธีการวัด“ การเรียงลำดับ”
ฉันสงสัยว่ามีวิธีมาตรฐานในการวัด "sortness" ของอาร์เรย์หรือไม่? อาเรย์ที่มีจำนวนค่ามัธยฐานของค่าการรุกรานที่เป็นไปได้จะถือว่าไม่ได้เรียงลำดับสูงสุดหรือไม่ โดยที่ฉันหมายความว่ามันเป็นพื้นเท่าที่จะทำได้จากการเรียงลำดับหรือเรียงกลับกัน

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

3
เหตุใดการเรียงลำดับการเลือกจึงเร็วกว่าการจัดเรียงฟอง
มันเขียนไว้ใน Wikipediaว่า "... การเรียงลำดับการเลือกเกือบจะดีกว่าการเรียงลำดับฟองและเรียงลำดับคำพังเพย" ใครช่วยอธิบายหน่อยได้ไหมว่าทำไมการเรียงลำดับการเลือกจึงถือว่าเร็วกว่าการเรียงลำดับฟองแม้ว่าทั้งคู่จะมี: ความซับซ้อนของเวลากรณีที่แย่ที่สุด :O ( n2)O(n2)\mathcal O(n^2) จำนวนการเปรียบเทียบ : O ( n2)O(n2)\mathcal O(n^2) ความซับซ้อนของเวลากรณีที่ดีที่สุด : การจัดเรียงฟอง:O (n)O(n)\mathcal O(n) ตัวเลือกการเรียง:O ( n2)O(n2)\mathcal O(n^2) ความซับซ้อนของเวลากรณีโดยเฉลี่ย : การจัดเรียงฟอง:O ( n2)O(n2)\mathcal O(n^2) ตัวเลือกการเรียง:O ( n2)O(n2)\mathcal O(n^2)

6
การสร้างชุดค่าผสมจากชุดคู่โดยไม่มีการทำซ้ำองค์ประกอบ
ฉันมีชุดของคู่ แต่ละคู่เป็นรูปแบบ (x, y) เช่นว่า x, y [0,n)เป็นจำนวนเต็มจากช่วง ดังนั้นถ้า n คือ 4 ดังนั้นฉันมีคู่ต่อไปนี้: (0,1) (0,2) (0,3) (1,2) (1,3) (2,3) ฉันมีคู่แล้ว ตอนนี้ฉันต้องสร้างชุดค่าผสมโดยใช้n/2คู่ที่ไม่มีจำนวนเต็มซ้ำ (กล่าวอีกอย่างหนึ่งว่าจำนวนเต็มแต่ละค่าปรากฏอย่างน้อยหนึ่งครั้งในชุดค่าผสมสุดท้าย) ต่อไปนี้เป็นตัวอย่างของชุดค่าผสมที่ถูกต้องและไม่ถูกต้องเพื่อความเข้าใจที่ดีขึ้น 1. (0,1)(1,2) [Invalid as 3 does not occur anywhere] 2. (0,2)(1,3) [Correct] 3. (1,3)(0,2) [Same as 2] มีคนแนะนำฉันถึงวิธีในการสร้างชุดค่าผสมที่เป็นไปได้ทั้งหมดเมื่อฉันมีคู่

7
อัลกอริทึมในการกระจายรายการ“ อย่างสม่ำเสมอ”
ฉันกำลังค้นหาอัลกอริทึมเพื่อแจกจ่ายค่าจากรายการเพื่อให้รายการผลลัพธ์เป็น "สมดุล" หรือ "กระจายอย่างสม่ำเสมอ" ที่สุด (ในเครื่องหมายคำพูดเพราะฉันไม่แน่ใจว่าสิ่งเหล่านี้เป็นวิธีที่ดีที่สุดในการอธิบาย ... ต่อมาฉันจะให้วิธีการวัดว่าผลลัพธ์ดีกว่าอื่น) ดังนั้นสำหรับรายการ: [1, 1, 2, 2, 3, 3] หนึ่งในผลลัพธ์ที่ดีที่สุดหลังจากการกระจายค่าอีกครั้งคือ: [1, 2, 3, 1, 2, 3] อาจมีผลลัพธ์อื่น ๆ ที่ดีเท่านี้และแน่นอนว่าสิ่งนี้จะซับซ้อนมากขึ้นด้วยชุดค่าที่น้อยกว่า นี่คือวิธีการวัดว่าผลลัพธ์ดีกว่าวิธีอื่นหรือไม่: นับระยะทางระหว่างแต่ละรายการและรายการถัดไปด้วยค่าเดียวกัน คำนวณค่าเบี่ยงเบนมาตรฐานสำหรับชุดของระยะทาง การกระจายตัวที่ต่ำกว่าหมายถึงผลลัพธ์ที่ดีกว่า ข้อสังเกต: เมื่อคำนวณระยะทางและถึงจุดสิ้นสุดของรายการโดยไม่ต้องค้นหารายการที่มีค่าเท่ากันเราจะกลับไปที่จุดเริ่มต้นของรายการ ดังนั้นในที่สุดรายการเดียวกันจะถูกพบและระยะทางสำหรับรายการนั้นจะเป็นความยาวของรายการ ซึ่งหมายความว่ารายการเป็นวงกลม ; รายการทั่วไปมี ~ 50 รายการที่มีค่าแตกต่างกัน ~ 15 ในปริมาณที่แตกต่างกัน ดังนั้น: สำหรับผลที่[1, 2, 3, 1, 2, 3]ระยะห่างอยู่[3, 3, 3, …

1
จัดเรียงเป็นโปรแกรมเชิงเส้น
ปัญหาที่น่าประหลาดใจมีจำนวนลดลงอย่างเป็นธรรมชาติถึงการเขียนโปรแกรมเชิงเส้น (LP) ดูบทที่ 7จาก [1] สำหรับตัวอย่างเช่นการไหลของเครือข่ายการจับคู่แบบสองทางเกมแบบรวมศูนย์เส้นทางที่สั้นที่สุดรูปแบบของการถดถอยเชิงเส้นและการประเมินวงจร! เนื่องจากการประเมินวงจรลดการโปรแกรมเชิงเส้นปัญหาใด ๆ ในจะต้องมีสูตรการเขียนโปรแกรมเชิงเส้น ดังนั้นเราจึงมีอัลกอริทึมการเรียงลำดับ "ใหม่" ผ่านการลดขนาดให้เป็นโปรแกรมเชิงเส้น ดังนั้นคำถามของฉันคือPPP โปรแกรมเชิงเส้นคืออะไรที่จะเรียงลำดับของจำนวนจริง ?nnn เวลาในการทำงานของอัลกอริธึมการเรียงลำดับการลดและการแก้ปัญหาคืออะไร อัลกอริทึมโดย S. Dasgupta, C. Papadimitriou และ U. Vazirani (2006)

3
ทำไมเป็น Radix เรียง
ในการเรียงลำดับ radix เราแรกเรียงตามเลขนัยสำคัญน้อยที่สุดจากนั้นเราเรียงตามหลักนัยสำคัญที่น้อยที่สุดรองและอื่น ๆ และจบลงด้วยรายการที่เรียงลำดับ ตอนนี้ถ้าเรามีรายการหมายเลขเราต้องการบิตเพื่อแยกความแตกต่างระหว่างตัวเลขเหล่านั้น ดังนั้นจำนวนกี่เรียงผ่านที่เราทำจะเป็นn แต่ละรอบใช้เวลาและด้วยเหตุนี้เวลาทำงานของการเรียง Radix คือnnnlognlog⁡n\log nlognlog⁡n\log nO(n)O(n)O(n)O(nlogn)O(nlog⁡n)O(n \log n) แต่เป็นที่ทราบกันดีว่าเป็นอัลกอริธึมเชิงเส้นเวลา ทำไม?

4
ไม่มีอัลกอริทึมการเรียงลำดับพร้อมคุณสมบัติที่ต้องการทั้งหมดหรือไม่?
บนเว็บไซต์อัลกอริทึมการเรียงลำดับจะทำการอ้างสิทธิ์ต่อไปนี้: อัลกอริทึมการเรียงลำดับในอุดมคติจะมีคุณสมบัติดังต่อไปนี้: มีเสถียรภาพ: คีย์ที่เท่าเทียมกันจะไม่ถูกจัดลำดับใหม่ ทำงานในสถานที่ที่ต้องการพื้นที่เพิ่มเติมO ( 1 )O(1)O(1) การเปรียบเทียบคีย์แย่ที่สุดO ( n ⋅ lg)( n ) )O(n⋅LG⁡(n))O(n\cdot\lg(n)) กรณีที่เลวร้ายที่สุดในการแลกเปลี่ยนO ( n )O(n)O(n) Adaptive: เพิ่มความเร็วสูงถึงเมื่อข้อมูลเกือบจะถูกจัดเรียงหรือเมื่อมีคีย์เฉพาะไม่กี่ตัวO ( n )O(n)O(n) ไม่มีอัลกอริทึมที่มีคุณสมบัติเหล่านี้ทั้งหมดดังนั้นตัวเลือกการเรียงลำดับอัลกอริทึมจึงขึ้นอยู่กับแอปพลิเคชัน คำถามของฉันคือจริงหรือไม่ ไม่มีอัลกอริทึม [การเรียงลำดับ] ที่มีคุณสมบัติเหล่านี้ทั้งหมด และถ้าเป็นเช่นนั้นทำไม มันเกี่ยวกับคุณสมบัติเหล่านี้ที่ทำให้พวกเขาทั้งหมดเป็นไปไม่ได้ที่จะเติมเต็ม?

4
จำนวนการเปรียบเทียบน้อยที่สุดจำเป็นต้องเรียงลำดับ (เรียงลำดับ) 5 องค์ประกอบ
ค้นหาจำนวนการเปรียบเทียบที่น้อยที่สุดที่จำเป็นในการจัดเรียง (เรียงลำดับ) ห้าองค์ประกอบและกำหนดอัลกอริทึมที่เรียงลำดับองค์ประกอบเหล่านี้โดยใช้การเปรียบเทียบจำนวนนี้ การแก้ไข :มี 5! = 120 ผลลัพธ์ที่เป็นไปได้ ดังนั้นต้นไม้ไบนารีสำหรับขั้นตอนการเรียงลำดับจะมีอย่างน้อย 7 ระดับ ที่จริงแล้ว ≥ 120 หมายถึง h ≥ 7. แต่การเปรียบเทียบ 7 ครั้งนั้นไม่เพียงพอ จำนวนการเปรียบเทียบที่น้อยที่สุดที่จำเป็นในการจัดเรียง (เรียงลำดับ) ห้าองค์ประกอบคือ 82h2ชั่วโมง2^hhชั่วโมงh นี่คือคำถามจริงของฉัน: ฉันพบอัลกอริทึมที่ทำในการเปรียบเทียบ 8 แต่ฉันจะพิสูจน์ได้อย่างไรว่าไม่สามารถทำได้ในการเปรียบเทียบ 7 รายการ

4
การเรียงลำดับอัลกอริธึมที่ยอมรับตัวเปรียบเทียบแบบสุ่ม
อัลกอริทึมการเรียงแบบทั่วไปโดยทั่วไปจะใช้ชุดข้อมูลเพื่อจัดเรียงและฟังก์ชันตัวเปรียบเทียบซึ่งสามารถเปรียบเทียบองค์ประกอบสองอย่าง หากตัวเปรียบเทียบเป็นความสัมพันธ์ตามลำดับ output ผลลัพธ์ของอัลกอริทึมจะเป็นรายการ / อาร์เรย์ที่เรียงลำดับ ฉันสงสัยว่าอัลกอริธึมการเรียงลำดับใดที่จะใช้งานร่วมกับเครื่องมือเปรียบเทียบที่ไม่ใช่ความสัมพันธ์ในการสั่งซื้อ (โดยเฉพาะอย่างยิ่งที่ส่งคืนผลลัพธ์แบบสุ่มในการเปรียบเทียบแต่ละครั้ง) โดย "งาน" ฉันหมายถึงที่นี่ว่าพวกเขายังคงกลับมาเรียงลำดับของข้อมูลของพวกเขาและเรียกใช้ที่ซับซ้อนเวลาของพวกเขามักจะอ้างถึง (ตรงข้ามกับการย่อยสลายไปยังสถานการณ์กรณีที่เลวร้ายที่สุดเสมอ การเรียงลำดับของผลลัพธ์จะไม่ได้กำหนดอย่างไรก็ตาม ยิ่งไปกว่านั้นการเรียงลำดับผลลัพธ์จะเป็นการกระจายแบบสม่ำเสมอเมื่อตัวเปรียบเทียบเป็นแบบพลิกเหรียญ จากการคำนวณทางจิตคร่าวๆของฉันดูเหมือนว่าการเรียงแบบผสานจะดีกับสิ่งนี้และรักษาค่าใช้จ่ายรันไทม์เท่าเดิมและสร้างการสั่งซื้อแบบสุ่มอย่างยุติธรรม ฉันคิดว่าบางสิ่งบางอย่างเช่นการเรียงลำดับอย่างรวดเร็วอาจทำให้เสื่อมโทรมอาจไม่เสร็จและไม่ยุติธรรม อัลกอริทึมการเรียงลำดับอื่นใด (นอกเหนือจากการจัดเรียงผสาน) จะทำงานตามที่อธิบายไว้ด้วยตัวเปรียบเทียบแบบสุ่มหรือไม่ สำหรับการอ้างอิงตัวเปรียบเทียบคือลำดับความสัมพันธ์ถ้ามันเป็นฟังก์ชันที่เหมาะสม (กำหนดขึ้น) และสอดคล้องกับหลักการของความสัมพันธ์ของลำดับ: มันเป็นการกำหนดขึ้น: compare(a,b)สำหรับสิ่งใดสิ่งหนึ่งaและbส่งกลับผลลัพธ์เดียวกันเสมอ มันเป็นสกรรมกริยา: compare(a,b) and compare(b,c) implies compare( a,c ) มันเป็น antisymmetric compare(a,b) and compare(b,a) implies a == b (สมมติว่าองค์ประกอบอินพุตทั้งหมดนั้นแตกต่างกันดังนั้นการสะท้อนกลับจึงไม่เป็นปัญหา) เครื่องมือเปรียบเทียบแบบสุ่มละเมิดกฎเหล่านี้ทั้งหมด อย่างไรก็ตามมีผู้เปรียบเทียบที่ไม่ได้มีความสัมพันธ์ในการสั่งซื้อ แต่ยังไม่ได้สุ่ม (ตัวอย่างเช่นพวกเขาอาจละเมิดกฎเพียงข้อเดียวและสำหรับองค์ประกอบเฉพาะในชุด)

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