Asimptotik büyüme hızının hangi tanımını öğretmeliyiz?


35

Standart ders kitaplarını veya gelenekleri takip ettiğimizde, birçoğumuz bir algoritma sınıfının ilk birkaç dersinde aşağıdaki büyük-Oh notasyon tanımını öğretiyoruz: Belki tüm listeyi tüm niceleyicileriyle birlikte veriyoruz:

f=O(g) iff (c>0)(n00)(nn0)(f(n)cg(n)).
  1. f=o(g) iff (c>0)(n00)(nn0)(f(n)cg(n))
  2. f=O(g) iff (c>0)(n00)(nn0)(f(n)cg(n))
  3. f=Θ(g) iff (c>0)(d>0)(n00)(nn0)(dg(n)f(n)cg(n))
  4. f=Ω(g) iff (d>0)(n00)(nn0)(f(n)dg(n))
  5. f=ω(g) iff (d>0)(n00)(nn0)(f(n)dg(n)) .

Bu tanımlar o gibi bile basit şeyler ispat geldiğinde bu kadar kolay işe olmadığından Ancak, , çoğumuz hızlı bir şekilde "sınırın numarası" nı tanıtmak için harekete geçiyoruz:5nlog4n+nlogn=o(n10/9)

  1. f=o(g) ise vardır ve bir 0 ,limnf(n)/g(n)0
  2. f=O(g) eğer limnf(n)/g(n) mevcut olup + ,
  3. f=Θ(g) eğer limnf(n)/g(n) vardır ve ne olduğunu 0 veya + ,
  4. f=Ω(g) eğer limnf(n)/g(n) mevcut olup 0 ,
  5. f=ω(g) eğer limnf(n)/g(n) vardır ve bir + .

Sorum şu:

O kadar sınır koşullarını almaya lisans algoritmalar dersinize için büyük bir kayıp olurdu tanımları o , O , \ Teta , \ Omega ve \ omega ? Yine de hepimizin nihayetinde kullandığı şey bu ve benim için nicel tanımları atlamanın herkesin hayatını kolaylaştırdığı açıkça görülüyor.oOΘΩω

Standart gerçekten gerekli olduğu bazı ikna edici doğal bir durumla karşılaştıysanız ve eğer değilse, standardı baştan tutmaya ikna edici bir argümanınız olup olmadığını .c,n0c,n0


1
Etiket gerçekten "öğretici" olmalı, ancak ilgili etiket bulamadım ve yeni etiketler oluşturmama izin verilmedi.
slimton

1
Bu, temel olarak niceleyicileri, epsilon-delta limit tanımına çeker. Tek endişem, birçok CS öğrencisinin analiz almadığı ve bu yüzden limitleri anlamalarının çoğunlukla mekanik olduğu olabilirdi. Hızlıca hesaplanmalarını sağlamak için olsa da, bu hiç akıllıca değil.
Vognsen Per

6
İki O () tanımınızın eşdeğer olmadığını unutmayın (aynı uyarı Θ () ve Ω () için de geçerlidir). N (eşit) için f (n) = 2n, tek n için f (n) = 1 olduğu durumları göz önünde bulundurun. F (n) = 0 (n) mı? Bu durumda f (n) = Θ (n) diyebilmem için lim yerine limsup kullanmayı tercih ederim (tanımlarınızın hiçbiri buna izin vermese de). Fakat bu benim kişisel tercihim olabilir (hatta standart olmayan bir uygulama) ve asla bir ders vermedim.
Tsuyoshi Ito

2
@ Tsuyoshi: "Sınır numarası" nın amacının, için yeterli ancak gerekli olmayan bir koşul olduğunu düşündüm . ( için ayrıca gereklidir.) Salınım işlevi karşı örneğinde bir sınır yoktur. O()o()
András Salamon

1
Her tanım ve özellikte by sembolünü değiştirmemeli misiniz ? Kullanımını öğrenci olarak çok rahatsız edici buldum . ==
Jeremy

Yanıtlar:


13

Orijinal tanımı niceleyicilerle öğretmeyi tercih ederim.

IMO, insanlar genellikle doğrudan ikiden fazla niceleyici seçeneğine sahip olan formülleri ve tanımları anlamada güçlük çekerler. Yeni niceleyiciler tanıtmak, tanımın ne anlama geldiğini netleştirebilir. Burada, son iki niceleyici sadece "yeterince büyük n" için, bu tür bir nicelemenin kullanılmasına yardımcı olabilir.

Bu kavramları açıklamak için çizdiğim resimler, niceleme sürümleriyle daha iyi uyuşuyor.

Limit sadeleştirmesinin sadece büyüme oranını hesaplamakla ilgilenen, ancak bilgisayar bilimi öğrencileri için faydalı olmayacak mühendislik öğrencileri için faydalı olduğunu düşünüyorum. Aslında, bu sadeleştirmeyi kullanmak iyi olmaktan çok zarar verebilir.

Bu fikir, türevlerini (polinomlar, üstelleşme, ..., zincir kuralı, ...) hesaplama yöntemleri için kullandığımız, IMHO'nun iyi bir fikir olmadığı epsilta-delta tanımı yerine kullandığımız önerisine benzer.


Nihai hakimiyeti kavramı da yararlıdır: ancak ve ancak . Şimdi olması durumunda st . f(x)g(x)\esitsmn>mf(n)<g(n)fO(g)c>0f(x)cg(x)
Kaveh

9

Düzenleme: Revizyon 3'te ana revizyon.

Hiç bir sınıfa ders vermediğim için, öğretmemiz gerekenler hakkında ikna edici bir şey talep edebileceğimi sanmıyorum. Yine de, işte bunun hakkında düşündüğüm şey.

Yazılan “limit numarası” nın uygulanamayacağı doğal örnekler vardır. Örneğin, iki katına sahip sabit uzunluklu bir dizi kullanarak (yani, dizinin boyutunu her aşmak üzereyken), "değişken uzunluklu bir vektör" (C ++ 'da <T> vektörü gibi) uyguladığınızı varsayalım. diziyi şimdi iki katı büyüklüğünde yeniden konumlandırın ve tüm öğeleri kopyalayın). Boyutu S ( n dizisinin) ve saklama sırasında , n vektöründe elemanları daha 2, daha fazla küçük gücü ya da eşit n . S ( n ) = O ( n ) demek istiyoruz , ancak “limit numarası” nı tanım olarak yazdığımız gibi kullanmak bize izin vermiyor çünkü S ( n)) / n , [1,2) aralığında yoğun olarak salınır. Aynısı Ω () ve Θ () için de geçerlidir.

Biraz ayrı bir konu olarak, bu gösterimleri bir algoritmanın karmaşıklığını tanımlamak için kullandığımızda, Ω () tanımınızın bazen uygunsuz olduğunu düşünüyorum (bu tanımın yaygın olduğunu tahmin etmeme rağmen). F ( n ) = Ω ( g ( n )) 'in sadece ve sadece f ( n ) / g ( n )> 0 olması durumunda tanımlanması daha uygundur. Bunun nedeni, bazı sorunların sınırsız sayıda n değeri için önemsiz olmasıdır. bu tür bir tek sayı olan bir grafikte mükemmel maching sorun n ) köşe. Aynısı Θ () ve ω () için de geçerlidir.

Bu nedenle, kişisel olarak, aşağıdaki tanımların bir algoritmanın karmaşıklığını tanımlamak için en uygun yöntemi kullandığını düşünüyorum: f , g işlevleri için : ℕ → ℝ > 0 ,

  • f ( n ) = O ( g ( n )), ancak ve ancak limsup halinde f ( n ) / g ( n ) = 0 (Bu lim eşdeğerdir f ( n ) / g ( n ), 0 değerini =)
  • f ( n ) = 0 ( g ( n )) ise ve sadece f ( n ) / g ( n ) <∞ kalkarsa .
  • f ( n ) = Θ ( g ( n )) eğer ve sadece 0 <kesilirse f ( n ) / g ( n ) <∞.
  • f ( n ) = Ω ( g ( n )) eğer ve sadece f ( n ) / g ( n )> 0 değerinde kalırsa (Bu, f ( n ) 'nin o ( g ( n ) ' ye eşit olmadığı ).)
  • f ( n ) = ω ( g ( n )) eğer ve sadece kesilirse f ( n ) / g ( n ) = ∞. (Bu, f ( n ) 'nin O ( g ( n )) olmadığı anlamına gelir.)

Veya eşdeğer olarak,

  • f ( n ) = o ( g ( n )) eğer ve sadece her c > 0 için, yeterince büyük n için , f ( n ) ≤ cg ( n ).
  • f ( n ) = O ( g ( n )) eğer ve sadece c > 0 için, yeterince büyük n için , f ( n ) ≤ cg ( n ).
  • f ( n ) = Θ ( g ( n )) eğer ve sadece f ( n ) = O ( g ( n )) ve f ( n ) = Ω ( g ( n )) ise.
  • f ( n ) = Ω ( g ( n )) eğer ve sadece bazı d > 0 için, sonsuz sayıda n için , f ( n ) ≥ dg ( n ).
  • f ( n ) = ω ( g ( n )) eğer ve sadece her d > 0 için, sonsuz sayıda n için , f ( n ) ≥ dg ( n ).

Ancak bunun genel bir uygulama olup olmadığını bilmiyorum. Ayrıca öğretime uygun olup olmadığını bilmiyorum. Sorun bazen sometimes () 'ı bunun yerine liminf ile tanımlamak istiyoruz (ilk tanımda yaptığınız gibi). Örneğin, “Bu randomize algoritmanın hata olasılığı 2 −Ω ( n ) ” derken hata olasılığının sadece çok sayıda n için katlanarak küçük olduğu anlamına gelmiyoruz !


Ayrıca tanım tanımlarını da kullanıyorum, ancak sınır tanımasını görmemiş öğrenciler için (hemen hemen hepsi) zaten açık nicelleştiricilere doğru genişlemem gerekiyor.
Jeffε

@JeffE: Öğrencilerin çoğunun dilbilgisi görmediğini kabul ediyorum, bu yüzden dilbilgisi tanımlarını kullanırsak, sınıf yerine niceleyici kullanmak zorundayız.
Tsuyoshi Ito

2
Nicelik belirleme versiyonlarındaki sorun, hatırlamaları ve görselleştirmeleri zor olmalarıdır. tercih ediyorum çünkü “en yüksek limit noktası” olarak tanımlanabilir. Muhtemel bir açıklama şöyledir: " gibi , ancak yalnızca dizi yakınlaştığında çalışır. Dizi yakınsak olmazsa, örneğin algoritma bazı için çok hızlı salınır , diğer için yavaşsa , o zaman en yüksek limit noktası. " limsuplimlimnn
Heinrich Apfelmus

Aslında, çalışma zamanının salındığı algoritmalara herhangi bir doğal örnek var mı?
Heinrich Apfelmus

2
@Heinrich: N köşelerinde bir grafiğin mükemmel bir eşleşmesini bulmak için bir algoritmanın çalışma süresinden zaten bahsettim, ama bu doğal bir örnek olarak sayılıyor mu? Çalışma süresinin salınmayacağı, ancak f (n) / g (n) salındığı başka bir örnek daha ekledim. Örnek, uzay karmaşıklığı hakkında konuşur, ancak aynı örneğin zaman karmaşıklığı aynı özelliğe sahiptir.
Tsuyoshi Ito

8

Sınırları kullanmak biraz kafa karıştırıcıdır çünkü (1) daha karmaşık bir kavramdır (2) f = O (g) 'yi güzel bir şekilde ele almamaktadır (yukarıdaki tartışmada görebileceğimiz gibi). Genelde Doğal (kesinlikle pozitif) sayılardan Doğal sayılara (çalışma süreleri için yeterli olan) işlevlerden bahsederim, küçük şeyleri atlar ve sonra tanım özlü ve 1. sınıf öğrencileri için uygundur:

Dfn: f = O (g) bazı n'ler için n ise o f (n) <= C * g (n) olur


1
Öncelikle bu tanımı sevmedim, çünkü “hepsi n” i belirtmek, O () gösteriminin yalnızca büyük n işlevlerinin davranışını umursadığı gerçeğini gizliyor. Ancak hangi tanımı seçersek seçelim, bu gerçeği tanımla birlikte açıklamamız gerektiğini düşünüyorum. Bu şekilde düşünmek, bu basit tanımı belirtmek oldukça iyi görünüyor.
Tsuyoshi Ito

Bu yakalar özü iken, sevmediğim ise tüm , , tüm için kadar ve daha sonra aksi halde, ancak bu tanım bu ilişkiyi yakalayamıyor. Öyleyse, bir anlamda iyi davranış gösteren fonksiyonlar hakkında bir miktar el sıkışması eklemek gerekiyor. f(n)=nng(n)=0nN0g(n)=f(n)+1f=O(g)
András Salamon

2
Menzili Doğal sayılar olan (0 dahil değil) fonksiyonlardan bahsetmek, g (n) = 0 olan problemlere tam olarak düşmemektir.
Noam

1
@Warren Victor Shoup, Hesaplamalı Sayı Teorisi adlı kitabında, düzgün bulduğum çalışma zamanı analizinde yerine gösterimini kullanır . len(a)loga
Srivatsan Narayanan

1
@Warren (devamı) Bunu şöyle açıklıyor: “Algoritmaların çalışma sürelerini girdisi olarak ifade ederken , genellikle yerine yazmayı tercih ederiz . Bir sebep estetiktir: yazma çalışma süresi bit uzunluğunda bir fonksiyonu olduğu gerçeğini vurgulamaktadır başka neden tekniktir. lüx için keyfi bir etki alanında fonksiyonları içeren tahminlerine uygun eşitsizlikler etki genelinde tutmak gerektiğini ve bu nedenle, gibi bazı girişlerde kaybolan veya tanımlanmayan işlevleri kullanmak çok sakıncalıdır . " alen(a)logalen(a)aOlog
Srivatsan Narayanan

5

Temel dersleri , tanım olarak ve teorem olarak diğer şeyler verildi.c,n0

Birincisinin sürekli değil, ayrık düşünen birçok insan için daha doğal olduğunu düşünüyorum, bu çoğu bilgisayar bilimcisi (benim deneyimlerime göre). Ayrıca biz genellikle daha iyi şeylerden bahsetmek yolu uyuyor: "bir üst bu sınırıdır derece 3'ün bir polinom fonksiyonu yoktur sabit bir faktör kadar."f

Düzenleme : Bu tanımı kullanırsanız, konuşma biçimine daha da yaklaşabilirsiniz: ( genellikle verilenle bağlandığını unutmayın)fO(g):⇔c,d>0n0:f(n)cg(n)+dd=f(n0)

Limit, karmaşıklık sınıflarını hesaplamak için, yani kalem ve kağıtla oldukça faydalıdır.

Her durumda, öğrencilerin bir çok (umarım) eşdeğer tanımları olduğunu öğrenmelerinin çok faydalı olduğunu düşünüyorum. Eşdeğer olmayan tanımlamalar durumunda bunu anlayabilmeli ve farklılıkları seçebilmeliler.


4

Bu kavramları sadece birkaç yıl önce incelemiş olduktan sonra, sınıfım için kavraması en zor olanlar değildi (indüksiyon veya kontra pozitifler gibi kavramların aksine). Sınırlar ve sınırsızlıklar bence matematikle aşina olanlar için sadece "sezgisel". Ancak böyle bir matematik temeline sahip öğrenciler, ayrık niteleyicileri işleyebilmeleri için yine de set-teorik arka plana sahip olacaktır.

Ayrıca, daha önemlisi, nihayetinde öğrencilerinizin diğer cs teorisi ders kitaplarını ve belki de bir gün araştırma makalelerini okumaya devam edeceklerini (umarım) devam edeceklerini unutmayın. Bu nedenle, başlangıçta ideal olarak düşünülmemiş olsalar bile, alandaki standart gösterimde rahat olmaları daha iyidir. Standart tanımları özümsemiş olduklarında, onlara alternatif tanımları vermenin de zararı yoktur.


3

Konuyla ilgili ilginç bir görüş için Don Knuth'un güzel yazılmış mektubuna "Calculus via O notasyonu" na bakın . Kalkülüsün 'A', 'O' ve 'o' notaları aracılığıyla öğretilmesi gerektiği yönündeki görüşünü savunuyor.

Not: “A” notasyonunu standart “O” notasyonunun tanımlanmasında ön adım olarak kullanır. Bir miktar olan bölgesinin (yani, ), eğer . Özellikle, duyu söylemek yapar olduğunu .xAyx=A(y)|x|y100A(200)


1
  1. Tsuyoshi Ito'nun tanımları pek doğru görünmüyor. Küçük omega ve büyük omega için tanımların limsup değil liminf kullanması gerekir. Big-tetanın tanımı, hem liminf üzerinde alt sınır hem de limsup üzerinde üst sınır gerektirir.

  2. F (n) = 0 (g (n)) 'nin bir tanımı, f' (n)> = f (n) 'in başka bir fonksiyonunun mevcut olması, yani f' (n) / g (n) <sonsuz olmasıdır.

  3. Yeni başlayanlar neden cevap gönderebilir, ancak yorum yapamazlar?


1
1. maddeye gelince, tüm durumlarda anlamsızlık demek istiyorum ve bunun sebebi cevabımın ikinci paragrafında açıklanmıştır.
Tsuyoshi Ito

Maalesef bir spam engelleme mekanizması.
Suresh Venkat 28:10

Aso, cevaplarınızda lateks kullanabilirsiniz.
Suresh Venkat 28:10

1

Öncelikle , denklemleri göstermeden önce öğrencilerde bazı sezgiler geliştirmeye çalışıyorum .

  • "Birleştirme-sıralama vs Ekleme-sıralama" iyi bir başlangıç ​​noktasıdır.

Sonra, sonra ... Her iki yolu da göstermeye çalışıyorum. Sezgiye daha çok dayanan öğrenciler, matematiğe, denklemlere, cebire vb. güvenenler, " " tanımlarını tercih ederler .

f=O(g) iff (c>0)(n00)(nn0)(f(n)cg(n)).
limn

Başka bir yönü de, büyük ölçüde somut çalışmalar programına bağlı olmasıdır. Önceki konulara bağlı olarak IMHO tanımlardan biri daha uygun olacaktır - IMHO hala her ikisini de göstermek ve her iki tür çözümü de kabul etmek iyi bir fikirdir.

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.