จำเป็นต้องมีการโอนถ่ายสำหรับอัลกอริทึมการเรียงลำดับหรือไม่


14

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

พื้นหลัง:

  • อัลกอริทึมการเรียงลำดับโดยทั่วไปเรียงลำดับองค์ประกอบของรายการตามฟังก์ชันตัวเปรียบเทียบ C (x, y) ด้วย

    C(x,y)={1if xy0if xy+1if xy

    ข้อกำหนดสำหรับเครื่องมือเปรียบเทียบนี้เท่าที่ฉันเข้าใจ:

    • สะท้อนกลับ: x:C(x,x)=0
    • antisymmetric: x,y:C(x,y)=C(y,x)
    • สกรรมกริยา: x,Y,Z,a:(x,Y)=a(Y,Z)=a(x,Z)=a
    • C (x, y) ถูกกำหนดสำหรับ x และ y ทั้งหมดและผลลัพธ์ขึ้นอยู่กับ x และ y เท่านั้น

    (ข้อกำหนดเหล่านี้มีการระบุไว้ในการใช้งานที่แตกต่างกันอยู่เสมอดังนั้นฉันไม่แน่ใจว่าฉันได้รับสิ่งเหล่านี้ทั้งหมด)

ตอนนี้ฉันสงสัยเกี่ยวกับฟังก์ชั่นตัวเปรียบเทียบที่ "ยอมรับ" ซึ่งยอมรับตัวเลข x, y เหมือนกันถ้า : |x-Y|1

(x,Y)={-1ถ้า x<Y-10ถ้า |x-Y|1+1ถ้า x>Y+1

ตัวอย่าง: ทั้งคู่[ 1, 2, 3, 4, 5]และ[1, 4, 3, 2, 5]เรียงลำดับอย่างถูกต้องตามลำดับตัวเปรียบเทียบที่ยอมรับได้ (ถ้า x มาก่อน y ในรายการ) แต่ไม่ใช่เนื่องจาก C (4,2) = 1(x,Y)0
[1, 4, 2, 3, 5]

ตัวเปรียบเทียบความทนทานนี้เป็นแบบสะท้อนกลับและ antisymmetric แต่ไม่ผ่านการถ่ายทอด

เช่น C (1,2) = 0, c (2,3) = 0, แต่ C (1,3) = -1, ละเมิดความไว

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

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

คำถามที่เกี่ยวข้อง:


ฉันคิดว่าการเรียงลำดับด่วนด้วย "เลือกกลางเสมอ" สำหรับเดือยจะล้มเหลวโดยใช้ตัวเปรียบเทียบนี้ใน [3, 2, 1]
G. Bach

2
ฉันสงสัยว่าตัวเปรียบเทียบแบบไม่ใช้สกรรมกริยาบางตัวที่ใช้ในอัลกอริทึมการเรียงลำดับบางอย่างอาจทำให้เกิดการวนซ้ำไม่สิ้นสุด
Karolis Juodelė

1
สิ่งที่คุณจะพิจารณาเป็นรายการที่เรียงลำดับ (เช่นเอาท์พุทที่จำเป็น)? ในกรณีปกติมีสองเงื่อนไขเทียบเท่า: ฉันฉัน+ 1และฉันทั้งหมดของฉันเจ aผมaผม+1aผมaJผมJ
Yuval Filmus

@ G.Bach ฉันคิดว่า quicksort จะล้มเหลวอย่างสมบูรณ์ถ้าอาร์เรย์ของคุณมี n คูณ 3, ครั้งเดียว 2, n คูณ 1, และตรงกลาง 2 ใช้เป็น pivot แรกไม่ว่าจะเกิดอะไรขึ้นในภายหลัง
gnasher729

คำตอบ:


11

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

คำตอบ: แน่นอน คุณสามารถเรียกใช้อัลกอริทึมกับอินพุตใด ๆ

อย่างไรก็ตามคุณรู้กฎ: Garbage In, Garbage Out หากคุณใช้อัลกอริทึมการเรียงลำดับด้วยตัวเปรียบเทียบแบบไม่ใช้สกรรมกริยาคุณอาจได้ผลลัพธ์ที่ไร้สาระ โดยเฉพาะอย่างยิ่งไม่มีการรับประกันว่าผลลัพธ์จะเป็น "เรียงลำดับ" ตามตัวเปรียบเทียบของคุณ ดังนั้นการใช้อัลกอริทึมการเรียงลำดับด้วยตัวเปรียบเทียบแบบไม่ใช้สกรรมกริยาจึงไม่น่าจะมีประโยชน์ในแบบที่คุณคาดหวัง

ตัวอย่างการเรียกใช้การเรียงลำดับการแทรกในรายการอินพุตโดยใช้เครื่องมือเปรียบเทียบของคุณจะไม่มีการเปลี่ยนแปลงรายการ แต่รายการผลลัพธ์ที่ได้จะไม่เรียงตามลำดับ[3,2,1]


1
ความคิดแรกของผมก็คือว่ารายการ [3,2,1] คือในเรียงลำดับตามการเปรียบเทียบของฉันดังนั้นแน่นอนการจัดเรียงควรปล่อยให้มันไม่เปลี่ยนแปลง; แต่ฉันอาจใช้นิยามที่ไม่ถูกต้องของการเรียงลำดับ ฉันเปรียบเทียบแต่ละองค์ประกอบกับเพื่อนบ้านโดยตรง แต่นั่นอาจเป็นข้อ จำกัด ที่อ่อนแอเกินไปสำหรับการพิจารณารายการที่เรียงลำดับ
HugoRune

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

3
@HugoRune โดยใช้ "เปรียบเทียบกับเพื่อนบ้านเท่านั้น" คุณอาจต้องเรียงลำดับเอง อัลกอริธึมมาตรฐานสมมติว่ามีความไวเพื่อหลีกเลี่ยงการเปรียบเทียบซ้ำซ้อน หรือคุณสามารถฝังคำสั่งที่ไม่ใช่สกรรมกริยาของคุณในคำสั่งสกรรมกริยาได้ หรือบางทีคุณกำลังมองหาบางสิ่งบางอย่างตามแนวการเรียงโทโพโลยี ?
vonbrand

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

4

เมื่อพิจารณาจากชุดขององค์ประกอบและความสัมพันธ์ในการสั่งซื้อแบบไบนารีจะต้องมีการส่งผ่านแบบย่อเพื่อจัดเรียงองค์ประกอบทั้งหมด ในความเป็นจริงแล้วการถ่ายโอนจำเป็นต้องมีเพื่อกำหนดลำดับบางส่วนในองค์ประกอบ http://en.m.wikipedia.org/wiki/Total_order

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

a<<<a


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

2

ดูเหมือนว่าสิ่งที่คุณต้องการคือการจัดเรียงรายการที่การจัดอันดับที่มองเห็นได้ทั้งหมดนั้นถูกต้อง แต่รายการที่ใกล้เคียงอาจถูกพิจารณาว่าเป็น "ที่แยกไม่ออก" มีความเป็นไปได้ที่จะออกแบบอัลกอริธึมเรียงลำดับซึ่งจะทำงานกับการเปรียบเทียบดังกล่าว แต่ถ้ามีข้อ จำกัด ว่าจำนวนการเปรียบเทียบอาจรายงานว่าสิ่งต่าง ๆ แยกไม่ออกไม่มีวิธีใดที่จะหลีกเลี่ยงได้ เพื่อให้เข้าใจว่าเหตุใดให้เลือกตัวเลข N และอัลกอริทึมการเรียงลำดับที่เปรียบเทียบน้อยกว่า N (N-1) / 2 จากนั้นเติมรายการ L [0..N-1] ตั้งค่าแต่ละองค์ประกอบ L [I] เป็น I / N และ "เรียงลำดับ" โดยใช้เครื่องมือเปรียบเทียบของคุณ (ค่าต่ำสุดจะเป็น 0 และสูงสุด (N-1) / N ดังนั้นความแตกต่างจะเป็น (N-1) / N ซึ่งน้อยกว่า 1)

เนื่องจากมีไอเท็ม N (N-1) / 2 คู่ที่สามารถเปรียบเทียบได้และการเรียงลำดับไม่ได้ทำการเปรียบเทียบจำนวนมากจึงต้องมีบางรายการที่ไม่ได้ทำการเปรียบเทียบโดยตรง แทนที่อันใดอันหนึ่งที่สิ้นสุดลงเหล่านี้จะถูกจัดเรียงเป็นอันดับแรกโดย 1 และอันอื่นที่มี -1 / N เปลี่ยนรายการทั้งหมดกลับสู่ตำแหน่งเริ่มต้นและดำเนินการเรียงลำดับซ้ำ การเปรียบเทียบแต่ละครั้งจะให้ผลเป็นศูนย์เช่นเดียวกับที่ทำในครั้งแรกดังนั้นการเปรียบเทียบเดียวกันจะดำเนินการและรายการจะสิ้นสุดในลำดับเดียวกัน สำหรับรายการที่จะจัดเรียงอย่างถูกต้อง "1" จะต้องเรียงลำดับหลัง "-1 / N" (เนื่องจากแตกต่างกันมากกว่าหนึ่ง) แต่เนื่องจากอัลกอริทึมการเรียงลำดับจะไม่เปรียบเทียบทั้งสองรายการโดยตรงกับมัน คงไม่มีทางรู้ว่า


0

เติมอาร์เรย์ขององค์ประกอบ n ด้วยค่า n, n-1, n-2, ... , 2, 1 จากนั้นลองเรียงลำดับโดยใช้อัลกอริทึม "การแทรกแบบตรง" คุณจะพบว่าแต่ละองค์ประกอบนั้นมีค่าเท่ากับองค์ประกอบก่อนหน้าดังนั้นจึงไม่ถูกย้าย ผลลัพธ์ของการเรียงลำดับเป็นอาร์เรย์เดียวกัน

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