Sayılardaki temel işlemlerin zaman alacağını nasıl varsayabiliriz?


73

Normalde algoritmalarda sayıların karşılaştırılması, eklenmesi veya çıkarılması umurumda değil - onların zamanlarında çalıştıklarını varsayıyoruz . Örneğin, karşılaştırmaya dayalı sıralamanın olduğunu söylediğimizde bunu varsayıyoruz , ancak sayılar kayıtlara sığmayacak kadar büyük olduğunda, normalde bunları sıralar olarak temsil ediyoruz, bu yüzden temel işlemler eleman başına ekstra hesaplamalar gerektiriyor.O ( n log n )O(1)O(nlogn)

de iki sayının (veya diğer ilkel aritmetik fonksiyonların) karşılaştırmasının yapılabileceğini gösteren bir kanıt var mı ? Neden değilse, karşılaştırmaya dayalı sıralamanın mu söylüyoruz ?O ( n log n )O(1)O(nlogn)


SO sorusuna cevap verdiğimde bu problemle karşılaştım ve algoritmamın olmadığını fark ettim çünkü er ya da geç big-int ile başa çıkmalıyım, aynı zamanda sözde polinom zaman algoritması değildi, .PÖ(n)P


3
Sayıların karşılaştırılmasının karmaşıklığını sayacaksanız, karmaşıklık sınırlarınızı da girdilerin bit büyüklüğüne göre yazmalısınız. Böylece bit sayıları verildiğinde , girişin bit büyüklüğü ve sıralama sürede yapılabilir. w n = N w O ( N w log N ) = O ( n log n )N- wn=N-wÖ(N-wkütükN-)=Ö(nkütükn)
Sasho Nikolov

2
temelde karmaşıklık çalışmasının iki “bölgesi” veya “rejimi” vardır. genel olarak işlemlerin, kayan nokta, örneğin 2-4 bayt dahil sabit genişlikte sayı temsiline sahip çoğu bilgisayar dili için makul bir yaklaşım olan "sabit genişlikte" işlemler için varsayıldığı varsayılır (bkz. örneğin IEEE standartları). o zaman, sayıların keyfi büyüklükte olduğu ve işlemlerin karmaşıklığı konusunda daha dikkatli / kesin bir çalışma bulunan “keyfi kesin aritmetik” var. ilk bağlam daha çok uygulamalı analizde, ikincisi teorik / soyut analizde daha fazla. Ö(1)
saat

Yanıtlar:


75

Benim gibi yaşayanlar için algoritmalar inceleyen insanlar için, 21. yüzyılın standart hesaplama modeli RAM tamsayısıdır . Model, gerçek bilgisayarların davranışlarını Turing makine modelinden daha doğru olarak yansıtmayı amaçlamaktadır. Gerçek dünyadaki bilgisayarlar, paralel donanımı kullanarak, birden çok bit tam sayılarını sabit sürede işler; isteğe bağlı tamsayılar değil , (çünkü sözcük boyutları zaman içinde sabit bir şekilde büyüdüğü için) sabit boyutlu tamsayılar da değildir.

Model tek parametresine bağlıdır olarak adlandırılan, kelime uzunluğu . Her hafıza adresi, tek bir w- bit tam sayı veya sözcük tutar . Bu modelde, giriş büyüklüğü n , girdideki sözcük sayısıdır ve bir algoritmanın çalışma süresi sözcüklerin üzerindeki işlem sayısıdır . Standart aritmetik işlemler (toplama, çıkarma, çarpma, tamsayı bölme, kalan, karşılaştırma) ve kelimelerin boolean işlemleri (bitsel ve / veya xor, shift, döndürme) tanımlamaya göre O ( 1 ) zaman gerektirir .wwnÖ(1)

Resmen, " " kelimesiw bu modeldeki algoritmaları analiz etmek için bir sabit DEĞİLDİR . Modeli sezgiyle tutarlı hale getirmek için ihtiyacımız var çünkü aksi halde n tamsayısını tek bir kelimede bile saklayamıyoruz . Bununla birlikte, çoğu sayısal olmayan algoritmalar için, çalışma süresi aslında w'den bağımsızdır , çünkü bu algoritmalar girişlerinin altındaki ikili gösterimi önemsemezler. Mergesort ve heapsort, O ( n log n ) zamanında çalışır; median-of-3-quicksort, O ( n 2wkütük2nnwÖ(nkütükn) en kötü durumda zaman. Kayda değer bir istisnası çalışır ikili basamağa göre sıralama vardır Ç ( n w ) zaman.Ö(n2)Ö(nw)

ayarı bize geleneksel logaritmik maliyetli RAM modelini verir. Fakat bazı tamsayılı RAM algoritmaları, Andersson ve arkadaşlarının doğrusal zaman tamsayılı sıralama algoritması gibi daha büyük sözcük boyutları için tasarlanmıştır . , w = Ω gerektiren ( log 2 + ε n ) .w=Θ(kütükn)w=Ω(kütük2+εn)

Uygulamada ortaya çıkan birçok algoritma için, kelimesi sadece bir sorun değildir ve çok daha basit, tekdüze maliyetli RAM modeline geri dönebiliriz (ve yapabiliriz). Tek ciddi zorluk, çok hızlı bir şekilde çok büyük tam sayılar oluşturmak için kullanılabilecek iç içe çarpmadan kaynaklanır . Biz aritmetik gerçekleştirmek olsaydı keyfi sabit zamanda tamsayılar, Çözebileceğimiz polinom zamanda Pspace içinde herhangi bir sorun .w

Güncelleme: Ayrıca Fürer'in tam sayı çarpım algoritması gibi, çoklu turing makinelerini kullanan (veya eşdeğeri "bit RAM") ve "teorik olarak analiz edilen çoğu geometrik algoritma " gibi "standart model" istisnaları olduğunu da belirtmeliyim. temiz ama idealize edilmiş “gerçek RAM” modeli .

Evet, bu bir kurtçuk kutusudur.


3
Sadece oy kullanmam gerektiğini biliyorum, ancak şunu söylemekten kendimi alamam: Bu en iyi cevap. İşin püf noktası, (1) aritmetik işlemlerin tanım olarak sabit zaman olmasıdır ve bu sorun değil çünkü teoride herhangi bir modeli seçebilir ve (2) belirli bir modeli seçmek için bazı nedenleriniz olmalıdır ve bu cevap onların ne olduğunu açıklar.
rgrig

Rgig ile aynı fikirdeyim (Ayrıca sadece oy kullanmam gerekiyor), ancak küçük bir sorun girdi büyüklüğü girdi sayılarıyla ilgili değil, örneğin eğer bir girdisi varsa en büyük sayı m'dir ve hesaplama modelini seçersem sevdiğim gibi, bu yalancı polinom zaman algoritmasına P neden olur , doğru muyum? nmP

1
Girişiniz bitten daha büyük sayılardan oluşuyorsa , modele uyması için gerçek hayatta olduğu gibi onları w- bit parçalarına bölmeniz gerekir . Örneğin, girişiniz 0 ile M arasında N tamsayılarından oluşuyorsa, gerçek giriş boyutunuz N log w M = ( N lg M ) / ( lg w ) olur . Bu nedenle, O ( N M ) zamanı gibi sahte polinom çalışma süreleri , M büyük olduğunda, giriş boyutunda hala üssel olmaktadır .wwN-0MN-kütükwM=(N-lgM)/(lgw)Ö(N-M)M
JeffE

Real RAM modelinde gizlice "Order Type RAM" algoritması olmayan analiz edilen herhangi bir algoritma var mı? Daha önce hiç düşünmedim, ama hızlı bir şekilde olmayan bir örnek bulamıyorum.
Louis

1
@Louis: Evet çok: Voronoi diyagramları, Öklid kısa yollar, yinelemeli çelikler, simpleksel parçalanmış ağaçlar, .... Ancak en iyi örnek Gauss çalışır giderilmesi, bir gerçek RAM modeline zaman (ya da birim maliyet tamsayı RAM, ancak tamsayı RAM'de O ( n 4 ) zamana ihtiyaç duyarÖ(n3)Ö(n4)
JeffE

24

Sadece içeriğe bağlı. Algoritmaların bit seviyesi karmaşıklığı ile uğraşırken , iki bit sayısının eklenmesinin O ( 1 ) olduğunu söylemiyoruz, O ( n ) olduğunu söylüyoruz . Benzer şekilde çarpma vb.nO(1)Ö(n)


Referanslı makalenizden: "iki farklı şekilde ölçülebilir: biri test edilen veya çarpılan tam sayılar ve biri de bu tam sayıların ikili sayıları (bitler) açısından", ancak bu doğru değil, biz Daima giriş boyutuna göre ölçmelisiniz.

1
@ SaeedAmiri: sadece kullanılan kodlamaya bağlıdır. Makalede, örneğin, giriş bir tam sayı olduğu, eğer , test bölümü sadece gerektirecektir tekli kodlama kullanılarak belirtilen İçeride ISTV melerin RWMAIWi'nin ( n 1 / 2 ) . Bu girişin boyutunda polinom! Bu, deneme bölünmesine göre yapılan faktoringin P olduğu anlamına mı geliyor ? Hayır, algoritma sözde polinomdur . Ortak ikili kodlamayı kullanarak, tekrar girdi boyutunda üstel bir algoritma elde edersiniz. Belirtildiği gibi, bu, n girişindeki bitlerin sayısının kodlamasını değiştirerek katlanarak azaldığı için gerçekleşir. nθ(n1/2)Pn
Massimo Cafaro

Bu arada, gerçek durumlarda parametrelerinin büyüklüğünün oldukça düşük olması durumunda sözde polinom algoritmaları aslında yararlı olabilir. En ünlü örnek muhtemelen sırt çantası problemini çözmek için sahte polinom algoritmasıdır.
Massimo Cafaro

Öncelikle, başvurulan wiki sayfanızın iyi olmadığını belirtmeliyim çünkü iyi referansları yok, Ayrıca neden sahte sözde polinom zaman algoritmaları hakkında konuştuğumu düşündüğümü bilmiyorum, giriş boyutu normalde buttleneck olabilir. bu durumlarda ama ben olan sorunlar hakkında çoğunlukla bahsediyorum, onlardan bahsetmiyorum biz hile ve NPC sorun olduğunu söyleyemeyiz çünkü zaten sıralama gibi, hatta girdi boyutunun varsayımı ile P ben yapmamalıyız düşünüyorum Diyelim ki sıralama O ( n log n ) 'dir, ancak karşılaştırmayı yok saymak için resmi bir kanıtımız vardır. PPÖ(nkütükn)

Dikkatinizi girdi boyutuna odaklamak, yanlış yönlendirici olabileceğini göstermek için sahte polinom algoritmalarını tartışıyorum. İşte başka bir örnek. Girdi olarak olarak doğal bir sayı verilir ve algoritma n yinelemede O ( 1 ) zaman işlemlerini yaptığı bir döngü çalıştırır . Girdi boyutunun bir fonksiyonu olarak ölçülen bu basit döngü algoritmasının karmaşıklığı, O ( n ) = O ( 2 l g n ) 'dir . Yana l g nnO(1)nO(n)=O(2lgn)lgngiriş boyutu, algoritma giriş boyutunda üstel! Bunun hakkında düşün. Şimdi "Sadece içeriğe bağlı" ile ne demek istediğimi anlayabilirsiniz.
Massimo Cafaro

16

Soruyu belirtildiği gibi cevaplamak için: algoritmalar sadece RAM modelini kullanarak oldukça sık olarak yaparlar. Sıralama için, çoğu durumda insanlar , bağlantılı cevapta biraz daha fazla tartışacağım daha basit karşılaştırma modelini bile analiz eder .

Neden yaptıkları hakkındaki açık soruyu yanıtlamak için : Bu modelin, sayının hepsinin "küçük" olduğu ve gerçek makinelerde kayıtlara sığdığı bazı kombinasyon algoritmaları için oldukça iyi bir tahmin gücü olduğunu söyleyebilirim.

Sayısal algoritmalar hakkında örtük takiplere cevap vermek için: Hayır, eski düz RAM modeli buradaki standart değildir. Gauss ortadan kaldırılması bile biraz bakım gerektirebilir. Genel olarak, rütbe hesaplamaları için Schwartz Lemma girecektir (örneğin, burada Bölüm 5 ). Bir başka kanonik örnek, analiz etmek için biraz özen gerektiren Elipsoid Algoritmasının analizidir .

Ve son olarak: İnsanlar daha önce , hatta daha önce dize sıralama hakkında düşündüm .

Güncelleme: Bu soruyla ilgili sorun, "biz" ve "varsayalım" ifadelerinin tam olarak belirtilmemesidir. RAM modelinde çalışan insanların sayısal algoritmalar veya karmaşıklık teorisi yapmadıklarını söyleyebilirim (bölünmenin karmaşıklığının belirlenmesinin ünlü bir sonuç olduğu ).


Hmmmm, ilginç bir cevap gibi görünüyor ....

Soruyu tam olarak cevaplamamasının bir nedeni var mı?
Louis

7

Bununla ilgili herhangi bir çalışma bulamadım, ancak Kozen, "Algoritmaların Tasarımı ve Analizi" nin girişine modelinin "ılımlı veriler için [log-maliyet modelinden] deneysel gözlemi daha doğru yansıttığını söylüyor boyut (çarpma işleminden gerçekten bir zaman aldığından beri). " Ayrıca , O ( 1 ) modelinin nasıl kötüye kullanılabileceğinin bir örneği olarak bu makaleye bir referans vermektedir .Ö(1)Ö(1)

python -mtimeit "$a * $b"$a10{1,2,...,66}$b = 2*$a

1050kütük10(sys.mbirxbennt)


O(n)O(nlognlogm)

7

Ö(1)

Ö(kütükM)Ö(N-kütükN-)Ö(N-kütükN-kütükM)

M


Ö(kütükm)Ö(kütükn)m

Ö(lÖgN-)

nnnn

Haklısın, cevabımı düzelttim.
Erel Segal-Halevi,

4

Genelde O (1) aritmetik işlemleri üstlendiğimizi söyleyebilirim çünkü genellikle 32 bit tam sayılar veya 64 bit tam sayılar veya IEEE 754 kayan nokta sayıları bağlamında işler yapıyoruz. O (1) muhtemelen bu tür aritmetik için oldukça iyi bir yaklaşımdır.

Ancak genel olarak, bu doğru değil. Genelde toplama, çıkarma, çarpma ve bölme işlemlerini gerçekleştirmek için bir algoritmaya ihtiyacınız vardır. Boolos, Burgess ve Jefferies'nin Hesap Verebilirliği ve Mantığı , dördüncü Basım kopyamda, bir kaç farklı biçimsel sistem açısından, Özyinelemeli Fonksiyonlar ve Abaküs Makineleri anlamında bunun kanıtlarını / anlamlarını anlamanın bir yolu olarak akla geliyor.

Bu iki işlemin neden O (1) olmadığının anlaşılması kolay bir açıklaması için, kilise sayıları ile çıkarma ve bölme işlemlerine ilişkin lambda-calculus terimlerine bakabilirsiniz. Toplama, çarpma ve üstelleştirme için görmek biraz zor, ama kilise sayıları şeklini düşünürseniz, orada.

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.