Big-O-Notasyonunun düzenli çalışma zamanlarında varyasyonlar var mı?


9

veya O (n ^ 2) gibi birden fazla Notu vardır . Gerçekte O (2n ^ 2) veya O (\ log n ^ 2) gibi varyasyonlar olup olmadığını veya bunların matematiksel olarak yanlış olup olmadığını merak ediyordum .OO(n)O(n2)O(2n2)O(logn2)

Yoksa bir O(5n2) yi O(3n2) ye yükseltmenin mümkün olduğunu söylemek doğru bir şey midir? Henüz çalışma zamanlarını anlayamıyorum ve çözmem gerekmiyor ve hiçbir şeyi geliştirmem gerekmiyor, ancak işlevlerinizi gerçekte bu şekilde tarif edip etmediğinizi bilmem gerekir.


1
Asimptotik bir analiz sırasında O (5n ^ 2) ile O (3n ^ 2) arasında önemli bir fark yoktur. Her ikisi de O (n ^ 2) ve sadece sabit ile farklılık gösterir. Aslında, bir kanıtta, matematiği eşdeğer oldukları için daha temiz hale getirmek için O (5n ^ 2) 'yi O (3n ^ 2) veya O (n ^ 2)' ye bile azaltabilirsiniz. İspatınızı yazarken kenar çubuğuna eşdeğer olduklarını not edin. Aslında, O (log n) 'yi O (n) ile değiştirebilir ve kenar çubuğunda O (log n) <= O (n) olduğunu not edebilirsiniz. Kenar çubuğundaki not okuyucuya bir yazım hatası değil kasıtlı olduğunu söyler. (En azından üniversitede Algoritma Analizini aldığımda bunu yaptım).
jww

2
Küçük faktörlerden kurtulmak için gösterimini kullanıyorsanız, her zaman "... gibi bir şey yazabilirsiniz, çalışma süresini den ya ", vb. Veya, aynı şekilde, ve . Bazı yazarlar sadece birincisi için yazmayı tercih ediyorlar . Örneğin, Trefethen ve Bau'nun ders kitabına bakınız. O()5n2+o(n2)3n2+o(n2)(5+o(1))n2(3+o(1))n25n2
Yonatan N

Yanıtlar:


21

Gerçekte veya gibi varyasyonlar olup olmadığını veya bunların matematiksel olarak yanlış olup olmadığını merak ediyordum .O(2n2)O(log(n2))

Evet, veya geçerli varyasyonlardır.O(2n2)O(log(n2))

Bununla birlikte, özellikle sonuçlarda, onları hiç görürseniz, nadiren göreceksiniz. Bunun nedeni, nin . Benzer bir şekilde, olan . Bu yeni başlayanlar için şaşırtıcı olabilir. Bununla birlikte, bu eşitlikler, aşağı yukarı sabitlenmesi zor ve nispeten önemsiz olan çarpımsal bir sabit faktörü gizlemek için büyük notasyonlarının getirilmesinin sebebidir.O(2n2) O(n2)O(log(n2)) O(logn)O

Bir yi ye yükseltmenin mümkün olduğunu söylemek doğru bir şey olur mu?O(5n2)O(3n2)

Bir algoritmanın zaman karmaşıklığı den veya den değiştirilirse bir gelişme olmaz , çünkü olan ise olan . Bu nedenle, zaman karmaşıklığının den ye geliştirildiğini söylemek yanlıştır . Bir algoritma, zaman karmaşıklığı artırıldı söylemek doğru için , elbette.O(5n2)O(3n2)Ω(5n2)Ω(3n2)O(5n2)O(3n2)Ω(5n2)Ω(3n2)O(5n2)O(3n2)5n23n2


Alıştırma 1. olduğunu gösterin .O(5n2)=O(3n2)=O(n2)

Alıştırma 2. olduğunu gösterin .O(logn)=O(log(n2))

Alıştırma 3. olduğunu gösterin .Ω(n2+n)=Ω(n2)


1
@bv_Martn notasyonunun ne olarak tanımlandığını anlamak için iyi bir bağlantı (sadece basit sınır hesabı!): math.stackexchange.com/questions/925053/…O(n)
Akshat Mahajan

2
Big-O notasyonunda sabit faktörler gördüğüm tek zaman, birinin iki karmaşıklık aynı karmaşıklık sınıfında olmasına rağmen, bunlardan birinin diğerinden kesinlikle daha hızlı olduğu noktasını belirtmek istediği zamandır.
Mark

7
@AkshatMahajan tek cevap bu soruya /math/925053 açıkça yanlıştır. Büyük gösterimlerinde birçok güvenilir kaynak vardır. O
John L.

1
"Bir algoritmanın zaman karmaşıklığının 5n ^ 2'den 3n ^ 2'ye yükseltildiğini söylemek doğru" - ancak kesin çalışma süresi genellikle farklı giriş boyutları ve değerleri için değişir. Ayrıca, tüm operasyonların ağırlıklandırılmasını / bir operasyona odaklanmayı içerir; bu, gerçek dünyada alacağınız sabit faktörler hakkında çok fazla şey söylemeyebilir veya farklı ağırlıklar kullanan diğer algoritmalarla karşılaştırılabilir olabilir. Dolayısıyla, birkaç geçerli kullanım durumu olsa da, yukarıdaki gibi bir şeyin söylenmesi sınırlı yararlıdır (muhtemelen bu yüzden nadiren görülür).
Bernhard Barker

1
@ Mark: Bu sadece yanlış.
user21820

13

Bu notasyonu hiç kullanmamakta her zaman özgürsünüz . Yani, işlevini olabildiğince kesin olarak belirleyebilir ve ardından bunu geliştirmeye çalışabilirsiniz. Örneğin, karşılaştırmaları yapan bir sıralama algoritmanız olabilir, böylece yalnızca karşılaştırmaları yapan başka bir sıralama algoritması bulmaya çalışabilirsiniz . Tabii ki, her türlü fonksiyonu vardır (teoride) ve ayrıca (pratikte) ortaya çıkabilir.f(n)f(n)g(n)f(n)

Büyük Oh notasyonunu, bir şey yapıp yapamayacağınızı sormak için sihirbazlara danışmanız gereken gizemli bir sihir gibi davranmak yerine , tanımına bakmalısınız . Tanıma saygı gösterin ve işinizi yapmak için ne gerekiyorsa yapın.


Uygulamada henüz buna ihtiyacım yok. Ya da teorik olarak, sadece wikipedia tarafından verilen tanımların O (1) -O (n!) 'Nin var olup olmadığını bilmeliyim, ya da gerçekte onları farklı ise, örneğin O (7N). Korkum, eğer bir matematik profesörünün kanatlarını
kaybedeceğini kullanırsam

1
Herkesin yaptığı herhangi bir tanım vardır. veya Notasyonunun ne anlama geldiğini çok dikkatli okumalısınız çünkü sorunuz mantıklı değil. Kısayol yok. Bir matematiksel içeriğin ne anlama geldiğini anlamak istiyorsanız, biraz zaman ayırmaya istekli olmalısınız. O(1)O(n!)
Juho

6
@bv_Martn Matematik profesörünün dışarı atma olasılığı daha yüksektir, çünkü bir örnek listesini tanım listesi olarak görüntülüyorsunuz. Matematiğin asıl amacı, şeyleri sadece belirli durumlarda değil, genel olarak çalışacak şekilde tanımlamaktır. Sorunuz temelde "Wikipedia bir tane ekleyip iki tane ekleyebileceğimi ve on yedi ekleyebileceğimi söylüyor. Ama başka numaralar da ekleyebilir miyim?"
David Richerby

7

Kabul cevabı oldukça iyi olsa da, hala gerçek sebebi olan şeye dokunmuyor neden .O(n)=O(2n)

Big-O Notasyonu ölçeklenebilirliği açıklar

Özünde, Big-O Notation bir algoritmanın ne kadar sürdüğünün açıklaması değildir. Ayrıca, bir algoritmanın kaç adım, kod satırı veya karşılaştırmanın yapıldığının açıklaması da yoktur. Bir algoritmanın giriş sayısı ile nasıl ölçeklendiğini tanımlamak için kullanıldığında en kullanışlıdır.

Örneğin, bir ikili aramayı ele alalım. Sıralanmış bir liste verildiğinde, içinde rasgele bir değeri nasıl bulursunuz? Ortadan başlayabilirsiniz. Liste sıralandığından, orta değer, hedef değerin listenin yarısında olduğunu söyleyecektir. Bu nedenle, aramanız gereken liste artık ikiye bölünmüştür. Bu, özyinelemeli olarak uygulanabilir, ardından yeni listenin ortasına gider ve böylece liste boyutu 1 olana ve değerinizi bulana kadar (veya listede bulunmaz). Listenin iki katına çıkarılması, algoritmaya logaritmik bir ilişki olan yalnızca bir adım daha ekler. Dolayısıyla bu algoritma . Logaritma temel 2'dir, ancak bu önemli değildir - ilişkinin özü, listeyi sabit bir değerle çarpmanın zamana yalnızca sabit bir değer katmasıdır.O(logn)

Sıralanmamış bir listeyle standart aramayı karşılaştırın - bu durumda bir değer aramanın tek yolu her birini kontrol etmektir. En kötü senaryo (Big-O'nun özellikle ima ettiği şey), değerinizin en sonunda olmasıdır, yani boyutunun bir listesi için değerlerini kontrol etmeniz gerekir . Listenin boyutunu ikiye katlamak, kontrol etmeniz gereken sayıyı iki katına çıkarır, bu da doğrusal bir ilişkidir. . Ancak, her değer üzerinde iki işlem yapmak zorunda olsanız bile, bazı işlemler, örneğin, doğrusal ilişki hala geçerlidir. , tanımlayıcı olarak kullanışlı değildir, çünkü aynı ölçeklenebilirliği tanımlar .nnO(n)O(2n)O(n)

Bu cevapların çoğunun temelde Big-O tanımını okuyarak bu sonuca varmanızı söylediğini takdir ediyorum. Ama bu sezgisel anlayış kafamı sarmak için epey zaman aldı ve bu yüzden size olabildiğince açık bir şekilde yerleştirdim.


5
Bu tür bir cevapla ilgili en büyük sorun, Big Oh'un tanımına değmemesidir, ancak bunu "bunu yaptığınızda bakın ve bu, " gibi bir tür sezgisel sihir olarak kullanır . Kişisel olarak, birisine Big Oh'un algoritmalarla mutlaka ilgisi olmadığını söylemek ve bununla başlamak için çok daha öğretici olduğunu düşünüyorum. O(n)
Juho

3
@Juho Öğretici, belki, ama sonuçta bilgisayar bilimcilerinin büyük çoğunluğu için işe yaramaz.
dağılım

4
Bununla katılmıyorum. Kendini bir bilgisayar bilimcisi olarak etiketlemek, kişinin kullandığı bir nota parçasının ne anlama geldiğini anlamadığı için mazeret olmamalı, yani tüm matematiği atlamalıdır.
Juho

3
Evet. Programcılara bu şeyleri anlamayan bir itirazım yok, ancak kendinize bir bilgisayar bilimcisi demek istiyorsanız , bu temel malzemedir.
David Richerby

2
@ dkaeae Hayır, yazılım geliştiricileri gibi bu alanda başka kariyerlerde çalışan insanlara atıfta bulunuyorum.
Dağılım

5

Herhangi bir işlev için yazabilirsiniz ve bu çok mantıklıdır. Tanımı, ortalama olarak, bir sabit olup olmadığını  şekilde her yeterince büyük için  . Bu tanımdaki hiçbir şey bir çeşit "güzel" işlev olması gerektiğini söylemez .O(f)fg(n)=O(f(n))cg(n)cf(n)nf

Ancak, diğer cevapların belirttiği gibi, ve tam olarak aynı durumu tanımlar: eğer yeterince büyük olan tüm  , o zaman , yani , ayrıca ( sabitin ).g(n)=O(f(n))g(n)=O(2f(n))g(n)cf(n)ng(n)c22f(n)g(n)=O(2f(n))c/2

Bir yan sorun olarak, " " yazmayın , çünkü ne anlama geldiğini% 100 net değildir. Açıkçası anlamına geldiğini söyleyebilirsiniz, ancak neredeyse herkes bunu olarak yazacaktır , bu yüzden okuyucunun zihnine şüphe koyar.logn2log(n2)2logn

Ayrıca, büyük-nota olduğunu notasyonu çalışma zamanları ile ilgisi yoktur haddi zatında . Bu sadece işlevler arasındaki ilişkiler için bir gösterimdir. Bu işlevler genellikle algoritmaların çalışma zamanlarını ölçmek için kullanılır, ancak bu sadece bir uygulama, tıpkı insanların yüksekliklerini ölçmek gibi sadece bir sayı uygulamasıdır.O


4

O (f (n)) tanımına bakın ve örneğin O (2n ^ 2) ve O (n ^ 2) tam olarak aynı olduğunu görüyorsunuz. Bir algoritmanın 5n ^ 2'den 3n ^ 2 işlemlerine değiştirilmesi yüzde 40'lık bir gelişmedir. O (5n ^ 2) 'den O (3n ^ 2)' ye geçiş aslında herhangi bir değişiklik değildir, aynıdır.

Yine, O (f (n)) tanımını okuyun.


4

Big-O'nun bir dizi işlevi açıkladığını anlamak faydalı olabilir . YaniO(f(n))={g(n)|n,c>0:m>n:c×g(m)f(m)}

Kullanımı biraz talihsizdir ve kullanılması bu ilişkiyi daha açık hale getirir. ancak ayarlanan gösterim simgelerinin yazılması biraz zordur, bu yüzden şimdi geçerli kurallara bağlı kaldık.=

Bu daha sonra veya Büyük O'nun tanımlanmasında sabit faktörlerin önemli olmadığını gösterir.O(n)=O(2n)


4
Eşitlik sözleşmesi gerçekten yazmaktan ibaret değildir. Çünkü gibi ifadelerin yararlılığı bizi 'nin her ikisini de "[ "ve" bazı işlevler öyle çalışır [...] "log(n!)=nlognn+O(logn)O(f)
David Richerby
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.