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 ) ≤ c ⋅ g ( n ).
- f ( n ) = O ( g ( n )) eğer ve sadece c > 0 için, yeterince büyük n için , f ( n ) ≤ c ⋅ g ( 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 ) ≥ d ⋅ g ( n ).
- f ( n ) = ω ( g ( n )) eğer ve sadece her d > 0 için, sonsuz sayıda n için , f ( n ) ≥ d ⋅ g ( 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 !