Big O'da sabit faktörlerin ihmal edilmesinin gerekçesi


20

Çoğu zaman karmaşıklıkların 3n gibi sabitleri varsa, bu sabiti ihmal ederiz ve O (3n) değil O (n) diyoruz. Bu üç katlı değişikliği nasıl ihmal edebileceğimizi anlayamıyorum? Bir şey diğerinden 3 kat daha hızlı değişiyor! Bu gerçeği neden ihmal ediyoruz?


"Can" semantiği önemlidir. Uygulamada, genellikle can not ihmal tür değişiklikler, ancak bu (gerçek dünyada yani açıklayan algoritma performans) Landau notasyonu için yapılan bir şey değildir. Daha kesin Biçimsel yapmak mevcuttur.
Raphael

Yanıtlar:


22

Asimptotik notasyonların sabit faktörleri nasıl görmezden geldiğini rasyonelleştirmek için genellikle bunu şöyle düşünüyorum: asimptotik karmaşıklık, farklı algoritmaların performansını karşılaştırmak için değil, tek tek algoritmaların performansının giriş boyutuna göre nasıl ölçeklendiğini anlamak içindir.

Örneğin, 3n adım atan bir fonksiyonun olduğunu söyleriz O(n), çünkü kabaca konuşmak gerekirse, yeterince büyük girdiler için, giriş boyutunun iki katına çıkarılması, atılan adım sayısının iki katından fazla olmayacaktır. Benzer şekilde, O(n2) , giriş boyutunun iki katına çıkarılması adım sayısını en fazla dört katına çıkaracak ve O(logn) giriş boyutunun iki katına çıkarılması adım sayısını en fazla bir miktar artıracağı anlamına gelir.

Hangi algoritmaların daha iyi ölçeklendiğini söylemek için bir araçtır, hangilerinin kesinlikle daha hızlı olmadığını.


11

İlk olarak, diğer cevapların daha önce açıkladığı gibi, , ya da kelimelere koymak için bir işlev O (O(3n)=O(n) , ancak ve ancak bu ise O ( n ) . f = O ( 3 , n ), olduğu anlamına gelir, bir nokta , N ve faktör3 , öyle ki tüm n N , f ( n ) 33O(3n)O(n)f=O(3n)NC3nN . Şimdi çekme1 = 3 C 3 : tüm n 1.n , yani f = O ( n ) . Sohbetin kanıtı benzer.f(n)C33nC1=3C3 , f ( n ) nNf(n)C1nf=O(n)

Şimdi bunun doğru araç olmasının nedeni. Bir algoritmanın karmaşıklığını ölçtüğümüzde bir birim vermediğimizi gözlemleyin. Saniyeler veya makine talimatları saymıyoruz: her birinin sınırlı bir zaman aldığı bazı belirtilmemiş temel adımları sayıyoruz. Bunu yapıyoruz, çünkü aynı algoritmayı farklı bir makinede çalıştırmak talimat başına gereken süreyi değiştirecektir - saat frekansını 3 ile çarpın3 ile ve yürütme süresi den f ( n ) / 3 ' e giderf(n)f(n)/3. Aynı algoritmayı farklı bir dilde veya farklı bir sistemde uygularsak, her temel adımda geçen süre farklı olabilir, ancak yine de bu çok fazla ayrıntıdır: bu farkları hiç umursamayız.

Kesin zamanlamaları önemsediğinizde, asimptotik karmaşıklık ilgili değildir: asimptotik karmaşıklık, ele aldığınız gerçek giriş boyutları olabilecek veya olmayabilecek çok büyük giriş boyutları için neler olduğunu size söyler.


Ayrıca Sedgewick'in "Algoritmaların Analizine Giriş" savunucularının o(g)doğru önlem olarak kullandığını , yani çalışma zamanlarını tanımlamanın bir yolu olarak (hala isterseniz hâkim temel operasyonlar açısından, ancak OP'yi rahatsız eden sabit faktör dahil). limng(n)T(n)=1
vonbrand

2
@vonbrand Sedgewick bunu gerçekten söylüyor mu? T ( n ) o ( g ( n ) ' in olağan tanımıT(n)o(g(n) nin (yani, fraksiyonun tersi ve sınır sıfırdır) birlik).limn(T(n)/g(n))=0
David Richerby

3

Big-O tanımını hatırlayın:

vardır ancak ve ancak c > 0 öyle ki f ( n ) c gr ( nf(n)O(g(n))c>0 için tüm n .f(n)cg(n)n

Bu tanım altında, biz o var her sabit d içinO ( n ) vardır . O gösterimininamacı,ifadeleri tam olarak bu şekilde basitleştirmektir. Nitekim, 3 n hızlı olduğu kadar 3 kez büyür n , ama ikisi de doğrusaldır. Bunun haklı olup olmadığı - bağlama bağlıdır. Ancak O gösteriminikullanmayı kabul ederseniz, tanım gereği bu geçerlidir.dnO(n)dO3nnO


2
Bu, Big-O için harika bir açıklama sağlar, ancak bu tanımı NEDEN kullandığımızla ilgili hiçbir açıklama yoktur.
jmite

Yazdığım gibi - amaç hayatlarımızı basitleştirmek. Çünkü bir atomik operasyonun tam maliyetini bilmiyoruz ya da asimptotik notasyonu önemsediğimiz için. NEDEN ilginç bir matematik sorusu değil, felsefi bir soru buluyorum. Teknik olarak onsuz yapabiliriz. İşleri gerçekten çirkin ve zorlaştırırdı.
Shaull

3

Büyük O gösterimi, performans varyasyonunu ölçmek için birimsiz bir ortalamadır, bu nedenle hesaplama ilkellerinin göreli maliyetlerine karşı geçirimsizdir.

Özetle: Büyük O gösterimi, birimsiz, göreceli bir ölçüm türüdür (mutlak ölçümün aksine). Sabitlerin çok önemli olduğu mutlak performansı değil, yalnızca performans varyasyonunu ölçebilir. Avantajı, bu maliyetler, pozitif sabit üst ve alt sınırlara sahip olduğu sürece, temel işlemlerin göreli maliyetlerini göz ardı edebilecek daha basit analizlere izin vererek uygulamayı büyük ölçüde bağımsız hale getirmesidir. Ancak sonuç, sabit faktörlerin anlamsız olmasıdır . Yine de, amaçlanan amacı için bile, asimptotik karmaşıklık analizi diğer nedenlerle sorgulanabilir ve dikkatle düşünülmelidir. Örneğin, ham girdi boyutu dikkate alınacak doğru parametre olmayabilir.

İlk açıklama, sorunuzun tam olarak doğru bir şekilde ifade edilmediğidir. Eğer sabit ihmal zaman de 33 , orada gerçekten bir "üç kat değişim", ancak her ikisi de aynı oranda değişir ve can not Assert bu "[on] şey daha hızlı diğer 3 kat daha fazla farklı olan".3n

Landau notasyonundaki sabiti görmezden gelmenin iyi bir nedeni, güvenebileceğimiz hiçbir birimimiz olmamasıdır. Birisi A'nın B'den iki kat daha uzakta yaşadığını ifade ettiğinde, bunun herhangi bir birimden bağımsız olarak bir anlamı vardır. Işık yıllarında yaptığım mesafeleri inç cinsinden ölçmenize rağmen üzerinde anlaşabiliriz. Ancak mutlak mesafe ölçümü, birimlerin belirtilmesini gerektirir ve sayısal formülasyonu, seçilen birime bağlıdır.

Bir algoritma tarafından alınan gerçek zaman, makineye çok bağlı olan temel işlemlerin yürütme süresine bağlıdır. Temel işlemlerin sayısını sayabilirsiniz, ancak hepsinin aynı zamanı aldığına inanmak için bir neden yoktur ve birkaç işlemi tek bir işlemde birleştirmek veya bir işlemi tersine küçük işlemlere ayırmak her zaman mümkündür, böylece sayı bir sanal makinede anlaşmadıkça, işlemlerin gerçekten anlamlı olmadığı anlamına gelir. Referans bağımsız olmak bir avantajdır.

Yaklaşımın avantajına başka bir bakış, analizde önem verdiğiniz tek şey, maliyetlerinin bir üst sınırı ve pozitif bir alt sınırı olduğu sürece temel işlemlerin sayısını saymaktır. Bireysel maliyet konusunda endişelenmenize gerek yok.

Bununla birlikte, bu avantaj için ödenecek fiyat, hesaplama maliyeti değerlendirmesinin belirtilmemiş birimle verilmesi ve hesaplama süresinin, örneğin nanosaniye veya milenyum olabileceğidir - bilmeye bile çalışmayız. Diğer bir deyişle, sabit faktörler anlamsızdır, çünkü değişen birimler değişen sabit faktörlerden ayrılamaz ve hiçbir referans birimi kullanılmaz.

Patrick87 tarafından belirtildiği gibi , bu, bir algoritmanın giriş boyutuna göre nasıl ölçeklendiğini anlamak için yeterlidir, ancak bir referans birimine güvenmeksizin, mutlak bir performans ölçüsü vermeyecektir. Ortak bir referans soyut makinesinin ayrılması, biri farklı algoritmaların performansını karşılaştırmak istediğinde yapılabilir, ancak karşılaştırmanın gerçekleşme ayrıntıları ile önyargısız olmamasını sağlamak daha zordur. Asimptotik karmaşıklıkta, algoritmayı kendisiyle karşılaştırdığınız için bu risk önlenir.

Her neyse, sadece saf bir programcı bir algoritma seçmek için sadece asimptotik karmaşıklığa güvenirdi. Açıklanamayan sabit ve temel işlemlerin gerçek maliyeti de dahil olmak üzere birçok kriter vardır. Ayrıca, en kötü durum karmaşıklığı zayıf bir gösterge olabilir, çünkü en kötü durum karmaşıklığının kaynağı nadiren ve girişin sınırlı bir etkiye sahip olacak kadar küçük fragmanlarında ortaya çıkabilir. Örneğin, Bitişik Ağaç Gramerleri için genel ayrıştırıcıların teorik karmaşıklığı vardır ve pratikte oldukça kullanılabilirler. Bildiğim en kötü durum Damas-Hindley-Milner polimorfik tip çıkarımdırO(n6)üstel en kötü durum karmaşıklığına sahip olan ML için kullanılan algoritma. Ancak bu, ML kullanıcılarını rahatsız etmiyor veya ML'de çok büyük programların yazılmasını engellemiyor gibi görünüyor. Önemli olan sabitten daha fazlası var. Aslında, asimtotik analiz, bir hesaplama maliyetinin bir ölçüsü ile girdinin karmaşıklığının bir ölçüsüdür. Ancak ham boyut doğru önlem olmayabilir.

Karmaşıklık karar verilebilirlik gibidir, teorik olarak kötü olabilir, ancak bu veri alanının çoğu için ilgisiz olabilir ... bazen. Asimptotik karmaşıklık analizi, tüm araçlar gibi avantajları ve sınırlamaları ile iyi ve iyi tasarlanmış bir araçtır. Anlamsız olabilen sabiti açıklamak veya açıklamamak, yargı kullanmak gereklidir.


2

Diğer cevaplar, Big-O tanımına göre neden O(n)=O(3n)

n3n

Bu, bir algoritmanın ne kadar hızlı olacağını tahmin etmede çok daha kullanışlıdır. Aksi takdirde, anlaşılması çok zor olan devasa parçalı bir işleve bakmamız gerekirdi.

Diğer ana neden, bu ölçümlerin donanımdan bağımsız olmasıdır. Farklı derleyiciler ve mimariler aynı kodu çok farklı talimat setlerine dönüştürecektir. Bununla birlikte, talimat sayısının doğrusal, üstel vb. Olduğunu bilersek, derlediğimiz veya çalıştırdığımız gerçek bilgisayardan bağımsız olarak, tutulan algoritmalar hızı hakkında bir fikrimiz var.


1

f(n)=O(g(n))lim supnf(n)g(n)<+

g(n)=ng(n)=3n

O(n2)=O(.00005321n2+1000000000n+1046803)f=


2
=O(...)

fO(g)fO(nn2)f(x)=h(x)xx=n=

f(n)f

Genellikle bunu da, gösterimin kötüye kullanılması olduğunu bilerek de yaparım;)
yo '

-1

Size basitçe açıklayayım. Şimdi n = 100000 alalım. Şimdi, 3n nedir? 300000 ( Evet, 3 kat n ) Ama n ^ 2 nedir nedir? 10000000000 . ( n'in 1 lakh katıdır ). n ^ 2'yi n ile karşılaştırın. 1 lakh ile karşılaştırıldığında 3 ihmal edilebilir. böylece kaldırabiliriz.

N'nin milyarlarca veya trilyonlarca olduğunu düşünün. Bu durumda yine 3'ü milyarlarca veya trilyonla karşılaştıracağız. Şimdi, neden ihmal edebileceğimizi biliyorsunuz 3.


2
Üç yıl hala bir yıldan daha uzun bir süredir.
Yuval Filmus

Bunun soruyu nasıl faydalı bir şekilde cevapladığını görmüyorum. Mevcut, eski cevaplara kesinlikle bir şey katmıyor.
Raphael
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.