จัดเรียงโดยใช้กล่องดำ


20

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

ตัวอย่างเช่นเราสามารถเรียงลำดับหมายเลขด้วยการโทรไปยังกล่องดำได้หรือไม่ อัลกอริทึมที่ดีที่สุดที่ฉันพบใช้การเรียกไปยังกล่องดำ แต่ฉันไม่สามารถปรับปรุงได้อีก นี่คืออัลกอริทึมของฉันซึ่งคล้ายกับการผสานเรียง:nO(n)n

พาร์ทิชันแรกรายการเข้าไปในรายการมีประมาณขนาด จากนั้นใช้เรียกไปยังกล่องดำเพื่อเรียงลำดับรายการเหล่านี้ ท้ายที่สุดผสานรายการที่เรียงลำดับโดยใช้กล่องดำดังนี้:S s1,s2, . . ,sns1,s2,...,snnn

ใส่องค์ประกอบที่เล็กที่สุดของรายการในรายการใหม่จากนั้นเรียกกล่องดำเพื่อเรียงลำดับ จำนวนใน (ครั้งแรกและองค์ประกอบที่เล็กที่สุดของ ) จะเป็นจำนวนที่น้อยที่สุดในSเราสามารถวางไว้ในตำแหน่งแรกของรายการเอาท์พุท สมมติว่าองค์ประกอบที่ได้รับการแต่งตั้งจากเราแทนที่ด้วยองค์ประกอบที่เล็กที่สุดที่สองของรายการจัดเรียงและทำงานอีกครั้งกล่องสีดำที่มันจะคำนวณสมาชิกที่เล็กที่สุดที่สองของS เราดำเนินการต่อไปจนถึงองค์ประกอบทั้งหมดจะถูกจัดเรียง จำนวนกล่องดำทั้งหมดที่เรียกใช้สำหรับส่วนนี้คือL [ 1 ] L S s J L [ 1 ] s J S n - LL[1]LS
sjL[1]sjS
nn. ดังนั้นโดยรวมจำนวนของสายจะnn

ในทางกลับกันดูเหมือนว่าเราควรจะได้รับขอบเขตล่างโดยใช้ขอบเขตล่างบนการเปรียบเทียบจำนวนที่จำเป็นสำหรับการเรียงลำดับดังนี้: เราสามารถใช้กล่องดำโดยใช้การเปรียบเทียบ ถ้าเราสามารถแก้ปัญหาด้วยการเรียกไปที่กล่องดำและรวมกันเป็นเส้นตรงเวลาเราสามารถจัดเรียงจำนวนจริงด้วยการเปรียบเทียบซึ่งเป็นไปไม่ได้o(nlgn=12nlgnno(nlgn)o(n)no(nlgn)

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

ปรับปรุง:ตามที่โพสต์อื่น ๆ แนะนำก็สามารถทำได้เช่นกันnlgn


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

8
ฉันคิดว่าเราสามารถรับโดยใช้เครือข่ายการเรียงลำดับของ AKS เครือข่ายของพวกเขาคิดว่าเป็นอินสแตนซ์ของโมเดลของคุณโดยที่กล่องดำสามารถเรียงบล็อกขนาด 2 อัลกอริทึมของพวกเขาใช้รอบแต่ละรอบเรียก 2-sorterครั้ง หนึ่ง "รอบ" ของ 2-sorter สามารถจำลองได้อย่างง่ายดายด้วยส่งออก O(logn)O(n)O(n)O(O(nlogn)O(logn)O(n)O(n)O(n) n
Vinayak Pathak

6
@VinayakPathak: แบ่งข้อมูลอินพุตเป็นชิ้นขนาดแล้วเรียงลำดับชิ้นโดยใช้เครือข่าย AKS หลังจากแทนที่ตัวเปรียบเทียบแต่ละตัวด้วย -sorter 2NN/2N
Jeffε

1
@ Jɛ ff E: ใช่เยี่ยมมากนั่นดูเรียบง่ายกว่าการก่อสร้างของฉัน
Vinayak Pathak

1
@ Jɛ ff E ความคิดเห็นของคุณอาจเป็นคำตอบ :)
Kaveh

คำตอบ:


15

สามารถเรียงลำดับด้วยการเรียกไปยังกล่องดำและไม่มีการเปรียบเทียบO(nlogn)

ก่อนอื่นให้พิจารณาปัญหาการแบ่งพาร์ทิชันแบบสมดุลต่อไปนี้: กำหนดองค์ประกอบ (โดยที่ ) แบ่งพาร์ติชันออกเป็นสองกลุ่มขนาดเล็กที่สุดอย่างน้อยประมาณดังนั้น องค์ประกอบทั้งหมดในกลุ่มแรกนั้นเล็กกว่าองค์ประกอบทั้งหมดในกลุ่มที่สอง สามารถทำได้ด้วยการโทรไปที่กล่องดำ (ฉันจะอธิบายในภายหลัง) จากนั้นใช้ quicksort กับอัลกอริทึมการแบ่งพาร์ติชันนี้:A [ 1 .. m ] mA[1..m]m/4O(m/nmnm/4O(m/n)

def qsort(A[1..m]):
   if m < sqrt(n): sort A with one call to the black box
   else:
     Partition A[1..m] into two groups as described above.
     Recursively qsort the first group.
     Recursively qsort the second group.

สมมติว่าแต่ละขั้นตอนของพาร์ติชันใช้การเรียกไปที่กล่องดำอัลกอริทึมข้างต้นที่ได้รับอินพุตจะทำให้การโทรไปยังกล่องดำ เนื่องจากแผนผังการเรียกซ้ำมีความลึกและแต่ละระดับของต้นไม้มีจำนวนโทรไปที่กล่องดำA[1 ..n]O(O(m/n)A[1..n]O(บันทึกn)O(n/O(nlogn)O(logn)O(n/n)=O(n)

ทำขั้นตอนการแบ่งพาร์ติชันดังนี้:

def partition(A[1..m]):  (where sqrt(n) <= m <= n)
   Divide A into m/sqrt(n) groups of size sqrt(n) each.
   Sort each group with one call to the black box per group.
   Sort the medians of the groups with one call to the black box.
   (Note the number of groups is less than sqrt(n), because m <= n.)
   Let X be the median of the medians.
   Partition all m elements around X, using the black box as follows:
      For each group G, let Y be its median:
        Call the black box once on (G - {Y}) union {X}.
        (This gives enough information to order all elts w.r.t. X.)

ในขั้นตอนสุดท้ายของพาร์ติชันอัลกอริทึม (): "การแบ่งองค์ประกอบทั้งหมด m รอบ ๆ X" นี่จะไม่ใช้การเปรียบเทียบเพิ่มเติมหรือไม่
Vinayak Pathak

2
ดูบรรทัดที่เพิ่งทำตามอัลกอริทึมซึ่งจะอธิบายวิธีการทำขั้นตอนนั้น ฉันจะแก้ไขเพื่อให้ชัดเจนยิ่งขึ้น
Neal Young

24

ฉันคิดว่าคำถามของคุณได้รับการแก้ไขในกระดาษของ Beigel และ Gill "การคัดแยกวัตถุโดยใช้ k-sorter " จากปี 1990 และบทคัดย่อของบทความกล่าวว่า:

k-sorter เป็นอุปกรณ์ที่เรียงลำดับวัตถุ k ในเวลาหน่วย ความซับซ้อนของอัลกอริทึมที่ใช้ k-sorter นั้นถูกกำหนดเป็นจำนวนแอปพลิเคชันของ k-sorter ในการวัดนี้ความซับซ้อนของการเรียงวัตถุ n อยู่ระหว่างและ4nlognnlognklogk , คำสั่งซื้อสูงสุดถึง n และ k4nlognklogk


ขอขอบคุณ. ฉันหากระดาษไม่เจอ คุณสามารถให้ลิงค์ไปยังกระดาษหรือหลักฐานได้หรือไม่
AmeerJ


นอกจากนี้ในciteseerx
Kaveh

8
โปรดทราบว่าเมื่อขอบเขตของ Beigel and Gill คือΘ(k=n ) Θ(n)
Jeffε

12

O(nlogn)n

kn2(n/k)2k2n/k

BlockBubbleSort(X[0..n-1], k):
   m = floor(n/k)
   for i = 1 to m
      for j = 0 to m-1
          BlackBoxSort(X[j*k .. (j+1)*k-1])
      for j = 0 to m-1
          BlackBoxSort(X[j*k + k/2 .. (j+1)*k + k/2 - 1])

n=18k=4k

ป้อนคำอธิบายรูปภาพที่นี่

k/2k

O((n/k)2)O((n/k)log2(n/k))=O(nlog2n)O((n/k)log(n/k))=O(nlogn)


Ω(n lg(n))

2
O(n)

+1 สำหรับภาพที่ดี! ฉันอาจจะเข้าใจผิด แต่ดูเหมือนว่าฉันจะไม่ถูกต้องทั้งหมด (แก้ไขฉันถ้าฉันผิด) สมมติว่าเอาต์พุตอยู่ในลำดับจากน้อยไปหามากหากองค์ประกอบที่เล็กที่สุดอยู่ในตำแหน่งสุดท้ายจะไม่มี "เส้นทาง" เพื่อให้ "เดินทาง" ไปยังตำแหน่งแรก การเปลี่ยน "สำหรับ i = 1 เป็น m" เป็น "สำหรับ i = 1 ถึง m + 1" ดูเหมือนว่าจะแก้ไขสิ่งนี้แม้ว่ามันอาจแนะนำค่าใช้จ่ายที่ไม่จำเป็น
จอร์จ

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