จัดเรียงด้วยค่าเฉลี่ยการเปรียบเทียบ


10

มีอัลกอริทึมการเรียงลำดับแบบอิงการเปรียบเทียบที่ใช้ค่าเฉลี่ยของการเปรียบเทียบหรือไม่l g ( n ! ) + o ( n )lg(n!)+o(n)

การดำรงอยู่ของกรณีที่เลวร้ายที่สุดอัลกอริทึมการเปรียบเทียบเป็นปัญหาที่เปิดอยู่ แต่กรณีเฉลี่ยพอเพียงสำหรับอัลกอริทึมแบบสุ่มที่มี\ mathrm {lg} (n!) + o ( n)เปรียบเทียบทุกอินพุต ความสำคัญของ\ mathrm {lg} (n!) + o (n)คือการเปรียบเทียบจากo (n) ที่ดีที่สุดโดยสิ้นเปลืองค่าเฉลี่ยเพียงo (1)การเปรียบเทียบต่อองค์ประกอบl g ( n ! ) + o ( n ) lg(n!)+o(n)l g ( n ! ) + o ( n ) lg(n!)+o(n)l g ( n ! ) + o ( n ) lg(n!)+o(n)o ( n ) o(n)o ( 1 )o(1)

ตั้งแต่ฉันมีขั้นตอนวิธีการดังกล่าวผมรวมถึงว่ามันเป็นคำตอบ (ใช้Q / รูปแบบ ) แต่ผมยินดีต้อนรับคำตอบเพิ่มเติมรวมทั้งขั้นตอนวิธีการอื่น ๆ ไม่ว่าจะเป็นเช่นอัลกอริทึมที่เป็นที่รู้จักอยู่แล้วในการปรับปรุงo ( n )o(n)และ worst- กรณีl g ( n ! ) + o ( n )lg(n!)+o(n)(n)

งานก่อนหน้า: การ
รวมแบบผสานใช้l g ( n ! ) + Θ ( n )lg(n!)+Θ(n)การเปรียบเทียบ (แม้ในกรณีที่เลวร้ายที่สุด)
ผสานแทรกเรียงลำดับ (หรือเรียกว่าฟอร์ดจอห์นสันเรียงลำดับ) นอกจากนี้ยังใช้l g ( n ! ) + Θ ( n )lg(n!)+Θ(n)การเปรียบเทียบ แต่มีค่าคงที่มีขนาดเล็กมากในΘ ( n )Θ(n)(n)
ปรับปรุงความซับซ้อนเฉลี่ยสำหรับการจัดเรียงตามการเปรียบเทียบ (โดย Kazuo Iwama และ Junichi Teruyama) - อัลกอริธึมการแทรก (1,2) ของพวกเขาคล้ายกับคำตอบของฉันด้านล่าง


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

คำตอบ:


4

ปรับปรุง: ฉันขยายคำตอบนี้ลงในกระดาษคัดแยกกับค่าเฉลี่ยของl g ( n ! ) + o ( n )lg(n!)+o(n)การเปรียบเทียบ

ใช่อัลกอริทึมดังกล่าวมีอยู่ ฉันจะพิสูจน์ได้ว่าถูกผูกมัด แต่ภายใต้สมมติฐานการสุ่มแบบสุ่มเราก็จะได้ . ฉันยังพยายามที่จะอธิบายสำหรับและε})l g ( n ! ) + o ( n ) l g ( n ! ) + O ( n 1 - ε ) n 0.5 + o ( 1 ) O ( n 0.5 - ε )lg(n!)+o(n)lg(n!)+O(n1ε)n0.5+o(1)O(n0.5ε)

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

จุดเริ่มต้นคือการเรียงลำดับการแทรกด้วยการค้นหาแบบไบนารีเพื่อตัดสินใจว่าจะแทรกองค์ประกอบถัดไปลงในชุดย่อยเรียงลำดับแล้ว เมื่อ , การแทรกใช้ที่การเปรียบเทียบส่วนใหญ่, ซึ่ง (ในแง่ของเอนโทรปี) นั้นเหมาะสมที่สุดกับปัจจัยการเติม (และสำหรับความซับซ้อนของค่าเฉลี่ย,ใช้ได้เช่นกัน) ตอนนี้เมื่อไม่ใกล้เคียงกับกำลังของ 2 การแทรกองค์ประกอบนั้นไม่ดี (แม้ในกรณีทั่วไปและไม่คำนึงถึงวิธีที่เรารักษาความสมดุลของแต่ละคำถาม) แต่ถ้าเสียการเปรียบเทียบเราสามารถคัดไปยังการกระจายแบบประมาณ ในช่วงเวลาของS ( 1 - ε ) 2 m| S | 2 m - 1 m O ( ε ) 2 m| S | ( 1 + ε ) 2 m | S | A o ( 1 ) A SS(1ε)2m|S|2m1mO(ε)2m|S|(1+ε)2m|S|Ao(1)ASของความยาวใกล้เคียงกับกำลังสองเราได้รับการปรับให้เหมาะสม

เราบรรลุสิ่งนี้โดยการเพิ่มองค์ประกอบในแบทช์และบางครั้งการเปรียบเทียบองค์ประกอบของแบทช์กับแต่ละอื่น ๆ อย่างมีประสิทธิภาพเช่นช่วงเวลาของสอดคล้องกับองค์ประกอบลดลงในลักษณะกึ่งสุ่ม (และมีการกระจายความน่าจะเป็นของภายในช่วงเวลา เกือบเครื่องแบบ) และเมื่อความยาวช่วงก็พอใกล้กับอำนาจของ 2, ทำค้นหา binary แทรกS A A ASAAA

โครงสร้างทั่วไป

เราจะเก็บเซตย่อยขององค์ประกอบที่เรียงลำดับแล้วและสำหรับองค์ประกอบที่ไม่เรียงลำดับแต่ละเราจะติดตามช่วงเวลาที่น้อยที่สุดของของโดยที่ทราบว่าตั้งอยู่ คือความยาวของ ; นั้นขึ้นอยู่กับช่วงเวลาS A I A S A | ฉันA | I A I A = I BSAIASA|IA|IAIA=IB

ให้เป็น: เปรียบเทียบกับและจากนั้น (ตามลำดับแบบสุ่ม) เปรียบเทียบและกับองค์ประกอบที่เกี่ยวข้องของจนกระทั่งช่วงเวลาของพวกเขาเป็น disjoint (หรือมีความยาว 1) องค์ประกอบของถูกเลือก (ในลักษณะที่สอดคล้องกัน) เพื่อทำให้ความน่าจะเป็นสำหรับการเปรียบเทียบใกล้ที่สุดเท่าที่จะทำได้ 1/2 สมมติว่าเมื่อเรียกว่ามีการกระจายอย่างสม่ำเสมอในI_B เนื่องจากความไม่ลงรอยกันในท้ายที่สุดคงไว้ซึ่งสมมติฐานที่เหมือนกันC o m p a r e ( A , B ) A B A B S S C o m p a r e ( A , B ) I AI B C o m p a r eCompare(A,B)ABABSSCompare(A,B)IA×IBCompare

ส่วนต่อไปนี้สามารถอ่านได้อย่างอิสระจากกัน

อัลกอริทึมAl g ( n ! ) + o ( n )lg(n!)+o(n)

รับ: เรียงรายการและชุดขององค์ประกอบที่ไม่เรียงลำดับ ; ; องค์ประกอบที่ไม่ได้เรียงลำดับเป็นญาติสุ่มSS เมตรเมตรโอห์ม ( 1 ) o ( | S | ) SSmmω(1)o(|S|)S

ทำซ้ำ (1) - (3) ในขณะที่เป็นไปได้:
1. เลือกสององค์ประกอบและจากแบทช์ด้วย (ตัวเลือกใดก็ได้) 2. RunB) 3. ถ้าใกล้เคียงกับกำลัง 2 (หมายเหตุ 1)ลบออกจากแบตช์ (โดยไม่ลืม ) และทำในทำนองเดียวกันกับBในที่สุด: แทรกองค์ประกอบทั้งหมดลงในและเรียงลำดับให้เสร็จสมบูรณ์A B I A = I B C o p a r e ( A , B ) | ฉันA |ABIA=IB
Compare(A,B)
|IA|A I A BAIAB
SS

หมายเหตุ 1:สำหรับ "ใกล้เพียงพอ" ข้อผิดพลาดสัมพัทธ์ใด ๆ(เนื่องจากฟังก์ชันของ ) ทำงานตราบเท่าที่องค์ประกอบจะถูกลบออกในขั้นตอน (4) (เป็นไปได้โดยหมายเหตุ 2) ภายใต้การสันนิษฐานแบบสุ่มสันนิษฐานการใช้ข้อผิดพลาดที่เกี่ยวข้องกับการจับภาพองค์ประกอบอนุญาตอัลกอริทึมการเรียงลำดับการเปรียบเทียบแบบเปรียบเทียบo ( 1 ) m m - o ( m ) c log log m / log m m ( 1 - log - Θ ( c ) m ) l g ( n ! ) + O ( n log log n / log n )o(1)mmo(m)cloglogm/logmm(1logΘ(c)m)lg(n!)+O(nloglogn/logn)

หมายเหตุ 2:เนื่องจากลำดับการเปรียบเทียบที่เหมือนกันนำไปสู่ช่วงเวลาการโยงที่เท่ากันองค์ประกอบเกือบทั้งหมดจะผ่านขั้นตอน (1)ครั้ง (ยกเว้นลบออกในขั้นตอนที่ 4) ในการเริ่มต้นถ้าและเราเลือกเราเปรียบเทียบกับองค์ประกอบและการใช้งานแต่ละขั้นตอน (3) ถึงมีความน่าจะเป็นในการลดในครั้ง ทีนี้สำหรับทุกอัตราส่วนที่ไม่ใช่พลังที่มีเหตุผลเท่ากับ 2 เรามีและเราก็จะได้Ω ( บันทึกเมตร) < B S [ ( 1 - 1 / Ω(logm)A<BAA2 )| S| ]AO(1)| ฉันA| 1/(1-1/S[(11/2)|S|]AO(1)|IA|2 )>1ε>0d>0เมตร,nN1/(11/2)a>11 - ε < a md 2 n <1+εo(n)ε>0d>0m,nN1ε<amd2n<1+εo(n) ขอบเขต

แนวโน้มอัลกอริทึมl g ( n ! ) + O ( n 1 - ε )lg(n!)+O(n1ε)

โมดูโลสมมุติฐานการสุ่มเราสามารถบรรลุเปรียบเทียบโดยเฉลี่ยดังนี้l g ( n ! ) + O ( n 1 - ε )lg(n!)+O(n1ε)

  • สุ่มสับเปลี่ยนรายการและเรียงลำดับครึ่งแรกลงในรายการขณะที่เก็บครึ่งหลังเป็นแบทช์ที่ไม่เรียงลำดับSS

  • ทำซ้ำจนกว่าชุดเป็นที่ว่างเปล่า:
    สุ่มเลือก{} ให้\} หากเป็นที่ว่างเปล่าเอาจากชุดและใส่ลงในSมิฉะนั้น:ชุดG = { B ชุด: | P ( A < B ) - 0.5 | < n - 0.51 ε } G A SAbatchG={Bbatch:|P(A<B)0.5|<n0.51ε}GAS

    1. หากมีเช่นนั้นที่มีความน่าจะเป็น (พูด≥0.05),ทำภายในข้อผิดพลาดสัมพัทธ์ของกำลัง 2, รันและหากประสบความสำเร็จ (เช่นอยู่ภายในข้อผิดพลาดสัมพัทธ์ของกำลัง 2) เอาจากชุดและใส่ลงในSB G Θ ( 1 ) C o m p a r e ( A , B ) | ฉันA | n - ε C o m p a r e ( A , B ) | ฉันA | n - ε A SBGΘ(1)Compare(A,B)|IA|nεCompare(A,B)|IA|nεAS
    2. ถ้าไม่มีเช่นวิ่งสำหรับสุ่มB∈GB G C o พีR E ( , B ) B GBGCompare(A,B)BG

ถ้าสมมติฐานการสุ่มของเราใช้งานได้ (เช่นการกระจายความยาวของช่วงเวลาและตำแหน่งสุ่มพอ) จากนั้นตลอดกระบวนการส่วนใหญ่สามารถเปรียบเทียบได้อย่างมีประสิทธิภาพเมื่อเทียบกับการเลือกองค์ประกอบ (กับความยาวช่วงเวลาต่างกัน) ดังนั้นโดยทั่วไปแล้วเราสามารถเลือกการเปรียบเทียบสำหรับ (1) ด้านบนและถ้าเราโชคไม่ดีกับผลการเปรียบเทียบเรายังคงได้รับโอกาสดังนั้นการบรรลุ (ถ้ามีขนาดเล็กพอพูด 0.01) a -comparison algorithm ด้วยการเปลี่ยนแปลงและการประมาณบางอย่างการคำนวณทั้งหมดสามารถทำ quasilinear: กำหนดองค์ประกอบA n Θ ( 1 ) n Θ ( 1 ) Θ ( บันทึกn ) ε l g ( n ! ) + O ( n 1 - ε ) A BAnΘ(1)nΘ(1)Θ(logn)εlg(n!)+O(n1ε)Aคำนวณความยาวของช่วงเวลาที่มีแนวโน้มจากนั้นค้นหา s ด้วยความยาวกลางและช่วงเวลาโดยประมาณที่เหมาะสมB

มีหลายวิธีในการเพิ่มประสิทธิภาพการเปรียบเทียบ แต่อุปสรรคคือการเปรียบเทียบแต่ละครั้งอาจจบลงด้วยความโชคร้ายและเรามีการเปรียบเทียบจำนวน จำกัด หากหลังจากการปรับให้เหมาะสมแล้วทำการเปรียบเทียบโดยเฉลี่ย 4 ครั้งและ 'ประสบความสำเร็จ' ด้วยความน่าจะเป็น 1/4 เราจะได้0.09C o พีR E ( , B ) ε( 1 - ε ) / 4 / เข้าสู่ระบบ4 / 3 2 0.09Compare(A,B)ε(1ε)/4/log4/320.09

วิธีที่ดีกว่าอาจจะดีกว่าคือรอจนกระทั่งช่วงเวลาใกล้เคียงกับกำลังของ 2 โดยไม่ควบคุมความยาวแต่ละช่วง แต่เป็นการกระจายความยาว

ความพยายามที่อัลกอริทึมl g ( n ! ) + n 0.5 + o ( 1 )lg(n!)+n0.5+o(1)

สมมติว่าและเราจะได้รับองค์ประกอบที่ไม่มีการเรียงลำดับขององค์ประกอบมีช่วงเวลายังได้รับด้วยโดยปกติแล้วและกระจายอย่างสม่ำเสมอ (มากถึงข้อผิดพลาดแบบสุ่มและถือด้วยความแม่นยำเพียงพอแม้ว่าจะมีเงื่อนไขใน ) จากนั้นเราสามารถเรียงลำดับรายการที่สูญเสียค่าเฉลี่ยของการเปรียบเทียบดังนี้: (*) แทรกองค์ประกอบทั้งหมดตามลำดับเริ่มต้นrfloor}} วิธีนี้จะแทรกองค์ประกอบทั้งหมดเมื่อความยาวช่วงเวลาใกล้เคียงกับกำลังของ 2| S | = n n I A | ฉันA | n 1 - o ( 1 ) | ฉันA ||S|=nnIA|IA|n1o(1)2 l g | ฉันA | A<S[i]n0.5+o(1)| ฉันA||IA|2lg|IA|A<S[i]n0.5+o(1)
2lg|IA||IA|2lg|IA|

ขั้นตอนวิธีการเรียงลำดับจะได้รับ: สุ่มสับเปลี่ยนรายการและจัดเรียงครึ่งแรกSหากต้องการแทรกครึ่งหลังให้ทำการกระจายสิทธิ์และทำ (*) ด้านบนSS

ในการสร้างกระจายถูกต้องเราสามารถทำการแจกแจงแบบสุ่มและจากนั้นหักส่วนที่ถูกต้องขององค์ประกอบสำหรับแต่ละขณะสุ่มส่วนที่เหลือ (ทำซ้ำหากจำเป็น) อย่างไรก็ตามในขณะนี้ควรแก้ไขทั่วโลกเราไม่ทราบว่าสามารถควบคุมได้ในระดับท้องถิ่นด้วยความแม่นยำที่ต้องการหรือไม่ (ด้วยเหตุนี้คำว่า "ความพยายาม" ด้านบน)|IA|2lg|IA||IA|2lg|IA||IA|/2lg|IA||IA|/2lg|IA||IA|2lg|IA||IA|2lg|IA|

ในการสร้างการกระจายแบบสุ่มเราสามารถใช้กับยกเว้นว่าด้วยเริ่มต้นเหมือนกันทั้งหมดเราไม่คาดหวังการสุ่มที่ความลึก sublogarithmic (เช่นมีนานพอ) แต่ผมคาดว่าเราจะได้รับการสุ่มที่ระดับความลึก sublogarithmic ใช้ generalizations (อาจใด ๆ ทางเลือกที่เหมาะสมจะทำงาน) ของเพื่อองค์ประกอบ: ถ้าเราให้องค์ประกอบพันกันยุ่ง (เช่น เชื่อมต่อโดยใช้ผลการเปรียบเทียบ) เราควรจะมีเกี่ยวกับ noncommuting ทางเลือกสำหรับแต่ละเปรียบเทียบกับSสิ่งนี้ควรอนุญาตCompare(A,B)Compare(A,B)P(A<B)0.5P(A<B)0.5IAIAIAIACompareComparek=ω(1)k=ω(1)k=ω(1)k=ω(1)kkSSO(logkn+logk)O(logkn+logk)ความลึกของการสุ่มตามที่ต้องการ (สมมติว่าไม่ใหญ่เกินไปเนื่องจากเราต้องการความลึกเพื่อเบี่ยงเบนองค์ประกอบต่าง ๆ ) ผมคาดหวังว่าการประมวลผลที่สามารถทำ quasilinear ถ้าใช้ขนาดเล็กพอที่kkkΘ(logk)Θ(logk)kk

เนื่องจากการเปรียบเทียบกับใช่ความน่าจะเป็นเพียงแค่ทำให้เสียเอนโทรปีการสุ่มเริ่มต้นและความไม่สม่ำเสมอขององค์ประกอบในช่วงเวลาที่ จำกัด นั้นจะต้องมีขยะเอนโทรปี หากการกระจายรูปร่างประสบความสำเร็จเพียงพอพอเอนโทรปีของเสียส่วนใหญ่เกิดจากช่วงความยาวช่วงไม่ตรงกันระหว่าง (*) (ดังนั้น )1/2+n0.51/2+n0.5O(1/n)O(1/n)no(1)no(1)n0.5+o(1)n0.5+o(1)

เป็นไปได้รวมกัน:lg(n!)+O(n0.5ε)lg(n!)+O(n0.5ε) หากการกระจายรูปร่างทำงานได้ดีพอและเราทำให้ขนาดแบทช์เท่ากับและ คัดสรรองค์ประกอบใน (*) (ด้านบน) เราสามารถแทรกทั้งหมดยกเว้นองค์ประกอบเหล่านี้ที่มีขยะเอนโทรปีดังนี้ แยกเป็นเกือบเท่ากันทุกช่วงเวลาและเมื่ออยู่ระหว่างการแทรกจะหยุดตามช่วงเวลาปฏิเสธ (เช่นยกเลิกการแทรก) ถ้าช่วงเวลานั้นยาวเกินไปจึงลดความผันแปรของความยาวของช่วงเวลาเหล่านี้|S|+n0.5+ε|S|+n0.5+εn0.5+εn0.5+εn0.5+εn0.5+εn0.5ε/2+o(1)n0.5ε/2+o(1)SSnεnεIAIAΘ(nε/2)Θ(nε/2)คูณด้วยซึ่งจะลดความผันแปรของความยาวแบบสุ่มช่วงในครั้งตามต้องการ ตอนนี้เราสามารถใช้อัลกอริทึมในการแทรกองค์ประกอบที่เหลือด้วยหากมีขนาดเล็ก พอ.n1o(1)n1o(1)nε/2o(1)nε/2o(1)lg(n!)+O(n1ε)lg(n!)+O(n1ε)O(n0.5ε)O(n0.5ε)εε

ความซับซ้อนของการเรียงลำดับที่แย่ที่สุด: เป็นไปได้ มากที่สุดที่มีอัลกอริทึมการเรียงด้วยการเปรียบเทียบกรณีที่แย่ที่สุด สำหรับการหาค่ามัธยฐานมีช่องว่างเชิงเส้นระหว่างการเปรียบเทียบกรณี (เปรียบเทียบ) และกรณีที่เลวร้ายที่สุด (อย่างน้อยการเปรียบเทียบ) อย่างไรก็ตามสำหรับการเรียงลำดับมีอิสระมากมายสำหรับการจัดเรียงการเปรียบเทียบและการค้นหาอัลกอริทึมการเรียงลำดับใหม่lg(n!)+o(n)lg(n!)+o(n)1.5n+o(n)1.5n+o(n)(2+ε)nO(1)(2+ε)nO(1)


1
ฉันคิดว่าคุณควรเขียนบทความนี้เป็นกระดาษ
Emil Jeřábek

@ EmilJeřábekเห็นด้วย ในฐานะที่เป็นเว็บไซต์ระดับการวิจัยคำถามและคำตอบมากมายที่นี่เป็นมินิเอกสาร แต่ด้วยความยาวและความสำคัญที่นี่ อย่าลังเลที่จะแจ้งให้เราทราบ (ที่ dmytro@mit.edu) ว่าควรจะขยายส่วนใดในกระดาษ (โดยคำตอบนี้ยังคงเป็นรุ่นย่อ)
Dmytro Taranovsky
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.