Kara kutu kullanarak sıralama


20

Biz liste sıralamak istediğinizi varsayalım ait gerçek sayılar. Biz sıralayabilir siyah kutu verildiğini varsayalım anında gerçek sayılar. Bu kara kutuyu kullanarak ne kadar avantaj elde edebiliriz?n Snn

Örneğin , kara kutuya yalnızca çağrıları olan numaraları sıralayabilir miyiz ? Bulduğum en iyi algoritma kara kutuya çağrı kullanıyor . Ama daha da geliştiremedim. İşte birleştirme-sıralama benzer benim algoritma:nO(n)n

İlk bölüm listesi içine listeleri Yaklaşık ile boyutu. Ardından bu listeleri sıralamak için kara kutuya çağrılarını kullanın. Son olarak, kara kutuyu kullanarak sıralanan listeleri birleştirin:S s1,s2,. . . ,sns1,s2,...,snnn

Listelerin en küçük elemanlarını yeni bir listeye , sonra sıralamak için kara kutuyu çağırın. Numara (birinci ve en küçük elemanına itibari ) en küçük bir sayı olacaktır . Çıktı listesinin ilk yerine koyabiliriz. Eleman varsayarsak dan seçildi , biz yerine sıralama listesi ikinci en küçük eleman ile ve yine ikinci en küçük üyesi hesaplamak için üzerine siyah kutuyu çalıştırmak . Tüm elemanlar sıralanana kadar devam ediyoruz. Bu bölüm için toplam kara kutu çağrısı sayısıL [ 1 ] L S s j L [ 1 ] s j S n - LL[1]LS
sjL[1]sjS
n-n. Dolayısıyla toplam çağrı sayısı olacaktır .n

Öte yandan, sıralama için gereken sayı karşılaştırmaları alt sınırını kullanarak bir alt sınır elde edebilmemiz gerekir gibi görünüyor: Kara kutuyu kullanarak uygulayabiliriz. karşılaştırmaları. Kara kutuya çağrıları ile ve doğrusal zamanda birleştirerek sorunu çözebilirsek, gerçek sayıyı imkansız olan karşılaştırmalarıyla sıralayabiliriz .o(nlgn=12nlgnno(nlgn)o(n)no(nlgn)

Sanırım ın kara kutuya yapılan çağrıların sayısı için bir alt sınır olduğunu kanıtlayabiliriz , çünkü kara kutuda kullanılan birçok karşılaştırma paylaşılacak ve bu nedenle argümanımızda tekrar sayılacaktı.Ω(n)

GÜNCELLEME: Diğer gönderilerin önerdiği gibi, de elde edilebilir.nlgn


2
Yorumunuzda bir yazım hatası var gibi görünüyor. "Az kullanan hiçbir algoritması: Söyleyecek kastettiniz makineye can sıralama aramaları az gerçek sayılar karşılaştırmalar"? ps: alt sınırının yalnızca karşılaştırma tabanlı sıralama algoritmaları için geçerli olmasına dikkat etmelisiniz . NNlgNNlgNNNNlgNNlgN
Kaveh

8
AKS'nin sıralama ağını kullanarak bile alabiliriz . Ağları, kara kutunun 2 boyutlu blokları sıralayabileceği modelinizin bir örneği olarak düşünülebilir. Algoritmaları , her turda 2 sıralayıcı kez çağıran turlarını kullanır . 2- sıralayıcılardan bir "yuvarlak", -sorters ile kolayca simüle edilebilir. O(logn)O(n)O(n)O(O(nlogn)O(logn)O(n)O(n)O(n) n
Vinayak Pathak

6
@VinayakPathak: Giriş verilerini boyutunda parçaya bölün ve ardından her karşılaştırıcıyı bir -sorter ile değiştirdikten sonra AKS ağını kullanarak parçaları sıralayın. 2NN/2N
Jeffε

1
@ Jɛ ff E: Evet, harika, bu kesinlikle yapımımdan daha basit görünüyor.
Vinayak Pathak

1
@ Jɛ ff E, yorumlarınız bir cevap olabilir. :)
Kaveh

Yanıtlar:


15

Kara kutuya çağrıları ile sıralama yapmak mümkündür ve karşılaştırma yoktur.O(nlogn)

İlk olarak, aşağıdaki dengeli bölümleme sorununu göz önünde bulundurun: verilen elemanları (burada ), bunları iki gruba , en küçük boyut en az , birinci gruptaki tüm elemanlar ikinci gruptaki tüm elemanlardan daha küçüktür. Bu , kara kutuya çağrıları ile yapılabilir. (Bunu daha sonra açıklayacağım.) Sonra bu bölümleme algoritmasıyla quicksort kullanın:A [ 1 .. m ] mA[1..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.

Her bir bölme aşamasını varsayarsak alır kara kutuya aramalar yukarıda algoritması, belirli bir giriş yapacak kara kutuya aramaları çünkü özyineleme ağacının derinliği ve ağacın her düzeyi kara kutuya toplam çağrısına sahiptir.O(m/n)A[1..n]O(nlogn)O(logn)O(n/n)=O(n)

Bölümleme adımını şu şekilde yapı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.)

Algoritma bölümünün () son adımında: "Tüm m öğelerini X etrafına böl", bu m ek karşılaştırmalar kullanmaz mı?
Vinayak Pathak

2
Algoritmayı takip eden satıra bakın, bu adımın nasıl yapılacağını açıklar. Bunu daha net hale getirmek için düzenleyeceğim.
Neal Young

24

Bence sorunuz 1990'dan itibaren Beigel ve Gill'in " k-sıralayıcıyı kullanarak n nesneyi sıralama " ve makalenin özeti her şeyi söylüyor:

Bir k sıralayıcı, k nesnelerini birim zamanda sıralayan bir cihazdır. Bir k sıralayıcı kullanan bir algoritmanın karmaşıklığı, k sıralayıcının uygulama sayısı olarak tanımlanır. Bu ölçümde, n nesneyi sıralamanın karmaşıklığı n log n arasındadır. ve4ngünlüğünngünlüknkgünlükk , n ve k cinsinden birinci dereceden terimlere kadar.4ngünlüknkgünlükk


Teşekkür ederim. Gazeteyi bulamadım. Makalenin bağlantısını veya kanıtını verebilir misiniz?
AmeerJ


Ayrıca citeseerx üzerinde .
Kaveh

8
K = olduğunda , Beigel ve Gill'in sınırıΘ(k=n. Θ(n)
Jeffε

12

Sıralamak mümkündür obliviously ile her biri orijinal girişin bitişik bir alt dizisine uygulanan kara kutuyu çağırır. Algoritma kara kutu çağrıları dışında giriş verilerine asla dokunmaz. Özellikle, aynı kara kutu çağrıları dizisi, gerçek giriş verisi değil, dolayısıylan'ninbir fonksiyonudur(dolayısıyla "kayıtsız").O(nlogn)n

İşte boyutu Altdizilim sıralar bir kara kutu kullanan basit bir algoritma bir kroki olduğu yerine sadece k . Kara kutuya yapılan toplam arama sayısı kabaca2(n/k)2'dir. Notasyonel basitlik için,k'ninçift ​​olduğunu ve2n/k'nıntek bir tam sayıolduğunu varsayalım.n2(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])

İşte ve k = 4 için algoritmanın bir diyagramı . Veriler soldan sağa hareket eder; her kutu bir k- ithalatçısıdır.n=18k=4k

resim açıklamasını buraya girin

Şekilde umulduğu gibi, bu algoritma giriş dizisini boyutundaki parçalara böler ve sonra karşılaştırma-değiştirme işlemi yerine k- verenini kullanarak kabarcıklara kabarcıklar uygular . Doğruluk, ağın 0 ve 1'lerin herhangi bir dizisini doğru bir şekilde sıraladığını gözlemleyerek izler .k/2k

O((n/k)2)O((n/k)günlük2(n/k))=O(ngünlük2n)O((n/k)günlük(n/k))=O(ngünlükn)


Ω(n lg(n))

2
O(n)

Bu güzel resim için +1! Yanılıyor olabilirim ama bana göre bu tamamen doğru değil (yanlışsam beni düzelt). Çıktının artan sırada olduğu varsayılarak, en küçük eleman son konumda ise, birinci konuma "hareket etmesi" için bir "yol" yoktur. Gereksiz ek yük getirebilmesine rağmen, "i = 1'den m'ye" için "i = 1'den m + 1'e" olarak değiştirmek bunu düzeltiyor gibi görünüyor.
George

@ George Oops, haklısın; Bir katman daha lazım!
Jeffε
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.