Fisher-Yates Shuffle Algoritmasının Karmaşıklığı


15

Bu soru, belirli bir dizinin rastgele bir karıştırmasını döndürmek için Fisher-Yates algoritması ile ilgilidir. Vikipedi sayfası onun karmaşıklığı O (n) olduğunu söylüyor, ama (n log) Ey olduğunu düşünüyorum.

Her yinelemede i, 1 ve i arasında rastgele bir tamsayı seçilir. Sadece tamsayıyı hafızaya yazmak O (log i) 'dir ve n yinelemesi olduğundan, toplam

O (log 1) + O (log 2) + ... + O (log n) = O (n log n)

ki saf algoritma daha iyi değil. Burada bir şey mi eksik?

Not: Naif algoritma, her öğeye (0,1) aralığında rastgele bir sayı atamak, ardından diziyi atanan numaralara göre sıralamaktır.

Yanıtlar:


24

Burada, çoğu algoritma çalışmasında olduğu gibi, bit sayılarını okuma ve yazma maliyetinin sabit olduğu varsayılmaktadır. Taşınmaz ve yanlışlıkla P ve PSPACE'i çökertmediğiniz sürece küçük bir günahtır .O(logn)


4
Bu gerçekten bir "küçük günah" olsa da, TCS pedagojisinin büyük bir günahı olduğunu düşünüyorum. Her bir CS öğrencisi bunu kendileri için keşfeder ve herkesin bunu bildiği söylenene kadar büyük bir şeyin yanlış olduğunu düşünür, ancak kimse bundan bahsetmez. Ayrıca, birkaç yıl önce birisi Omega (n ^ 3) olarak tahmin edilen bazı ünlü problem için sub-kübik bir zaman algoritması vermek için O (log n) modelini kullandığında bir brouhaha yoktu? Bu hiç çözüldü mü?
randomwalker

2
Bahsettiğiniz brouhaha'nın farkında değilim. Bahsetmemek için kesinlikle haklısın. Jeff Erickson'un gönderisini ilk okuduktan sonra, şimdi sadece tekmeler için geometri sınıfımda P = PSPACE'i kanıtlamayı bir noktaya getiriyorum :)
Suresh Venkat

1
Cevap için teşekkürler. Hiç bu kadar büyük bir şey olduğunu bilmiyordum. Bağlantı iyi bir okuma sağlar.
Tomer Vromen

1
Alt satır: modelinizi her zaman açık yapın.
Jukka Suomela

2
Ö(günlükn)Ö(günlükn)

17

Standart hesaplama modeli, O (log n) bit tamsayıları üzerindeki aritmetik işlemlerin sabit zamanda gerçekleştirilebileceğini varsayar, çünkü bu işlemler tipik olarak donanımda teslim edilir. Fisher-Yates algoritmasında "i tamsayısının belleğe yazılması" yalnızca O (1) zamanını alır.

Tabii ki, algoritmayı bit işlemleri açısından analiz etmek son derece anlamlıdır, ancak bit-maliyet modeli gerçek davranışı daha az tahmin eder. Basit döngü bile for i = 1 to n: print(i)O (n log n) bit işlemleri gerektirir.


Döngü ile güzel bir nokta. Bunu hiç fark
etmedim

8

Bu, "[Fisher-Yates algoritması] naif algoritmadan daha iyi değil. Burada bir şey mi eksik?" soruyu sordunuz.

Gerçek sayılar kullanan "saf" algoritmanızda: kaç doğruluk biti kullanıyorsunuz? Bit karmaşıklığını sayıyorsanız (Fisher-Yates için yaptığınız gibi) ve algoritma gerçek sayılar için k rastgele bit kullanıyorsa, çalışma süresi compar (kn log n) olacaktır, çünkü iki k- bit gerçek sayılar Ω (k) zaman alır. Ancak iki elemanın aynı gerçek sayıya eşlenmesini önlemek için k en az Ω (log n) olmalıdır, yani algoritma Ω (n log 2 n) zaman , bu da Fisher-Yates shuffle'dan daha yavaştır. log faktörü

Eğer sadece aritmetik ve karşılaştırma işlemlerinin sayısını hesaplıyorsanız ve bit karmaşıklıklarını görmezden , Fisher-Yates Θ (n) ve algoritmanız Θ (n log n), yine de oturum açma faktörü.


Ben "saf" algoritma bu örtülü k ...
şüpheli

1
"Saf" algoritma aşağıdaki gibi doğrusal zamanda temiz bir şekilde uygulanabilir. Her öğeye 1 ile n ^ 3 arasında rastgele bir tamsayı atayın ve sonra sayıları sayı tabanı sıralamasıyla O (n) cinsinden sıralayın. (Yüksek olasılıkla, iki öğe aynı rastgele sayıyı
alamaz

@JeffE: Teşekkürler! Bu çok temiz ve Fisher-Yates ile aynı karmaşıklığa sahip. Bunu gönderdikten sonra, aslında "naif" algoritmanın daha kötü olmaması gerektiğini hissettim ... n (kk) sayılarının O (nklog n) 'ye ihtiyaç duymadan O (nk) cinsinden sıralanabileceğini kaçırdım. Ama sanırım Knuth-Fisher-Yates sabitlerde hala daha iyi: tam olarak (log n!) Rastgele bitler — 1'den n'ye, sonra 1'den n-1'e vb. Rastgele bir tam sayı gerektirir. 3n log n) ve yalnızca sabit fazladan bellek ile yerinde yapılabilir.
ShreevatsaR

6

Bu sorunun tamsayıları hakkında özel bir şey yoktur.

Örneğin, eğer hash fonksiyonunun hash değerini hesaplamak için tüm değeri okuması gerekiyorsa, hash tabloları (herhangi bir değer saklamak için) O (1) zamanı değildir. Benzersiz elemanlar, temsilini ne kadar zeki olursa olsun, ortalama olarak oturum açma bitleri gerektirir ve bu nedenle tüm girdisini okuyan herhangi bir karma işlevinin hesaplanması en az zaman alır. Pratikte kırmızı-siyah ağaçlardan daha hızlıdırlar, ancak asimptotik olarak daha iyi değildirler.

Randomwalker tarafından başvurulan brouhaha, burada tartışılan bir POPL 2008 makalesi ( http://portal.acm.org/citation.cfm?doid=1328438.1328460 ) hakkındaydı: http://blog.computationalcomplexity.org/2009/05/shaving- kaydeder-ile-birimi-cost.html

Bu yazıda Lance Fortnow, öğrenci olarak karşılaştırmak için iki öğenin tüm log n bitlerini okumamız gerekiyorsa, sıralamanın gerçekten n log ^ 2 n zaman gerektirdiğinden nasıl şikayet ettiğinden bahsediyor, bu da makul bir itiraz gibi görünüyor.


Blog yazısının yazarını alamıyorum. Sıralamanın aslında O (n log ^ 2 n) olduğundan şikayet ediyor, ancak daha sonra kağıdın sağlam olduğunu söylüyor?
Tomer Vromen

Aritmetik işlemlerin birim zaman aldığı bir model olduğu için kağıt sağlamdır (yani yanlış değil) ve bu modelde o (n ^ 3) işlemlerine ilk ulaşan kağıt algoritmasıdır.
Dave Doty

O (n log ^ 2 n) itirazını alamadım çünkü bitler açısından, girdinin kendisi O (n log n) boyutunda. Btw, bir yan not olarak, karmaşıklık blogunda yorumların kalite seviyesi o zamandan çok daha yüksekti ....
arnab

4

Wikipedia sayfası karmaşıklığının O (n) olduğunu söylüyor, ancak bence O (n log n).

Aslında, O (n log n), sıralamanın O (n log n) olduğu modellerde bu sorun için bir alt sınırdır. Tüm permütasyonlar eşit derecede olasıysa, rasgele akışlardan permütasyonlara bir fonksiyon olarak algoritma amaçlanmalıdır. N var! Böylece karar ağacı modeli gibi bir şeyde en azından O (log n!) = O (n log n) uzunluktaki dallar vardır.

1ϵO(ϵ)


3

TCS'de - aksi açıkça belirtilmediği takdirde - Turing Machine üzerindeki karmaşıklığı dikkate alıyoruz. Bu teorik amaçlar için iyi olsa da, donanımda farklı makine modelleri (yani sonlu yaklaşımlar) uyguladığımız için sonuçlar pratikte çok yararlı değildir. Bu nedenle, bu modellerde karmaşıklık istemek uygun bir sorudur. Örneğin, genellikle kayıt makinelerinin (gerçek CPU'lara benzer şekilde) iki kayıt üzerinde sabit zamanda atomik işlemler yapabileceğini varsayarız - burada kullanılmış olabilir.

Kısacası: Makale TM'ler açısından düşünülürken, makale RM'ler açısından yazar. İkiniz de haklısınız.

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.