Yazı tura karşılaştırıcısı kullanırken rastgele bir permütasyon döndüren bir “sıralama” algoritması var mı?


9

Askerin, standart bir arama algoritmasında kullanılan karşılaştırıcının adil bir madeni para çevirme ile değiştirildiği zaman çalışma süresinin değişip değişmediğini ve ayrıca Microsoft'un tek tip bir permütasyon üreteci yazamaması gerektiğini bilmek istediği bu sorudan esinlenerek , sorum şu :

Karşılaştırıcının uygulanmasına bağlı olarak karşılaştırmaya dayalı bir sıralama algoritması var mı:

  1. gerçek bir karşılaştırıcı kullanırken öğeleri sıralı olarak döndürme (yani karşılaştırma, standart bir sıralama algoritmasında beklediğimiz şeyi yapar)
  2. karşılaştırıcı adil bir madeni para çevirme ile değiştirildiğinde öğelerin düzgün bir şekilde rastgele bir permütasyonu döndürün (yani x < y = truex ve y değerinden bağımsız olarak olasılık 1/2 ile geri dönün )

Sıralama algoritmasının kodu aynı olmalıdır. Sadece karşılaştırma "kara kutu" içindeki değiştirilmesine izin verilen koddur.


Ayrıca bu soruya bakın .
Raphael

2
Ayrıca aşağıdaki ilginç soruya bakın: cstheory.stackexchange.com/questions/5321/… .
Yuval Filmus

1
Rastgele karşılaştırıcınızın iyi davranmasını ister misiniz? İşte iki olası yol. (1) Karşılaştırıcı , sonra her zaman ve ayrıca . Aynı (2), ama daha fazlası karşılaştırma karar verirse ve , o zaman işleyen için (ve ). Her iki durumda da, her kısıtlanmamış sorgu hala tamamen rastgele. x<yx<yy>xx<yy<zx<zz>x
Yuval Filmus

@YuvalFilmus Bağlantılı sorunuzda esas olarak istenen şeyi istiyorum, ancak rastgele devreyi , eleman çiftini sipariş eden bir karşılaştırma-değişim kapısı ile değiştirirsek aynı devre de sıralanmalıdır.
Joe

1
Güzel görselleştirmeler için buraya bakın .
Raphael

Yanıtlar:


3

Aşağıdaki deterministik (karşılaştırıcı olmadan) algoritması bir giriş grubu için çalışır (a1,,an):

  1. Do Fisher-Yates karıştırmak bazı statik çifti ile karşılaştırıcı kullanılarak (diyelima1<a2) bozuk para olarak (kabul-ret örneklemesi yapmak). Karşılaştırıcı çıktı verirse1 ilk kez, deterministik durumda sonsuz bir reddetme döngüsünü önlemek için ters çevirin.
  2. (isteğe bağlı hızlanma: Tek bir çifti deneyin n zamanlar, nerede nuzunluk veya girişinizdir. Çıkışlardan herhangi biri farklı ise (1))
  3. Birleştirme sıralaması kullanarak dizinizi sıralayın.

Karşılaştırıcı olarak deterministik bir sıralama ilişkisi verildiğinde, bu algoritma bir diziyi zaman içinde sıralar. O(nlogn) Fisher-Yates shuffle içeri girdiğinden O(n) maksimum kullanma O(logn)her adımda rastgele olmayan "rastgele bitler" (örn. karşılaştırıcınıza çağrılar) ve birleştirme sıralaması aynı asimptotik karmaşıklığa sahiptir. (1) 'in sonucu bu durumda tamamen işe yaramaz, ancak gerçek bir tür izlediğinden, bu zarar vermez.

Karşılaştırıcı (1) her permütasyon için eşit olasılıklı diziye izin verdiği ve gerçekten (3) (dışarıda bıraktığınız (2) veya (2) rasgeleliği belirleyemediğiniz) diziye izin verdiği için gerçek bir para çevirme verildiğinde, bu hayır sonucunun dağılımı sadece (1) nedeniyle tüm permütasyonlar arasında eşit olarak dağıtılan girdisinin sırasına bağlıdır, bu nedenle tüm algoritmanın sonucu da eşit olarak dağıtılır. Her bir kabul-ret örneklemesinin tekrarlanması kaç kez geometrik olarak dağıtılır (olasılıkla reddetme)<12) ve bu nedenle beklenen bir değere sahiptir <2. Her tekrar en fazlalognBöylece, çalışma zamanı analizi deterministik durumla neredeyse aynıdır, ancak yalnızca beklenen bir çalışma zamanı elde ederiz .O(nlogn), sonlandırmama olasılığı ile (sadece neredeyse kesin olarak sona erer ).


Joe'nun işaret ettiği gibi: (1) 'deki ilk bit için testi beğenmediyseniz, (3) sonra (1)' i yapın ve an<a1 hangisi her zaman 0, dizi zaten deterministik durumda sıralandığından. Ayrıca, rastgele sayının üst sınırından döngüdeki aralıktaki üst sınırdan çıkarmanız gerekir, çünkü rastgele sayının üst sınırı aynı permütasyonu verir. Ama o zaman (2) 'nin yasak olduğunu unutmayın, çünkü her zaman fidye davasında karıştırmayı yapmak zorundasınız.


(1) ve (3) için karşılaştırıcınıza aynı çağrıları bile kullanabilirsiniz, ancak daha sonra sonucun eşit olarak dağıtıldığını kanıtlamak, mümkünse en azından çok daha zordur.


Aşağıdaki algoritmanın karıştırmak ve sıralamak için belirgin bir aşaması yoktur, ancak asimptotik olarak daha yavaştır. Aslında ikili arama ile ekleme sıralama . kullanacağıma=(a1,,an) girişi göstermek ve bk=(bk,1,,bk,k) Sonucu k-inci tur:

  1. Ayarlamak b1,1=a1
  2. Eğer a2<a1 sonra b2=(a2,a1) ve (c,d):=(2,1) Başka b2=(a1,a2) ve (c,d):=(1,2). Her iki durumda daad<ac hep olacak 0 rastgele olmayan bir karşılaştırıcı için (yani yanlış).
  3. Elde etmek üzere bk için k3 elde etmek bk1 ilk.
  4. İzin Vermek l=log2k ve k=2l, yani k en az gücü 2 daha küçük değil k.
  5. İzin Vermek i0=0. Her biri içinj{1,,l} İzin Vermek
    ij={ij1+2ljij1+2lj>k1ad<acij1ij1+2lj>k1¬(ad<ac)ij1+2ljij1+2ljk1bk1,ij1+2lj<akij1ij1+2ljk1¬(bk1,ij1+2lj<ak)
  6. Eğer il>k tekrarla (5.) bk=(bk1,1,,bk1,il1,ak,bk1,il,,bk1,k1)
  7. Çıktı bn

Rastgele durum: 5 + 6'nın if cümlesi esasen kabul-ret örneklemesidir. Algoritmanın geri kalanı saf bir karışıklıktır: ilkini karıştırınk1 öğeleri ve ekleyin k-her eleman eşit olasılıkla her pozisyona. Normal yerleştirme türünü kullanırsak, bunun yerine bir binom dağılımı elde ederiz.

Bu algoritmanın Fisher-Yates shuffle'a göre her iki modda da verimsiz olduğuna dikkat edin ve eğer bir dizi kullanılıyorsa bir öğeyi rastgele bir konuma eklemek pahalıysa ve bir liste kullanılıyorsa ikili arama doğrusal zaman gerektiriyorsa. Ancak belki de yığın sıralamasında veya ağaç sıralamasında benzer bir şekilde değişiklik yapılması daha hızlı bir algoritmaya yol açabilir.


@Joe mevcut durumda yazı için hala geçerli olan tüm puanlarınızı tek bir yoruma koyabilir ve geri kalanını silebilir misiniz?
Mart'ta

Hangi karşılaştırıcı kullanılan bağlı olarak farklı adımlar yapmayan bir algoritma umuyordum. Karşılaştırıcıyı incelemeden sonsuz bir reddetme döngüsünden kaçınabilir misiniz? Sanırım ilk olarak (3) adımı uygulayarak reddetmekten kaçınabilirsiniz ...
Joe

Sıralama adımını yaparsanız, karıştırmayı yaparsanız, ancak dizine bağlı bir karşılaştırma dizisi kullanırsanız ne olur? i, böylece deterministik durumda, öğenin dizinini alırsınız (takas yok) ve sıralı kalır, ancak rastgele durumda, standart örneklemeyi reddetme örneklemesi ile gerçekleştirirsiniz.
Joe

İlk yorum: İlk örnek bitini atmadığımı, "çift kullanımlı" olduğunu unutmayın. Her 2 biti ters çevirmeyi düşündüm, ama bu sonsuz döngüyü engellemez. Aslında bazı düzensiz desenlere ihtiyaç vardır ve hatta çok daha fazla girişi reddedebilirler. Tabii ki ilk ve en son yerine en son iki biti XOR yapabilirim, ama bu gerçekten farklı değil.
frafl

İkinci Yorum: (1) - (3) sırası yalnızca (2) adımını kullanırsanız önemlidir, çünkü rasgele durumda karıştırmanın olasılık 1 ile yapıldığından emin olmanız gerekir, aksi takdirde tekdüze dağılım ihlal edilir. Neden bağlıdıri? Bu durumdaan<a1 her zaman cevap verecek 0tek ihtiyacımız olan şey bu.
Mart'ta

4

Hayır, bu mümkün değilse n2. Rasgele bir karşılaştırıcı kullanarak algoritmanız tarafından bir permütasyon üretme olasılığı ikili, yani formA/2Boysa olasılık, 1/n!. Ne zamann>2, there is no way to write 1/n! in the form A/2B.


1
But this only holds, if we need a deterministic bound on the runtime, which was not requested in the question. If we only require the expected runtime to be finite, this should be no problem.
frafl

1
Are you aware of any reasonable sorting algorithm which doesn't terminate in polynomial time?
Yuval Filmus

2
You mix the deterministic and random case. The algorithm may terminate in deterministic polynomal time if called with a deterministic order relation and in expected polynomial time if called with a coin as comparator.
frafl

@YuvalFilmus why does the decision tree have to have 2k leaves?
Joe

If you're doing up to k comparisons in total, then the probability of any event is going to be of the form A/2k. It's not about the number of leaves. The only way out is, as frafl suggests, having an unbounded number of comparisons.
Yuval Filmus
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.