Doğrusal zamanda “neredeyse sıralama” tam sayıları


16

Pozitif tamsayı değerleri dizisi doğrusal zamanda sıralamakla ilgileniyorum (tek tip maliyet ölçülü RAM modelinde, yani tamsayılar logaritmik boyuta sahip olabilir, ancak aritmetik işlemlerin alınacağı varsayılır birim zaman). Tabii ki, bu karşılaştırma tabanlı sıralama algoritmaları ile imkansız, bu yüzden bir "yaklaşık" sıralama, yani bazı permütasyon hesaplamak ilgileniyorum bir gerçekten genel olarak sıralanmadığından hangi fakat sıralı versiyonunun "iyi yaklaşım" . Tamsayıları azalan düzende sıraladığımızı varsayacağım, çünkü neticeyi belirtmek biraz daha hoş hale getiriyor, ancak elbette biri sorunu başka bir şekilde ifade edebilir.L=v1,,vnvσ(1),,vσ(n)LL

Yaklaşık bir sıralama için bir muhtemel kriter, aşağıdaki (*): izin olmak her için , o gerektiren (örneğin, "yarı sıralama" listesi yukarıdan ). Gerçek sıralamanın bunu karşıladığını görmek kolaydır: den daha büyük olmamalıdır , bu yüzden en fazla olan ve genel olarak , olanNivi1invσ(i)N/iiN/ivσ(2)vσ(1)(vσ(1)+vσ(2))/2N/2vσ(i)(jivσ(i))/iN/i.

Örneğin, gereksinim (*) aşağıdaki algoritma ile elde edilebilir (@Louis tarafından önerilir). Benim sorum: Gerçek türün tatmin edeceği (*) gibi bazı şartlar getirerek, “neredeyse tamsayıları lineer zamanda sıralama” görevi üzerinde mevcut bir çalışma var mı? Aşağıdaki algoritmanın veya bunun bazı varyantlarının yerleşik bir adı var mı?

Düzenleme: algoritma düzeltildi ve daha fazla açıklama eklendi


Algoritma:

INPUT: V an array of size n containing positive integers
OUTPUT: T

N = Σ_{i<n} V[i]
Create n buckets indexed by 1..n
For i in 1..n
| Add V[i] into the bucket min(floor(N/V[i]),n)
+

For bucket 1 to bucket n
| For each element in the bucket
| | Append element to T
| +
+

Bu algoritma aşağıdaki nedenlerle amaçlandığı gibi çalışır:

  1. Bir eleman ise kova içinde j Daha sonra V ≤ N / j . vjvN/j

    v kovaya yerleştirilirj=min(N/v,n) , bu nedenlejN/vN/v

  2. Bir eleman ise kova içinde daha sonra ya veya . vjN/(j+1)<vj=n

    vj = dakika ( N / hac , n ) j = N / hac j = n j = N / hac J N / hac < j + 1 N / ( j + 1 ) < v kovaya , bu nedenle veya . İlk durumda yani ve dolayısıyla .j=min(N/v,n)j=N/vj=nj=N/vjN/v<j+1N/(j+1)<v

  3. İçin , orada, en az, kova elemanları 1 ila .j<njj

    Bırakın ve , kovalardan birinde bulunan toplam eleman sayısı 1. olsun. J. Tarafından 2. her elemanı, var bir kova ile ( ) şekildedir . Bu nedenle, toplam gelen kova bütün elemanların için daha büyük olan . Ancak bu toplam da azdır, bu nedenle bize veya veren ve dolayısıyla .j<nkv i i j N / ( j + 1 ) N / ( i + 1 ) < vviijN/(j+1)N/(i+1)<vK1jk×N/(J+1)KNk×N/(j+1)<KNk/(j+1)<1k<j+1kj

  4. T tatmin (*), yani ait inci elemanı gibi olduğujTT[j]N/j

    Tarafından 3. o sahip , ve inci elemanı , bir kova gelen ile Bu nedenle .T[j]jTiijT[j]N/iN/j

  5. Bu algoritma doğrusal zaman alır.

    hesaplanması doğrusal zaman alır. Kovalar yerleştirme ve yinelemeye sahip bağlantılı bir listeyle uygulanabilir . Yuvalanmış döngü, elemanlar olduğu kadar çok çalışır (yani kez).NO(1)n


1
Soruyu reddetmemek için (+1, iyi bir soru), ancak sayı tabanı sıralaması ihtiyacınız olandan daha fazlasını yapmaz mı?
user541686

@Mehrdad: Yorumunuz için teşekkürler! Radix sıralama tam sayıları sıralar, ancak . O(nlog(maxivi))
a3nm

O zaman karmaşıklığı hakkında tam olarak neyin istenmeyen olduğuna dair yorum yapabilir misiniz? Bir var mı çok büyük tamsayı ve her şey, örneğin küçük?
user541686

1
@ a3nm sayı tabanı sıralaması O (n log n) değildir, bu nedenle tamsayıların boyutu sabitse doğrusaldır, örneğin 32 bit sayıları veya 64 bit sayıları. Sıraladığınız sayıların değişken boyutu var mı?
Xavier Combelle

1
@XavierCombelle: Evet, RAM modelinde çalışıyorum ve giriş tamsayılarının bir sabitle sınırlı olduğunu varsayamıyorum.
a3nm

Yanıtlar:


8

Bu ASort algoritmasına çok benziyor. Giesen ve ark. al .:

https://www.inf.ethz.ch/personal/smilos/asort3.pdf

Ne yazık ki, çalışma süresi oldukça doğrusal değildir. Yukarıdaki makale içindeki öğeyi karşılaştıran karşılaştırma tabanlı herhangi bir rasgele algoritmanın alt sınırına sahip olduğunu kanıtlamaktadır ( varsayılarak ).n 2 / ν ( n ) n l o g ( ν ( n ) ) ν ( n ) < nnn2/ν(n)nlog(ν(n))ν(n)<n


DÜZENLEME , sorudaki açıklamalara yanıt olarak:

Yaptığınız şey sadece bir kova çeşididir . Ancak, kova sıralaması için algoritma bu durumda doğrusal değildir. Sorun: Doğal sayıları toplamalı ve sonra her biri üzerinde bölünme yapmalısınız. Sayılar sınırsız olduğundan, artık sabit zamanlı bir işlem değildir. Toplamanız gereken daha fazla sayıyı gerçekleştirmek daha uzun sürer.N/V[i]

Ne kadar uzun? Bölme basamak sayısına bağlıdır, bu yüzden , çarpı bölme işlemidir. Muhtemelen tanıdık geliyor. :)nlg(n)n


1
Bizi bu makaleye yönlendirdiğiniz için teşekkürler! Aslında bu soru ile biraz ilgili. Ancak, algoritmam (ne orijinal sürüm ne de biraz farklı revize edilmiş sürüm) ASort'a çok benzemiyor; İlk olarak, algoritmamın ASort gibi süper lineer zamanda değil çalıştığına inanıyorum . İkincisi, (*) kriteri Spearman'ın taban mesafesine yaklaşmaktan oldukça farklıdır; örneğin, kriter (*), ayak mesafesi mesafesinin aksine, tamsayıların değerlerine bağlı olarak az çok sıkıdır. Üçüncüsü, hem algoritmamız hem de ASort'umuz kova unsurlarıdır, kriterler oldukça farklıdır. O(n)
a3nm

@ a3nm Yukarıda yazdıklarınızın açıklığa kavuşturulması , doğrusal bir kova sıralaması kullandığınızı gösterir (karşılaştırma tabanlı değil, iki öğeyi birbirine karşı test etmek anlamına gelir). Sorun şu ki, tüm matematiksel tamsayılarda çalışmaz. Yalnızca tamsayı boyutu sınırlıysa çalışır.
Trixie Wolf

"Yalnızca tamsayı boyutu sınırlıysa çalışır" dediğinizde, bunun yalnızca tamsayıları sıralıyorsam doğru olduğunu düşünüyorum. Ancak genel olarak, gönderdiğim algoritma aslında onları sıralamıyor, sadece daha zayıf kriteri (*) zorunlu kılıyor. Bu yüzden tamsayı boyutu sınırlı olmasa bile doğrusal zamanda çalıştığını düşünüyorum.
a3nm

2
@ a3nm Doğrusal değil. Yukarıdaki genişletilmiş yanıtımı görün.
Trixie Wolf

Cevabınız için teşekkürler ve gecikme için üzgünüm. Bence model hakkında biraz karışıklık var. RAM modelinde tek tip zaman ölçümü ile çalışıyorum (van Emde Boas, Makine Modelleri ve Simülasyonlar, Hesaplama El Kitabında olduğu gibi): bu yüzden manipüle ettiğim sayılar logaritmik boyuta sahip olabilir, ancak bu sayılardaki aritmetik işlemlerin birim maliyeti vardır. Sorumu buna göre düzenledim. Bu modelde, önerdiğim algoritmanın gerçekten doğrusal zamanda çalıştığını düşünüyorum (ancak elbette bu modelde gerçek karşılaştırma tabanlı sıralama için alt sınırı hala geçerlidir). nlogn
a3nm

2

Sonuç olarak, sorum her şeyden önce alakasız. Aslında, RAM makinesinde düzenli maliyet ölçüsü ile çalışıyorum (yani, kayıtları mutlaka sabit boyutta olmayan ancak logaritmik boyuttaki tam sayıları girişte en fazla saklayabilen kayıtlarımız var ve bu kayıtlardaki işlemler sabit zaman alıyor, en azından ekleme). Ve aslında, bu modelde, sıralama tamsayıları (esasen bir radyus sıralaması yaparak) doğrusal zamanda yapılabilir. Bu 1996 yazısında Grandjean, Sorting, lineer zaman ve tatmin edilebilirlik problemi ile açıklanmıştır .

(Bu, iyi çalışılmış bir tamsayı kümesini "neredeyse sıralama" kavramları olup olmadığı konusundaki soruma cevap vermiyor, ancak ilginç olmaları için, muhtemelen bu zayıf kavramların zorlanmasının daha kolay olması, yani daha zayıf bir şekilde çalışılması gerekir. model ya da bir şekilde alt doğrusal zamanda çalışmaktadır.

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.