Toplamanın zaman karmaşıklığı


11

Wikipedia, eklemenin zaman karmaşıklığını olarak listeler; burada , bit sayısıdır.nnn

Bu katı bir teorik alt sınır mı? Yoksa bu sadece bilinen en hızlı algoritmanın karmaşıklığı mıdır? Bilmek istiyorum, çünkü toplama karmaşıklığı, diğer tüm aritmetik işlemlerin ve bunları kullanan tüm algoritmaların altını çiziyor.

de çalışan bir ek algoritma elde etmek teorik olarak imkansız mı ? Yoksa ekleme için doğrusal karmaşıklığa bağlı mıyız.Ö(n)

Yanıtlar:


17

Eğer algoritmanız asimptotik olarak zamanından daha az kullanıyorsa , eklediği sayıların tüm rakamlarını okumak için yeterli zamana sahip değildir. Çok büyük sayıları işlediğinizi hayal edersiniz (örneğin 8MB metin dosyalarında saklanır). Tabii ki, toplama sayıların değerine göre çok hızlı bir şekilde yapılabilir ; Bu çalışan ise, zaman toplamının değeridir.O ( log ( N ) ) NnÖ(günlük(N-))N-

Bu, işleri biraz hızlandırabileceğiniz anlamına gelmez; işlemciniz her işlemi 32 bit , saat kullanırsınız, ancak bu hala değil . O(n)o(n)n32Ö(n)Ö(n)


Teorik olarak gerekli tüm verileri okumaktır . Herhangi iki ve sayısının eklenmesi için . hesaplanması , işleminde , kaydırma ile yapılabilir. ekleniyor . Bunu bir düşün. Toplam için daha hızlı bir tahmin bulamayabilirsiniz, doğru olana kadar bu tahmini hassaslaştırın. Daha az ise operasyonlar? b , a : a b , a + b 2 a 2 a O ( 1 ) 0 nbirb,bir:birb,bir+b2bir2birÖ(1)0n
Tobi Alafin

3
Evet, bu teorik bir gerekliliktir, çünkü: girişin her biti çıkışta önemsiz olmayan bir şekilde kullanılır , burada önemsiz olmayan bir şekilde kimlik işlevi değildir. Daki olarak , örneğin, ister olarak hesaplanabilir zaman hesaplama modeline bağlıdır: bir ekleme durumunda sonra Evet, sabit zaman bir işlemdir. Eğer RAM erişimi varsa, gerekmez Zaten uzunluğunu biliyorsanız zaman bitin adresini yazmak için ya da Eğer okuma izni varsa çok zaman öğrenmek için. Bu örneğinde, birçok çıkış biti giriş bitlerinin önemsiz işlevleridir. 2bir2birÖ(1)0Ö(günlük(n))birÖ(n)bir2bir
Lieuwe Vinkhuijzen

I uzunluğu bulan bir algoritma sahip içinde . İkili arama kullanır. birÖ(günlükn)
Tobi Alafin

3
@TobiAlafin Modeliniz RAM adreslemesini destekliyorsa, ikili aramanız adımlarında çalışır, düzeltin. Turing Machine'de ve ana belleğe yüklenmemiş bir metin dosyasında bu zaman alır. Her iki durumda da, aramayı hızlandırmak için RAM adresli veya RAM adressiz sorunuzu cevaplamak için, algoritmanız hesaplamak için girişin tüm bitlerine bakmalıdır . Varsayalım ve bitlik bir girişte biti incelemiyor. Sonra bu parçayı çevirebilirdim ve yanlış cevap verirdi. Ö(günlükn)Ö(n)bir+b426
Lieuwe Vinkhuijzen

1
Temelde tüm işlemler , bu nedenle. Tek istisna, bir şekilde sıralı veri yapısı ile uğraşıyorsanız: örneğin, belirli bir değer içerip içermediğini kontrol etmek için bütün bir BST'yi ziyaret etmek zorunda değilsiniz, ancak bu sadece BST ile gelen değişmezler nedeniyle geçerlidir. Ω(n)
Bakuriu

7

Karmaşıklık analizinin herhangi bir biçimsel anlam ifade edebilmesi için, nesne içindeki algoritmanın yürütüldüğü resmi bir hesaplama modeli veya en azından temel işlemlerin ne olduğunu belirten bir maliyet modeli belirtmeniz ve maliyetleri.

Çoğu bağlamda, aritmetik işlemlerin zaman aldığı varsayılır . Dahil olan sayılara bakılmaksızın algoritmik karmaşıklıkla ilgilendiğimiz için bu genellikle makuldür. Buna tek tip maliyet modeli denir .Θ(1)

Sayılar sınırsız büyüyebiliyorsa veya işlemlerin kendilerinin analiz edilmesiyle ilgileniyorsak, aritmetik işlemler girdinin boyutuyla orantılı olarak maliyetine sahip olur .Θ(|x|)

Şimdi, operasyonların maliyeti bundan daha düşük olabilir mi? Bununla birlikte, muhtemelen, içinde olabileceği bir hesaplama modelini tanımlamanız gerekecektir.


1
Ek bir örnek olarak, ileriye dönük bir taşıma ekleyicisi, uygun basitleştirici varsayımlar altında, iki bitlik sayının toplamını hesaplamak için zaman alır . Θ(günlükn)n
Fabio Somenzi

3

Ekleme girişi iki rasgele sayıdır. Keyfi oldukları için her biti okumalısınız ve bu nedenle algoritma .Ω(n)

Algoritmanızın her biti okumadan 1010100110 ve 0010010110'u başarıyla eklediğini düşünün. Algoritmanın gelişigüzel girişler ekleyebilmesi için, bu bitlerden herhangi birini rastgele çevirebilmeliyim ve algoritma yine de doğru (ama farklı) bir ek çıktı. Ancak algoritmanız her biti okumuyorsa, ters çevrilmiş girişin orijinal girişten farklı olduğunu nasıl anlayabilir?


n

Kesinlikle. Sadece algoritmanızda "yaklaşık" değerinin ne olduğunu tanımlamanız gerekir. Bu tanıma bağlı olarak, en önemli iki biti eklemek o (n) zamanında yapılabilen yaklaşık bir toplam olabilir . "Toplama" algoritmasından bahsettiğinizde, hepimizin cevabın tam olması gerektiği anlamına geldiğini düşünüyorum.
murrdpirate
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.