อัลกอริทึมเพื่อเรียงลำดับคู่ของตัวเลข


14

ฉันได้ถามคำถามนี้ไปแล้วเกี่ยวกับstackoverflowแต่อาจเหมาะสำหรับไซต์นี้มากกว่า

ปัญหาคือ:

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

ตัวอย่าง:

in pairs:
1 5
7 1
3 8
5 6

out pairs:
1 7     <-- swapped
1 5     
6 5     <-- swapped
8 3     <-- swapped

^^ หากไม่มีการแลกเปลี่ยนคู่เป็นไปไม่ได้ที่จะสร้างวิธีแก้ปัญหา ดังนั้นเราจึงสลับคู่ (7, 1), (3, 8) และ (5, 6) และสร้างผลลัพธ์ หรือ

in pairs:
1 5
6 9

out:
not possible

ขอบคุณ

แก้ไข:

ทอม Sirgedas ในดังนั้นเสนอที่ดีที่สุดสำหรับการแก้ปัญหา มันง่ายมากที่จะใช้งานและทำงานใน O (log (n) * n) ขอบคุณสำหรับคำตอบและความสนใจ ฉันชอบการวิเคราะห์ mjqxxxx


6
ปัญหาที่น่าสนใจ หากไม่มีการแลกเปลี่ยนก็ตรงไปตรงมา แต่การสลับเปลี่ยนนั้นไม่ชัดเจนว่ามีวิธีแก้ปัญหาเฉพาะอยู่
Dave Clarke

2
โซลูชันที่ไม่ซ้ำกันไม่ได้มีอยู่เสมออย่างแน่นอน เช่น (1, 10), (5, 6) ทั้ง (1, 10), (5, 6) และ (1, 10), (6, 5) ถูกต้อง
Klark

4
ครั้งต่อไปโปรดรวมลิงค์ stackoverflow.com/questions/5323941/…
Tsuyoshi Ito

2
เพื่อนคนหนึ่งของฉันได้รับมันเป็นคำถามสัมภาษณ์ทดสอบ ดังนั้นฉันคิดว่ามันออกมาจากความอยากรู้ :)
คลาร์ก

3
(1) Klark ขอบคุณสำหรับการตอบกลับ (2) ฉันไม่คิดว่าคำถามนี้เป็นคำถามระดับการวิจัย แต่ฉันเดาว่ามันเป็นขอบเขตที่ควรเปลี่ยน ผมเริ่มการอภิปรายเกี่ยวกับเมตา
Tsuyoshi Ito

คำตอบ:


8

บอกว่าสองคู่และP 2 = ( 2 , 2 )มีไม่มี-swap เข้ากันได้ถ้าพวกเขาสามารถอยู่ในคำสั่งอย่างใดอย่างหนึ่งในรายการที่เรียงลำดับโดยไม่ต้องสลับคนใดคนหนึ่ง นี้เป็นจริงถ้าอย่างใดอย่างหนึ่ง( 1212 )หรือ( 212พี1=(a1,1)พี2=(a2,2)(a1a212) ) สังเกตได้ว่า(a2a121)และ p 2ไม่เข้ากันได้ถ้าหากพวกมันเข้ากันได้กับการแลกเปลี่ยนสองครั้ง(เนื่องจากคำสั่งที่กำหนดบางส่วนเป็นไปตาม p 1p 2p 2p 1โดยที่หมายถึงการสลับที่ทำงาน) . สุดท้ายหน้า1และหน้า2เป็นหนึ่ง-swap เข้ากันได้ถ้าพวกเขาสามารถอยู่ในคำสั่งอย่างใดอย่างหนึ่งในรายการที่เรียงลำดับตรงกับหนึ่งของพวกเขาเปลี่ยน นี่เป็นเรื่องจริงถ้า p 1และพี1พี2พี1พี2พี2* * * *พี1* * * ** * * *พี1พี2พี1* * * *ไม่เข้ากันได้กับการสลับ ในกรณีที่เหลือ p 1และ p 2นั้นเข้ากันไม่ได้: พวกเขาไม่สามารถตอบสนองเงื่อนไขการสั่งซื้อโดยไม่คำนึงถึงสถานะการสลับพี2พี1พี2

ปัญหาสามารถแก้ไขได้ดังนี้ ทดสอบทุกคู่ หากคู่ใดไม่เข้ากันจะไม่มีวิธีแก้ไขและเราสามารถส่งข้อยกเว้นได้ มิฉะนั้นให้พิจารณากราฟที่มีโหนดที่ตรงกับคู่ดั้งเดิมและขอบระหว่างคู่ของโหนดที่ไม่ใช่เข้ากันได้กับการสลับแบบครั้งเดียว แต่ละคู่ของโหนดดังกล่าวจะต้องมีสถานะการแลกเปลี่ยนที่เหมือนกันในรายการที่เรียงลำดับอย่างเหมาะสมและดังนั้นโหนดทั้งหมดในแต่ละองค์ประกอบที่เชื่อมต่อของกราฟจะต้องมีสถานะการแลกเปลี่ยนเดียวกัน เราจำเป็นต้องพิจารณาว่าสถานะการแลกเปลี่ยนทั่วทั้งส่วนประกอบเหล่านี้สามารถกำหนดได้อย่างต่อเนื่องหรือไม่ ทดสอบคู่ของโหนดทั้งหมดภายในแต่ละองค์ประกอบที่เชื่อมต่อ หากคู่ใดไม่เข้ากันไม่ได้สลับไม่มีวิธีแก้ปัญหาและเราสามารถโยนข้อยกเว้น ตอนนี้ทดสอบส่วนประกอบที่เชื่อมต่อทุกคู่ (เช่นสำหรับส่วนประกอบC 1และC 2 , ทดสอบคู่ของโหนดทั้งหมดp 1C 1และp 2C 212พี11พี22) เรารู้ว่าส่วนประกอบแต่ละคู่มีความเข้ากันได้อย่างน้อยหนึ่งคู่ แต่บางคู่อาจเข้ากันไม่ได้ (เพราะโหนดแต่ละคู่ที่ไม่ได้เชื่อมต่อด้วยขอบมีความเข้ากันได้อย่างน้อยหนึ่งข้อและอาจไม่ใช่ - เข้ากันได้กับการแลกเปลี่ยน) พิจารณากราฟที่ลดลงพร้อมกับโหนดที่สัมพันธ์กับส่วนประกอบที่เชื่อมต่อและขอบระหว่างสองโหนดหากส่วนประกอบที่เกี่ยวข้องนั้นไม่สามารถใช้ร่วมกันได้ มีวิธีแก้ไขปัญหาเดิมถ้าหากกราฟนี้เป็น2สี หากไม่มี2- สีไม่มีวิธีแก้ปัญหาและเราสามารถโยนข้อยกเว้น หากมีหนึ่งให้สลับโหนดทั้งหมดในองค์ประกอบทั้งหมดที่มีสีเดียว ตอนนี้เรารับประกันได้ว่าสองโหนดใด ๆ ที่เข้ากันได้โดยไม่มีการสลับดังนั้นเราจึงสามารถจัดเรียงรายการคู่ได้อย่างเหมาะสมโดยใช้คำสั่งบางส่วนที่กำหนดไว้

แต่ละขั้นตอนในขั้นตอนวิธีการและด้วยเหตุนี้อัลกอริทึมทั้งสามารถดำเนินการในเวลาO(ยังไม่มีข้อความ2)


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


1
ขอบคุณมากสำหรับคำตอบของคุณ ฉันสนุกมากที่ได้อ่านมัน ตรวจสอบคำตอบที่เสนอใน SO แม้ว่ามันจะไม่ได้ขึ้นอยู่กับทฤษฎีกราฟซึ่งหมายความว่ามันน่าสนใจน้อยกว่าวิธีแก้ปัญหาที่สง่างามของคุณ :) มันเร็วกว่า ขอขอบคุณสำหรับเวลาของคุณ.
Klark

3

ให้ X (a, b) แสดงถึงตัวแปรไบนารีที่ระบุว่าควรเปลี่ยนคู่ (a, b) หรือไม่ พิจารณาคู่ของคู่ที่แตกต่างกัน (a, b) และ (c, d) และเขียนข้อ จำกัด แบบไบนารีบนตัวแปร X (a, b) และ X (c, d) ที่พอใจถ้าหากทั้งสองคู่อยู่ใน ลำดับที่ถูกต้องหลังจากดำเนินการสลับที่ระบุโดย X (a, b) และ X (c, d) ตามลำดับ การรวมกันของข้อ จำกัด ไบนารีทั้งหมดดังกล่าวเป็นสูตร 2-SAT ในตัวแปร n และอนุประโยค O (n ^ 2) ซึ่งเป็นที่พอใจถ้าหากปัญหาดั้งเดิมมีทางออก สามารถตรวจสอบได้ในเวลา O (n ^ 2)


สำหรับวิธีการแก้ปัญหาดั้งเดิมเพียงแค่ทราบว่าข้อ จำกัด ทั้งหมดอยู่ในรูปแบบ X (a, b) = X (c, d) หรือ X (a, b)! = X (c, d) (หรืออื่น ๆ X (a, b) = คงที่) ดังนั้นอัลกอริทึม "ผสานและตรวจสอบ bipartiteness" ง่าย ๆ :

เริ่มต้นด้วยแต่ละ X เป็นตัวแทนของชุดที่มีเพียงตัวเอง; จากนั้นสำหรับทุกคู่ (X, Y) เช่นนั้น X = Y เป็นข้อ จำกัด ผสานส่วนประกอบที่ X และ Y เข้าด้วยกัน และสุดท้ายตรวจสอบว่ากราฟสัญญาที่แต่ละองค์ประกอบเป็นหนึ่งจุดสุดยอดและขอบบางส่วนเข้าร่วมองค์ประกอบที่มี X และ Y หากความสัมพันธ์ X! = Y ต้องถือเป็นทวิภาค


1
X(a,)=X(,d)

ดังนั้น? ความสัมพันธ์ที่เท่าเทียมกันที่นี่คือการปิดสกรรมกริยาของความสัมพันธ์ (a, b) R (c, d) iff a <c และ b> d หรือ viceversa บางทีฉันอาจไม่ชัดเจนอย่างชัดเจน แต่สิ่งนี้ควรชัดเจนจากคำตอบของฉัน
david

1
a<>dX(a,)X(,d)(แม้ว่ามันจะหมายความว่าพวกเขาอาจจะเหมือนกัน) ตัวอย่างเช่นพิจารณาคู่(1,10), (2,5)และ (3,7).
mjqxxxx

1
สูตร 2-SAT เป็นอย่างไร ส่วนคำสั่งที่ไม่ใช่ tautologies หรือ contradictions นั้นก็เป็นได้เช่นกันXY หรือ X¬Y.
mjqxxxx

1
คุณล้อเล่นใช่ไหม ก่อนอื่นความสัมพันธ์ระหว่างสองตัวแปรสามารถแสดงเป็นสูตร 2-SAT ตัวอย่างเช่น X = Y เหมือนกับ (X หมายถึง Y) และ (ไม่ใช่ X หมายถึงไม่ใช่ Y) ในทางกลับกันหากข้อ จำกัด ทั้งหมดเป็นรูปแบบ X = Y หรือ X = ไม่ใช่ Y แน่นอนว่าไม่จำเป็นต้องเรียกใช้อัลกอริทึม 2SAT เลย: อัลกอริทึม "ผสานและตรวจสอบความเป็นสองด้าน" ที่ฉันอธิบายไว้ก่อนหน้านี้
david
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.