Tamsayıların iki listesinin karşılaştırılması?


10

Diyelim ki sınırlı manit pozitif iki tamsayı listem var ve her listenin tüm öğelerinin ürününü alıyorum. Hangi ürünün daha büyük olduğunu belirlemenin en iyi yolu nedir?

Tabii ki her ürünü basitçe hesaplayabilirim, ancak ürünlerde basamak sayısı terimlerin sayısıyla doğrusal olarak artacağından daha etkili bir yaklaşım olduğunu umuyorum, böylece tüm hesaplama kuadratiktir.

Çarpma yerine ekliyor olsaydım, ilk listeden girişleri art arda ekleyip ikinci listeden çıkarma yaparak (büyük) toplamları hesaplama ihtiyacını ortadan kaldıran bir "fermuar stratejisi" kullanabilirdim. Ürünler için benzer teknikler, girdilerin logaritmalarını toplamak olacaktır, ancak şimdi sorun, günlüklerin hesaplanmasının hatalı aritmetik kullanımını gerektirmesidir. Sayısal hatanın alakasız olduğunu kanıtlamanın bir yolu yoksa?


Maksimum tamsayı değerini bilirsek ve bu n'den bağımsızsa (yani sabit bir k), 1'den k'ya kadar olan tüm sayıların faktörlerinin bir arama tablosunu yapabiliriz. Şimdi her şeyi bazda yazarsanız [faktörlerin ürünü] lineer hale gelir, çünkü ürünleri o zamanla lineer zamanda hesaplayabilir, sonra her basamağı (en yüksek sıra basamağı ile başlayarak) diğerinden daha büyük olana kadar karşılaştırabilirsiniz. Detaylar biraz zor ama sanırım k sabitse işe yaramalı.
Phylliida

Ürünler için benzer tekniğin, rasyonel bir sayıyı ilk listenin ilk öğelerine, ikincinin ilk öğelerine bölünmesine eşit tutmak olduğunu söyleyebilirim (artı işleme 0s). Ancak bu gerçekten yararlı değildir, çünkü tüm sayılar eş zamanlı ise, her iki ürünü de hesaplayacaktır. | Ayrıca saf algoritmanın ikinci dereceden olduğundan emin değilim. Ürününün hesaplanmasın boyut tam sayıları m alabilir C(m,m)+C(m,2m)+...+C(m,(n-1)m) nerede C(x,y) bir çarpma maliyeti x- ile tamsayılar bit y-bits integers.Ürünlerin de formata uygun olduğunu
düşünmüyorsanız


Saf yaklaşımda bir gelişme: her bir faktörün (doğrusal zamanda) gerçekleşme sayısını sayın ve verimli bir güç algoritması kullanarak ürünü yalnızca sonunda hesaplayın. Bu zamanında çalışıyorO(M(n)), hangisi Ö(ngünlükn2Ö(günlük*n))mevcut asimptotik olarak en hızlı yöntemi kullanarak.
Emil Jeřábek

2
Günlükler için gereken doğruluğu düşüneceğim. Aslında daha verimli olabilir.
Emil Jeřábek

Yanıtlar:


6

(Giriş numaralarının bir sabitle sınırlanması için sorunun açıklamasını anlıyorum, bu yüzden bağlılığa bağımlılığı izlemeyeceğim.)

Problem lineer zamanda ve logaritmik alanda logaritmaların toplamı kullanılarak çözülebilir. Daha ayrıntılı olarak, algoritma aşağıdaki gibidir:

  1. İkili sayaçları kullanarak, her iki listedeki olası her giriş numarasının yineleme sayısını sayın.

Bu zaman alır Ö(n)ve sayaçlar boşluk kullanıyor Ö(günlükn), her sayaç tarafından sınırlandırıldığı için n değerinde.

İzin Vermek p1,...,pk aşağıdaki asal sayılar olsun Ö(1)ciltli. Her sayacı bir sayıya dağıtarakbir asal faktörlerine bir (uygun çokluk ile) ve bir liste için sayıları diğer listeden çıkararak, aşağıdakileri zamanında elde ederiz Ö(günlükn):

  1. Hesaplama tam sayıları β1,...,βk ile Ö(günlükn) Sorunun işaretini belirlemeye eşdeğer olacak şekilde bitler Λ: =Σben=1kβbengünlükpben.

  2. Eğer β1==βk=0, ürünlerin eşit olduğunu yanıtlayın.

Aksi takdirde Λ0. By Baker'ın teoremi , biz ciltli düşürebilir

|Λ|>2Clogn
belli bir sabit için C. Böylece, aşağıdakiler doğru bir şekildeΛ:
  1. Çıkış işareti i=1kβiπi, nerede πi bir yaklaşımıdır logpi için m:=Clogn+k+1 doğruluk bitleri.

İzin Vermek M(m) ikisinin çarpımının maliyeti olmak mbit tamsayıları. Mevcut en iyi sınırM(m)=O(mlogm2O(logm)), ama burada önemsiz olsak bile çok fazla fark yaratmaz. O(m2)çarpma algoritması. Hesaplayabilirizlogpi için m zaman içindeki doğruluk bitleri O(M(m)logm)AGM yinelemesini kullanarak (örneğin buraya bakın ) ve sonraiβiπi zaman alır O(M(m)). Genel olarak, 4. adım zaman alırO(M(m)logm)O(lognpoly(loglogn)).

Bu nedenle, algoritmanın çalışma süresine O(n) İlk adım.


Teşekkürler! Daha sonra detaylar üzerinde çalışmam gerekecek, ama bu çok umut verici görünüyor!
user168715
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.