Büyük Oh gösterimi sabit değerden bahsetmiyor


13

Ben bir programcıyım ve henüz Algoritmalar okumaya başladım. Bog Oh, Big Omega ve Big Theta isimlerinde tamamen ikna olmadım. Nedeni Big Oh'un tanımıdır, her zaman f (x) 'den büyük veya ona eşit olacak şekilde g (x) fonksiyonunun olması gerektiğini belirtir. Veya n> n0'ın tüm değerleri için f (x) <= cn.

Tanımdaki sabit değerden neden bahsetmiyoruz? Örneğin, 6n + 4 fonksiyonunu diyelim, O (n) olarak belirtiyoruz. Ancak, tanımın tüm sabit değer için iyi olduğu doğru değildir. Bu sadece c> = 10 ve n> = 1 olduğunda iyidir. 6'dan daha düşük c değerleri için n0 değeri artar. Öyleyse neden tanımın bir parçası olarak sabit değerden bahsetmiyoruz?


4
Sabit değeri tam olarak nasıl temsil etmeyi öneriyorsunuz?
Daniel B

1
Noktanızı bir adım ileri götürürseniz, n'yi bağlarsanız, sonlandırma işlevleri O (1) olur.
Brian

Yanıtlar:


23

Birkaç neden vardır, ancak muhtemelen en önemlisi sabitlerin algoritmanın kendisinin değil, algoritmanın uygulanmasının bir işlevi olmasıdır. Bir algoritmanın sırası, uygulamalarına bakılmaksızın algoritmaları karşılaştırmak için yararlıdır.

Bir quicksort'un gerçek çalışma süresi genellikle C veya Python veya Scala veya Postscript'te uygulanırsa değişecektir. Aynı durum kabarcık sıralaması için de geçerlidir - çalışma zamanı uygulamaya bağlı olarak büyük ölçüde değişecektir.

Bununla birlikte, değişmeyecek olan şey, diğer her şeyin eşit olması, veri kümesi büyüdükçe, bir kabarcık türünü çalıştırmak için gereken sürenin, hangi dil veya makine olursa olsun, tipik bir durumda hızlı sıralama çalıştırmak için gereken süreden daha hızlı artacağı gerçeğidir. makul düzeyde doğru bir uygulama olduğu varsayılarak uygulanmaktadır. Bu basit gerçek, somut detaylar mevcut olmadığında algoritmalar hakkında akıllı çıkarımlar yapmanıza izin verir.

Sipariş soyut içinde algoritmaları karşılaştırırken gerçek gerçek dünya ölçümlerinde önemli iken, sadece gürültü olma eğilimi faktörlerin dışında bir algoritma filtrelerinin.


22

O (n) ve diğer sıralama gösterimi (tipik olarak) küçük değerler için fonksiyonların davranışıyla ilgili değildir. Çok büyük değerler için fonksiyonların davranışı ile ilgilidir, yani n sonsuza doğru hareket ettikçe sınırlanır.

Sabitler teknik olarak önemlidir, ancak n yeterince büyüdükçe c'nin değeri tamamen önemsiz olduğu için tipik olarak soyutlanırlar. C'nin değeri önemliyse, onu analize dahil edebiliriz, ancak karşılaştırılan işlevler çok büyük sabit faktörlere sahip değilse veya verimlilik özellikle önemli bir endişe değilse, genellikle değildir.


3
Örneğin, piramitleri oluşturmak O (n), resimlerini sıralamak O (n log n) - bir noktada, resimleri sıralamak için yeni bir tane oluşturmaktan daha uzun sürecek kadar piramide sahip olabilirsiniz! Ama sadece çok sayıda piramit için!
Martin Beckett

İyi cevap, ancak belirli bir N ve tipik olarak aynı "karmaşıklık" ailesine giren iki algoritma için, OP'nin tam olarak önerdiğini yapmak ve en azından bağıl katsayıları dahil etmek haklı olabilir. Göreceli farkı göstermek için eleman başına komut sayısını iki katına çıkaran doğrusal bir algoritma, göreceli farkı göstermek için ikinci alg * O * (N) değerine * O * (2N) olarak adlandırılabilir, çünkü herhangi bir N için, ilk algoritma her zaman çift olacaktır ikincinin yürütme süresi; ancak, * O * (NlogN) gibi farklı bir karmaşıklık ailesinin bir fonksiyonu ile karşılaştırıldığında, katsayılar önemli değildir.
KeithS

10

Tanım gereğince Büyük O gösterimi şunları belirtir: Büyük O gösterimi, n 've sağındaki tüm n değerleri için, f (n) değerinin cg (n) üzerinde veya altında olduğu sezgisine dayanır. Sabitler, yüksek değerli (değişken) faktörlere (n-kare veya n-küp gibi) gittiğinizde de önemli değildir, çünkü bunlar sadece sabitlerdir ve bu faktörler kadar büyük olabilecek değişen miktarlar değildir. Aşağıda Big-O gösteriminin grafiği verilmiştir.
For a given function g(n), we denote by O(g(n)) the set of functions:
O(g(n)) = {f(n): there exist positive constants c and n' such that 0<=f(n)<=c.g(n) for all n > n'}




resim açıklamasını buraya girin

Bu notasyonun özü aslında " how lower is f(n) from c.g(n) and not when it starts becoming lower".


Bu durumda, her O (n) için de Büyük n teta olur, çünkü bir sabitin tanımına göre bir alt sınır ve bir sabit için bir üst sınırdır. örneğin 6n + 4 de büyük bir tetadır (n) çünkü c 10'dan küçük olduğunda her zaman alt sınırdır. ve c, 10'dan fazla olduğunda bir üst sınırdır. Öyleyse herhangi bir Büyük Oh gösterimi için de bir Büyük teta olduğunu söyleyebilir miyiz?
Pradeep

1
Bunun tersini söylüyorsunuz: "Büyük Teta Big Oh" demektir. Asimptotik olarak sıkı sınırlar için Big -Oh yerine Big-Theta kullanılabilir.
Vaibhav Agarwal

9

Algoritma analizinde Büyüme Düzeni temel soyutlamadır ve girdi boyutu değiştikçe çalışma süresinin değişme hızını verir. Diyelim ki bir algoritmanın çalışma süresi var f(n) = 2n + 3. Şimdi bazı girdi boyutlarını ekliyoruz,

n = 10: 2 * 10 + 3 = 23

n = 100: 2 * 100 + 3 = 203

n = 10000: 2 * 10000 + 3 = 20003

n = 1000000: 2 * 1000000 + 3 = 2000003

n = 100000000 : 2 * 100000000 + 3 = 200000003

Görülebileceği gibi, büyüme sırası esas olarak değişken tarafından belirlenir n; sabitler 2 ve 3 daha az anlamlıdır ve girdi boyutu büyüdükçe, bunu belirlemede daha da az önem kazanırlar. Bu nedenle algoritma analizinde sabitler, bir fonksiyonun büyüme sırasını belirleyen değişken lehine azalır.


1

Big-Oh notasyonu kavramı, sabitleri görmezden gelmek ve bir algoritmanın çalışma süresini tanımlayan fonksiyonun en önemli bölümünü sunmaktır.

Bir an için resmi tanımı unutun. Hangisi daha kötü (daha hızlı büyüyen) fonksiyon, n^2 - 5000veya 5000 n + 60000? n5000'den az için , doğrusal fonksiyon daha büyüktür (ve dolayısıyla daha kötüdür). Bunun ötesinde (tam değer 5013?), İkinci dereceden denklem daha büyüktür.

5000'den azdan daha fazla (oldukça az) pozitif sayı olduğundan, ikinci dereceden genel olarak 'daha büyük' ​​(daha kötü) fonksiyon olarak kabul edilir. Sipariş gösterimi (Big-Oh vb.) (Bu tanımları kullanarak her zaman bir katkı ve çarpma sabitini ortadan kaldırabilirsiniz).

Tabii ki, işler her zaman basit değildir. Bazen do bu sabitleri bilmek istiyorum. Hangisi daha iyi Insertion sort veya Bubble sort? Her ikisi de O(n^2). Ama biri gerçekten diğerinden daha iyi. Daha ayrıntılı analizlerle merak ettiğiniz sabitler elde edilebilir. Big-Oh fonksiyonunu hesaplamak genellikle daha kesin bir fonksiyondan çok daha kolaydır.

Big-Oh, en önemli karşılaştırmaları kolaylaştırmak ve kolaylaştırmak için bu sabitleri yok sayar. Genellikle biz çünkü notasyonu gibi değil (çoğunlukla alakasız) sabitler hakkında bilmek istiyorum.


1

(bu daha uzun bir yanıt olduğundan, özet için kalın harfleri okuyun )

Örneğinizi alalım ve adım adım ilerleyerek yaptıklarımızın arkasındaki amacı anlayalım. Fonksiyonunuzla ve Big Oh notasyonunu bulma hedefiyle başlıyoruz:

f(n) = 6n+4

Birincisi, let O(g(n))notasyonu Big Oh olmak biz bulmaya çalışıyoruz f(n). Büyük Oh tanımına bakıldığında, biz bulmalıyız basitleştirilmiş g(n) bazı sabitleri vardır nerede cve n0nereye c*g(n) >= f(n)herkes için geçerlidir ns' den büyüktür n0.

İlk olarak, seçim yapalım g(n) = 6n + 4(ki bu O(6n+4)Big Oh'da gelir). Bu durumda şunu görüyoruz c = 1ve herhangi bir değeri n0Big Oh tanımımızdaki matematiksel gereksinimleri karşılayacaktır, çünkü g(n)her zaman eşittir f(n):

c*g(n)      >=  f(n)    
1*(6n + 4)  >=  6n + 4    //True for all n's, so we don't need to pick an n0

Bu noktada matematiksel gereksinimleri karşıladık. Eğer durursakO(6n+4) , bunun yazmaktan daha yararlı olmadığı açıktır, bu f(n)yüzden Big Oh notasyonunun gerçek amacını kaçıracaktır: bir algoritmanın genel zaman karmaşıklığını anlamak! Böylece, bir sonraki adıma geçelim: basitleştirme.

Birincisi, Büyük Oh'un durumundan basitleştirebilir miyiz ? Hayır! 6nO(4) (Nedenini anlamıyorlarsa okuyucu için egzersiz yapın)

İkincisi, Büyük Oh'un olmasını basitleştirebilir miyiz ? Evet! 4O(6n) Bu durumda, g(n) = 6nbu yüzden:

c*g(n)    >=  f(n)
c*6n      >=  6n + 4     

Bu noktada, c = 2o zamandan beri sol tarafın her bir artışı için sağ taraftan (6) daha hızlı artacaktır (12) n.

2*6n      >=  6n + 4

Şimdi n0yukarıdaki denklemin nbu değerden daha büyük olan herkes için geçerli olduğu yerde bir pozitif bulmamız gerekir . Sol tarafın sağdan daha hızlı büyüdüğünü zaten bildiğimiz için tek yapmamız gereken tek olumlu çözüm bulmak. Bu nedenle, n0 = 2yukarıdakileri doğru yaptığından, biliyoruz g(n)=6nveya O(6n)potansiyel bir Büyük Oh gösterimi f(n).

Şimdi, Büyük Oh'un öyle olmasını basitleştirebilir miyiz ? Evet! 6O(n) Bu durumda, g(n) = nbu yüzden:

c*g(n)      >=  f(n)    
c*n         >=  6n + 4    

c = 7Soldan sağdan daha hızlı artacağından seçelim .

7*n         >=  6n + 4

Yukarıdakilerin, ndaha büyük veya eşit olan herkes için geçerli olacağını görüyoruz n0 = 4. Böylece, O(n)potansiyel bir Oh Oh gösterimidir f(n). g(n)Artık basitleştirebilir miyiz ? Hayır!

Son olarak, biz fark ettik için en basit Big Ah gösterimi f(n)olduğunu O(n). Neden bütün bunları yaşadık? Çünkü şimdi bunun f(n)doğrusal olduğunu biliyoruz , çünkü Büyük Oh notasyonu doğrusal karmaşıklıktır O(n). Güzel olan şu ki, zaman karmaşıklığını f(n)diğer algoritmalarla karşılaştırabiliriz! Örneğin, artık biliyoruz f(n)işlevlerine karşılaştırılabilir zaman karmaşıklığı ise h(n) = 123n + 72, i(n) = n, j(n) = .0002n + 1234vb; çünkü yukarıda belirtilen aynı sadeleştirme işlemini kullanarak hepsinin doğrusal zaman karmaşıklığı vardır O(n).

Tatlı!!!


Merhaba, İyi açıklama. Hala birkaç şüphem var. 1. Değişken 'n' değeri olduğundan 6n + 4'ü O (4) olarak yapamayız. Cevap bu mu? 2. sadeleştirme yaparken c = 7 seçtiniz ve buna karşılık gelen n0 ila 4'ü hesapladınız. çünkü c değerine bağlı olarak n0 değişecektir.
Pradeep

@Pradeep: 1 için haklısın. Daha derin bir açıklama için: Eğer denersek O(4), bu eşitsizlik denklemimizi yapar c*4 >= 6n+4ve cseçtiğimiz herhangi biri için her zaman nyukarıdaki değerlerin eşitsizliği yanlış yapacağı bir değer bulabilirdik .
Briguy37

@Pradeep: 2 için, gerçek değerleri cve n0önemli değildir. Önemli n0olan cseçtiğimiz için var olmasıdır . Bunun doğru olması için, eşitsizliğin sol tarafının büyük değerlerinin sağ tarafından daha hızlı artması gerekir n. c=6bunun için iyi değildir ( 6n >= 6n+4asla doğru değildir), bu yüzden seçtim c=7. Kolayca seçilebilirdim c=10, c=734ya da eşitsizliği doğru yapmak için var olan c=6.0000001bazılarının n0olduğunu görebildim n >= n0, yani test ettiğimiz Big Oh geçerli.
Briguy37

Açık bir açıklama için teşekkürler. Bu tam olarak aradığım şeydi. Tekrar teşekkürler.
Pradeep

@Pradeep: Sevindim yardımcı olabilirim :)
Briguy37

1

Eğer bir performans fonksiyonunuz varsa 6n + 4, ilgili soru "6 ne?" Dir. Bir yorumun sorduğu gibi: sabitiniz neyi temsil ediyor? Fizik açısından sabit faktörünüzün birimleri nelerdir?

O () gösteriminin algoritma performansını tanımlamak için bu kadar yaygın kullanılmasının nedeni, bu soruyu cevaplamak için taşınabilir bir yol olmamasıdır. Farklı işlemciler, aynı temel hesaplamayı gerçekleştirmek için farklı sayıda saat döngüsü ve farklı süre alacaktır veya ilgili temel hesaplamaları farklı şekilde toplayabilirler. Farklı bilgisayar dilleri veya sözde kod gibi farklı resmi ve gayri resmi açıklamalar, algoritmaları doğrudan karşılaştırılması zor yollarla temsil edecektir. Aynı dildeki uygulamalar bile aynı algoritmayı farklı şekillerde temsil edebilir - satır sayısı gibi önemsiz biçimlendirme ayrıntıları, genellikle herhangi bir algoritmayı uygulamak için çok çeşitli keyfi yapısal seçeneklere sahip olacaksınız.

Başka bir açıdan bakalım: "algoritmayı" belirli bir uygulamayı tanımlamak için değil, aynı genel prosedürün tüm olası uygulama sınıfını tanımlamak için kullanırız. Bu soyutlama, genel değere sahip bir şeyi belgelemek lehine uygulama ayrıntılarını göz ardı eder ve sabit performans faktörü bu detaylardan biridir.

Bununla birlikte, algoritma açıklamalarına genellikle folklor, notlar ve hatta gerçek donanımdaki gerçek uygulamaların performansını açıklayan gerçek kriterler eşlik eder. Bu, ne tür bir sabit faktörün bekleneceğini kaba bir fikir verir, ancak aynı zamanda bir tuz tanesi ile de alınmalıdır, çünkü gerçek performans, belirli bir uygulamanın optimizasyonuna ne kadar iş gittiğine bağlıdır. Ayrıca, uzun vadede, karşılaştırılabilir algoritmaların göreceli performansı, en yeni ve en büyük işlemcilerin mimarisi değiştikçe kayma eğilimi gösterir ...

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.