เรียงสแต็คหนังสือ


21

เมื่อทำการซ้อนหนังสือคุณมักต้องการวางหนังสือที่ใหญ่ที่สุดไว้ที่ด้านล่างและหนังสือที่มีขนาดเล็กที่สุดอยู่ด้านบน อย่างไรก็ตาม OCD แฝงตัวของฉันทำให้ฉันรู้สึกไม่สบายใจมากถ้าฉันมีหนังสือสองเล่มที่หนึ่งสั้น (สูง) แต่กว้างกว่าหนังสือเล่มอื่น ไม่ว่าจะเรียงตามลำดับใดก็ตามฉันจะวางหนังสือยอดนิยมไว้บนหนังสือเล่มใดเล่มหนึ่งด้านล่าง

เป็นตัวอย่างที่บอกว่าหนังสือเล่มหนึ่งมีขนาด(10,15)และอื่น ๆ (11,14)มีขนาด ไม่ว่าฉันจะใส่พวกมันไปทางไหนฉันก็จะยื่นออกมา แต่ถ้าฉันมีหนังสือที่มีมิติ(4,3)และ(5,6)ฉันสามารถหลีกเลี่ยงการแขวนโดยวางหนังสือไว้ด้านล่างเก่า

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

ความท้าทาย

รับรายการคู่เต็มจำนวนสำหรับขนาดหนังสือเรียงลำดับคู่ / หนังสือเหล่านั้นเพื่อให้จำนวนของสิ่งที่แขวนอยู่มีน้อยที่สุด คุณต้องไม่หมุนหนังสือ - ฉันต้องการหนามทั้งหมดหันไปในทิศทางเดียวกัน หากมีวิธีแก้ปัญหาหลายอย่างที่มีจำนวนกระเช้าแขวนเท่ากันคุณสามารถเลือกคำสั่งดังกล่าวได้ อัลกอริทึมการเรียงลำดับของคุณไม่จำเป็นต้องมีเสถียรภาพ การดำเนินงานของคุณอาจคิดว่าหนังสือเล่มขนาดน้อยกว่า 2 16แต่ละ

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

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่นรับอินพุตผ่าน STDIN, ARGV หรืออาร์กิวเมนต์ของฟังก์ชันในรูปแบบรายการที่สะดวก (ไม่ได้ประมวลผลล่วงหน้า) และพิมพ์หรือส่งคืนผลลัพธ์

นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ

ฉันมั่นใจว่ามีคำตอบพหุนามอยู่ แต่หากคุณพิสูจน์ได้ว่าผิดฉันอาจส่งหลักฐานดังกล่าวแทนการยื่นแบบกอล์ฟ ในกรณีนี้คุณอาจคิดP ≠ NP ฉันจะยอมรับหลักฐานดังกล่าวที่ถูกต้องเป็นครั้งแรกและมอบรางวัลให้แก่มัน

ตัวอย่าง

In:  [[1, 1], [10, 10], [4, 5], [7, 5], [7, 7], [10, 10], [9, 8], [7, 5], [7, 5], [3, 1]]
Out: [[10, 10], [10, 10], [9, 8], [7, 7], [7, 5], [7, 5], [7, 5], [4, 5], [3, 1], [1, 1]]

In:  [[4, 5], [5, 4], [5, 4], [5, 4], [5, 4], [4, 5], [4, 5], [4, 5], [5, 4], [4, 5]]
Out: [[4, 5], [4, 5], [4, 5], [4, 5], [4, 5], [5, 4], [5, 4], [5, 4], [5, 4], [5, 4]]
  or [[5, 4], [5, 4], [5, 4], [5, 4], [5, 4], [4, 5], [4, 5], [4, 5], [4, 5], [4, 5]]

In:  [[2, 3], [1, 1], [5, 5], [7, 1]]
Out: [[5, 5], [2, 3], [7, 1], [1, 1]]
 or  [[5, 5], [2, 3], [1, 1], [7, 1]]
 or  [[7, 1], [5, 5], [2, 3], [1, 1]]
 or  [[7, 1], [1, 1], [5, 5], [2, 3]]

ฉันสร้างสิ่งเหล่านี้ขึ้นมาด้วยมือดังนั้นโปรดแจ้งให้เราทราบหากคุณพบข้อผิดพลาดใด ๆ


3
คุณแน่ใจหรือไม่ว่าการหาคำตอบด้วยจำนวนสิ่งที่ยื่นออกน้อยที่สุดสามารถแก้ไขได้ในเวลาพหุนาม
COTO

@COTO ฉันค่อนข้างมั่นใจใช่
Martin Ender

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

@COTO ฉันได้เพิ่มย่อหน้าเกี่ยวกับเรื่องนี้ในกรณีที่ฉันผิดจริง แต่ไม่นับ ;)
Martin Ender

ในกรณีที่มีการพิสูจน์ที่เป็นไปได้ที่ไม่มีอัลกอริธึมเวลาพหุนามควรได้รับอนุญาตให้สมมติว่า P ไม่เท่ากับ NP
xnor

คำตอบ:


2

Pyth , 30

FN_SQFbYIgeeYeb~b]NB)E~Y]]N;sY

นี่คือกอล์ฟโดยตรงของอัลกอริทึมที่น่ากลัวของ GRC นี่คือโปรแกรม pyth ที่เทียบเท่ากันอย่างแม่นยำในโค้ดไพ ธ อนที่คอมไพล์แล้ว

Q = eval(input())
Y = []
for N in sorted(Q)[::-1]:
     for b in Y:
         if Y[-1][-1] >= b[-1]:
             b += [N]
             break
     else:
         Y += [[N]]
print(Psum(Y))

ในบริบทนี้ Psum(Y)sum(Y,[])ฟังก์ชั่นเทียบเท่ากับงูหลาม

รวบรวมและเรียกใช้รหัสจริง (จากpyth -d):

Y=[]
Q=copy(eval(input()))
for N in neg(Psorted(Q)):
 for b in Y:
  if gte(end(end(Y)),end(b)):
   b+=[N]
   break
 else:
  Y+=[[N]]
Pprint("\n",Psum(Y))

1
ธ แปลความต้องการ "y = []" เอา EVAL ถ้าคุณอยู่ในหลาม 2 sum(Y,[])และผลรวมความต้องการอาร์กิวเมนต์ที่สอง ทั้งหมดนี้ควรทำงานใน Pyth เพียงการแปลจะไม่รวมโดยอัตโนมัติ
xnor

@xnor บรรทัดสุดท้ายอ่านจริงๆ: Pprint("\n",Psum(Y)) . ผมคิดว่าเขาอาจจะง่ายสำหรับการอำนวยความสะดวกพร้อมกับทั้งหมดของ-1s ฯลฯจริงจะทำงานมากขึ้นเช่นPsum reduce(lambda x,y:x+y, Y[1:], Y[0])
FryAmTheEggman

20

Python, 113

P=[]
for n in sorted(input())[::-1]:
 for p in P:
  if p[-1][1]>=n[1]:p+=[n];break
 else:P+=[[n]]
print sum(P,[])

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

ฉันไม่ค่อยดีกับความซับซ้อนของเวลา แต่ฉันเชื่อว่ามันจะเป็นกรณีที่แย่ที่สุดของO ( N) 2 ) มีสองลูปแต่ละตัวมีการวนซ้ำ Nสูงสุด ฉันยังใช้การเรียงลำดับในตัวของ Python ซึ่งก็คือ O ( n log n )


หลักฐานแรกของฉันที่อัลกอริทึมนี้สร้างทางออกที่ดีที่สุดไม่ถูกต้อง ขอขอบคุณอย่างยิ่งที่ @xnor และ @ Sp3000 สำหรับการสนทนาที่ยอดเยี่ยมในการแชทเกี่ยวกับการพิสูจน์เรื่องนี้ (ซึ่งคุณสามารถอ่านได้ที่นี่ ) หลังจากหาหลักฐานที่ถูกต้อง @xnor พบว่าส่วนหนึ่งของมันได้ถูกทำไปแล้ว ( ทฤษฎีบทของ Dilworth )

นี่คือภาพรวมของการพิสูจน์อย่างไรก็ตาม (เครดิตถึง @xnor และ @ Sp3000)

ก่อนอื่นเรานิยามความคิดของ antipile หรือ antichain (ที่ยกมาจาก @xnor ):

antipile เป็นลำดับของหนังสือที่มีความสูงลดลง แต่เพิ่มความกว้าง
ดังนั้นหนังสือต่อเนื่องแต่ละเล่มจะสูงกว่า แต่เคร่งครัดน้อยกว่า
หมายเหตุว่าหนังสือใด ๆ ใน antipile ที่แขวนอยู่เหนือหนังสือเล่มอื่น ๆ ใน antipile
ดังนั้นไม่มีหนังสือสองเล่มใน antipile ที่สามารถ อยู่ในกองเดียวกัน
ผลที่ตามมาคือถ้าคุณสามารถหา antipile ของหนังสือ x แล้วหนังสือเหล่านั้นจะต้องอยู่ในกองที่แตกต่างกัน
ดังนั้นขนาดของ antipile ที่ใหญ่ที่สุดคือขอบเขตที่ต่ำกว่าจำนวนกอง

จากนั้นเราเรียงลำดับหนังสือจากมากไปน้อยตามความกว้าง (ก่อน) และความสูง (ที่สอง) *

สำหรับหนังสือBแต่ละเล่มเราทำดังนี้:

  1. ถ้าBสามารถใส่ลงในเสาเข็มแรกได้เราจะวางไว้ที่นั่นและเดินหน้าต่อไป
  2. มิฉะนั้นเราจะพบเร็ว * กองxซึ่งBสามารถวางไว้ด้านบนของ นี่อาจเป็นกองใหม่ถ้าจำเป็น
  3. ต่อไปเราจะเชื่อมโยงBกับPโดยที่Pเป็นหนังสือยอดนิยมบนกองก่อนหน้า x - 1
  4. ตอนนี้เรารู้แล้วว่า:
    • Bมีความกว้างน้อยกว่าPอย่างเคร่งครัดเนื่องจากหนังสือจะเรียงตามลำดับจากมากไปน้อยตามความกว้าง
    • Bมีความสูงมากกว่าPอย่างเคร่งครัดมากหรือเราจะวางBไว้บนP

ตอนนี้เราได้สร้างลิงก์จากหนังสือทุกเล่ม (ยกเว้นที่อยู่ในกองแรก) ไปยังหนังสือในกองก่อนหน้าซึ่งมีความกว้างมากกว่าและสูงต่ำกว่า

แผนภาพยอดเยี่ยมของ @ Sp3000 แสดงให้เห็นถึงสิ่งนี้:

โดยทำตามเส้นทางใด ๆ จากกองสุดท้าย (ทางด้านขวา) ไปยังกองแรก (ทางซ้าย) เราจะได้ antipile ที่สำคัญความยาวของ antipile นี้เท่ากับจำนวนเสาเข็ม ดังนั้นจำนวนเสาเข็มที่ใช้มีน้อย

ท้ายที่สุดเนื่องจากเราจัดระเบียบหนังสือให้มีจำนวนน้อยที่สุดโดยไม่ทับซ้อนกันเราสามารถวางซ้อนทับซ้อนทับกันเพื่อให้ได้กองเดียวที่มีจำนวนทับซ้อนขั้นต่ำ

* ความคิดเห็นที่เป็นประโยชน์นี้อธิบายบางสิ่ง


3
+1 สำหรับหลักฐาน expositive และเชื่อมโยงไปยังการสนทนา อุปกรณ์ประกอบฉากเพื่อ xnor et al.
COTO

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