ชื่อของปัญหาการเรียงลำดับใหม่ / การเรียงลำดับ?


10

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

[2,1,3,3,2,2][2,2,2,1,3,3], or[2,1,3,3,2,2][1,2,2,2,3,3], or[2,1,3,3,2,2][3,3,2,2,2,1].

ปัญหานี้เรียกว่าอย่างไรในวรรณคดี มีอัลกอริทึมที่มีประสิทธิภาพสำหรับมันหรือไม่?


1
ฉันไม่แน่ใจว่าปัญหานี้มีชื่อแม้ว่าจะเป็นไปได้อย่างแน่นอน ไม่ใช่ปัญหาที่นึกออกทั้งหมดมีชื่อ
Yuval Filmus

2
ในทางปฏิบัตินี้จะเรียกว่าการจัดกลุ่ม ฉันไม่ทราบคำศัพท์ในอัลกอริทึมแบบดั้งเดิม (แน่นอนว่ามันเป็นเรื่องที่น่าสนใจและเป็นปัญหาที่ยากมาก! การลดจำนวน swaps ให้น้อยลงทำให้รู้สึกว่า "หาการเปลี่ยนแปลงที่ดีที่สุดของกลุ่ม" ซึ่งทำให้รู้สึกว่า NP-hard-ish.)
Raphael

ขอบคุณมากสำหรับตอนนี้ แน่นอนฉันสนใจที่จะแก้ปัญหา แต่คิดว่ามันได้ทำการศึกษาไปแล้วจึงขออ้างอิง
Marko Bukal

คำตอบ:


6

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

ได้รับตัวอย่าง BIN_PACKING ที่คุณต้องการที่จะแพ็คตัวเลขเข้าไปถังขยะขนาดและเป็นที่มั่นใจได้ว่าแล้วเราสามารถออกแบบเช่น จากปัญหาของคุณดังต่อไปนี้:Kn1,,nKLm1,,mLni=mj=N

  • มีคลาส ;K+(N+1)(L1)
  • คลาสแรกมีขนาดตามลำดับและคลาสที่เหลือแต่ละคลาสจะมีขนาด ;;Kn1,,nKN+1
  • อาร์เรย์ถูกแบ่งพาร์ติชันออกเป็นช่องขนาด: ที่แต่ละช่องของขนาดเต็มไปด้วยคลาสจัดเรียงอย่างต่อเนื่องและส่วนที่เหลือจะถูกจัดเรียงโดยพลการ
    m1,(N+1)2,m2,(N+1)2,m3,,(N+1)2,mL
    (N+1)2N+1

ตอนนี้การสังเกตุที่สำคัญก็คือมันไม่มีความหมายที่จะเก็บคลาสอย่างน้อยหนึ่งคลาสในช่องและไม่ได้ย้ายคลาสอื่น (เพราะจะไม่เปลี่ยนขนาดของ 'bin') ดังนั้นบรรจุถังเดิมสามารถใช้ได้ถ้าหากจำนวนขั้นต่ำของการแลกเปลี่ยนคือไม่ใหญ่กว่าNเนื่องจากBIN-PACKING นั้นเป็นที่รู้จักกันดีว่า NP-complete อย่างยิ่งปัญหาของคุณคือ NP-hard(N+1)2N


นี่คือสิ่งที่สวยงาม! ในกรณีที่คนอื่นพยายาม: (1) การแลกเปลี่ยนนั้นเพียงพอที่จะสร้าง "bin packing" ใด ๆ ที่เราต้องการในช่องขนาดเนื่องจากการสลับครั้งเดียวก็เพียงพอที่จะย้ายองค์ประกอบหนึ่งไปยังตำแหน่งสุดท้าย โดยไม่รบกวนองค์ประกอบที่วางไว้แล้ว (2) มีเพียง 2 สิ่งที่เป็นไปได้ที่เราสามารถลองกับความยาว - "บัฟเฟอร์โซน" ระหว่าง "ถังขยะ": เลื่อนคลาสทั้งหมดยาว -ที่ปลายทั้งสองที่อื่น (แต่ค่าใช้จ่ายนี้มีการแลกเปลี่ยนอยู่แล้วดังนั้นเราจึงไม่สามารถทำได้) หรือ "เลื่อน" ทั้งตำแหน่งหนึ่งไปทางซ้ายหรือขวา (แต่นี่หมายถึง "เลื่อน" แต่ละรายการ ...m 1 , , m L ( N + 1 ) 2 ( N + 1 ) N + 1Nm1,,mL(N+1)2(N+1)N+1
j_random_hacker

... คลาสในบัฟเฟอร์ซ้ายหรือขวาหนึ่งตำแหน่งและแม้ว่าเราสามารถทำได้ด้วย swap เดียวต่อคลาสมีคลาสในโซนดังนั้นอย่างน้อย swaps จึงจำเป็นอีกครั้ง: เป็นไปไม่ได้) จุดนี้มีความจำเป็นสำหรับการพิสูจน์ว่าทางออกของปัญหา OP ด้วยราคาแสดงถึงการบรรจุถังขยะที่ถูกต้อง (3) เนื่องจากการบรรจุในถังขยะมีปัญหา NP-complete อย่างยิ่งจึงไม่มี "no-no" ในการสร้างแกดเจ็ตจำนวนมาก (ที่นี่องค์ประกอบของอาเรย์) ตามสัดส่วนกับตัวเลขที่เข้ารหัสในอินพุตไม่ได้ที่นี่ :)N + 1 NN+1N+1N
j_random_hacker

1

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

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

  1. ใช้เวลาไม่เกินกว่าทุกL_iแน่นสำหรับอาจจะอ่อนแอมากขนาดใหญ่K K = 2 KLiK=2K
  2. รวมทั้งหมดแล้วหารด้วย 2 ปัดเศษขึ้น สิ่งนี้ถูกต้องเพราะการแลกเปลี่ยนใด ๆ สามารถแก้ไขตำแหน่งที่ไม่ถูกต้องได้สูงสุด 2 ตำแหน่งLi

ในตัวอย่างของคุณขอบเขตทั้งสองให้ 1 (0.5 สามารถปัดขึ้นในกรณีหลัง) ซึ่งแน่นอนว่าหลวม

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