O (1), O (n log n) ve O (log n) karmaşıklıklarına sahip Algoritma örnekleri


Yanıtlar:


234

Soruda verildiği gibi Zaman karmaşıklığına sahip Algoritmalar / İfade Grubu örnekleri istiyorsanız, işte küçük bir liste -

O(1) zaman

  • Dizi Dizinine Erişim (int a = ARR [5];)
  • Bağlantılı Listeye bir düğüm ekleme
  • Yığın Üzerine İtme ve Açma
  • Sıraya Ekleme ve Çıkarma
  • Array'de depolanan bir ağaçtaki bir düğümün üst veya sol / sağ çocuğunu bulma
  • Çift Bağlantılı Listede Sonraki / Önceki öğeye Atlama

O(n) zaman

Özetle, doğrusallık gerektiren tüm Kaba Kuvvet Algoritmaları veya Noob algoritmaları O (n) zaman karmaşıklığına dayanmaktadır.

  • Bir dizide gezinmek
  • Bağlantılı bir listeyi dolaşmak
  • Doğrusal Arama
  • Bağlantılı Listedeki belirli bir öğenin silinmesi (Sıralanmamış)
  • İki dizeyi karşılaştırmak
  • Palindrome kontrol ediliyor
  • Sayma / Kova Sıralama ve burada da böyle milyonlarca örnek bulabilirsiniz ....

O(log n) zaman

  • Ikili arama
  • İkili arama ağacında en büyük / en küçük sayıyı bulma
  • Doğrusal işlevselliğe dayalı belirli Böl ve Fethet Algoritmaları
  • Fibonacci Sayılarını Hesaplamak - En İyi Yöntem Buradaki temel dayanak, tüm verileri KULLANMAMAK ve her yinelemede problem boyutunu küçültmektir.

O(n log n) zaman

'Log n' çarpanı, Böl ve Fethet dikkate alınarak tanıtıldı. Bu algoritmalardan bazıları en iyi optimize edilmiş olanlardır ve sıklıkla kullanılırlar.

  • Sıralamayı Birleştir
  • Yığın Sıralama
  • Hızlı sıralama
  • O (n ^ 2) algoritmalarını optimize etmeye dayanan belirli Böl ve Fethet Algoritmaları

O(n^2) zaman

Bunların, O (nlogn) muadilleri mevcutsa, daha az verimli algoritmalar olduğu varsayılır. Genel uygulama burada Brute Force olabilir.

  • Kabarcık Sıralama
  • Ekleme Sıralaması
  • Seçim Sıralaması
  • Basit bir 2D dizide gezinmek

5
Peki ya n !? Hangi ortak algoritmanın n'yi kullandığını merak ediyordum !?
Y_Y

Bir HashMap değerinin yanı sıra bir HashMap ve çift bağlantılı bir liste kullanarak O (1) elde eden veya PUSH / POP / MIN işlevselliğine sahip bir yığını uygulayan bir LRU uygulaması gibi daha karmaşık algoritmalara erişim. Ayrıca Fibonacci'nin yinelemeli uygulaması da N! Kapsamına girer.
countrycoder

11
OKB'm , listenin en iyiden en kötüye doğru sıralanması için listeyi listeden O(log n)önce değiştirmenizi istiyor O(n). haha :)
Sam Eaton

4
Bir kare matris olmadığı sürece bir 2D diziyi geçmek aslında O (nxm) 'dir.
Simon Peck

1
'Gezici satıcı' problemi n'ye bir örnektir! (n faktöriyel) de
Ju66ernaut

28

Basit bir örnek O(1)olabilir return 23;- ne olursa olsun giriş, bu sabit, sonlu sürede dönecektir.

Tipik bir örnek, O(N log N)iyi bir algoritma ile bir girdi dizisini sıralamaktır (örneğin, birleştirme sıralaması).

Tipik bir örnek, O(log N)sıralı bir giriş dizisinde ikiye bölünerek bir değer aramak olabilir.


28

O (1) - çoğu pişirme prosedürü O (1) 'dir, yani yemek pişirecek daha fazla insan olsa bile sabit bir zaman alır (bir dereceye kadar, çünkü tencere / tavalarınızda yer kalmayabilir) ve pişirmeyi bölmemiz gerekiyor)

O (logn) - telefon rehberinizde bir şey bulmak. İkili aramayı düşünün.

O (n) - n'nin sayfa sayısı olduğu bir kitap okumak. Bir kitabı okumak için gereken minimum süredir.

O (nlogn) - Birleştirme veya hızlı sıralama yaparak kartları ayırmadığınız sürece, her gün yapabileceğiniz, günlük olmayan bir şeyi hemen düşünemiyorum!


2
Bir rostoyu pişirmek mini
rostodan

4
ancak, fırınınızın sığacak kadar büyük olması koşuluyla, genellikle iki mini rosto ile bir mini rosto pişirmek aynı zaman alır!
Chii

1
Çok anlayışlı! Sanırım bir isim / numara listesinden bir telefon veya adres defteri derleme görevi O (n log n)
squashed.bugaboo

10

Size bazı genel algoritmalar sunabilirim ...

  • O (1): Bir dizideki bir elemana erişim (yani int i = a [9])
  • O (n log n): hızlı veya birleştirme (Ortalama)
  • O (log n): İkili arama

Bunlar, ödev / röportaj türü bir soru gibi göründüğü için içgüdüsel tepkiler olacaktır. Daha somut bir şey arıyorsanız, bu biraz daha zordur, çünkü genel olarak halk, popüler bir uygulamanın temelini oluşturan uygulama (tabii ki açık kaynağı korumak) hakkında hiçbir fikre sahip olmayacaktır ve konsept genel olarak bir "uygulama" için geçerli değildir.


4

O (1): Satrançta bir sonraki en iyi hamleyi bulmak (veya bu konuda Go). Oyun durumlarının sayısı sınırlı olduğundan sadece O (1) :-)


5
Evet, genellikle yer için zamanı değiş tokuş edebilirsiniz. Aslında bunu bir tic-tac-toe oyunu için yaptım çünkü sadece 3 ^ 9 durum var (rotasyonları akıllıca idare ederseniz daha az). Bununla birlikte, satranç biraz daha fazla sayıda duruma sahiptir :-)
paxdiablo

1
Sorun şu ki, sadece O(1)nanosaniye yaşayacağım ve hangisinin O(1)önce olacağını kesinlikle biliyorsunuz ...
zardav

3

Yazılım uygulamasının karmaşıklığı ölçülmez ve büyük-O gösterimiyle yazılmaz. Yalnızca algoritma karmaşıklığını ölçmek ve aynı alandaki algoritmaları karşılaştırmak yararlıdır. Büyük ihtimalle, O (n) dediğimizde, bunun "O (n) karşılaştırmaları " veya "O (n) aritmetik işlemler" olduğunu kastediyoruz . Bu, herhangi bir algoritma veya uygulamayı karşılaştıramayacağınız anlamına gelir.


1
Bu gerçekten doğru değil. Bir algoritmanın O (N) zaman karmaşıklığı varsa, bu, çalışma zamanının bir sabit k için k * N adımlarla sınırlandığı anlamına gelir. "Adımların" CPU döngüleri, montaj talimatları veya (basit) C işlemleri olup olmadığı gerçekten önemli değildir. Bu detaylar k sabitiyle gizlenir.
Igor ostrovsky

Pek çok pratik durumda bir O (logN) algoritmasının "c" nin onu daha basit bir O (N) algoritmasından daha kötü yaptığından bahsetmiyorum bile.
Zed

Haha, evet ve N ile bir Turing makinesi şeridindeki girdinin uzunluğunu kastediyoruz - bu, dikey bölme biçiminin uygulanması için katlanarak zaman almasını sağlar. :-) Her alanın kendi gereksinimleri ve kendi soyutlama bölgesi vardır.
P Shved

3

O (1) - Çift bağlantılı listeden bir öğeyi silme. Örneğin

typedef struct _node {
    struct _node *next;
    struct _node *prev;
    int data;
} node;


void delete(node **head, node *to_delete)
{
    .
    .
    .
}

2

Listenize aşağıdaki algoritmaları ekleyebilirsiniz:

O(1)- Bir sayının çift mi yoksa tek mi olduğunu belirleme; HashMap ile Çalışma

O(logN) - hesaplama x ^ N,

O(N Log N) - En uzun artan alt dizi


1

O (n log n), rasgele bir seti ne kadar hızlı sıralayabileceğinizin üst sınırıdır (standart ve çok paralel olmayan bir hesaplama modeli varsayarak).


0

0 (logn) -Binary arama, bir dizideki tepe elemanı (birden fazla tepe olabilir) 0 (1) - python'da bir listenin veya dizenin uzunluğunu hesaplayan. Len () işlevi 0 (1) zaman alır. Bir dizideki bir elemana erişim 0 (1) zaman alır. Bir yığındaki itme işlemi 0 (1) zaman alır. 0 (nlogn) -Merge sıralaması. python'da sıralama, nlogn süresi alır. bu yüzden listname.sort () 'u kullandığınızda, nlogn süresi alır.

Not - Bir hash tablosunda arama yapmak bazen çarpışmalar nedeniyle sabit süreden daha uzun sürer.


0

O (2 N )

O (2 N ), giriş veri setine her ekleme ile büyümesi iki katına çıkan bir algoritmayı belirtir. Bir O (2 N ) fonksiyonunun büyüme eğrisi üsteldir - çok sığdan başlar, sonra meteorik olarak yükselir. O (2 N ) işlevine bir örnek , Fibonacci sayılarının özyinelemeli hesaplamasıdır:

int Fibonacci (int number)
{
if (number <= 1) return number;
return Fibonacci(number - 2) + Fibonacci(number - 1);
}

Tower of Hanoidaha iyi bir örnek olurdu.
Ashish Duklan
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.