Çeşitli veri yapılarının zaman karmaşıklıkları nelerdir?


87

Diziler, İkili Arama Ağacı, Yığın, Bağlantılı Liste vb. Gibi yaygın veri yapılarının işlemlerinin zaman karmaşıklıklarını listelemeye çalışıyorum ve özellikle Java'dan bahsediyorum. Çok yaygındırlar, ancak sanırım bazılarımız kesin cevap konusunda% 100 emin değiliz. Herhangi bir yardım, özellikle referanslar, büyük ölçüde takdir edilmektedir.

Örneğin, tek bağlantılı liste için: Bir iç elemanın değiştirilmesi O (1) 'dir. Bunu nasıl yaparsın Sen VAR değiştirmeden önce eleman aramak için. Ayrıca Vector için bir iç eleman eklemek O (n) olarak verilir. Ama neden bunu endeksi kullanarak amorti edilmiş sabit zamanda yapamıyoruz? Eksik bir şey varsa lütfen düzeltin.

Bulgularımı / tahminlerimi ilk cevap olarak gönderiyorum.


2
Tüm veri yapıları için Zaman ve Mekan Karmaşıklıkları Big O kısa bilgi sayfası
Vbp

1
Başka birinin buna müdahale etmesi
vefthym

Yanıtlar:


246

Diziler

  • Belirli bir indekste elemanı ayarla, kontrol et : O (1)
  • Arama : Dizi sıralanmamışsa O (n) ve dizi sıralıysa ve ikili arama gibi bir şey kullanılıyorsa O (log n) ,
  • Aivean'ın belirttiği gibi Delete, Diziler üzerinde hiçbir işlem yoktur . Gereksinimlerimize bağlı olarak, bir öğeyi belirli bir değere, örneğin -1, 0, vb. Ayarlayarak sembolik olarak silebiliriz.
  • Benzer şekilde, Insertdiziler için temelde Setbaşlangıçta belirtildiği gibidir

Dizi Listesi:

  • Ekle : Amortize Edilmiş O (1)
  • Kaldır : O (n)
  • İçerir : O (n)
  • Beden : O (1)

Bağlantılı liste:

  • Ekleme : O (1) , baştan yapılırsa, O (n) başka bir yerde ise, bağlantılı listeyi doğrusal olarak geçerek o konuma ulaşmamız gerektiğinden.
  • Silme : O (1) , kafadan yapılırsa, başlıkta O (n) başka bir yerde ise, bağlantılı listeyi doğrusal olarak geçerek bu konuma ulaşmamız gerektiğinden.
  • Aranıyor : O (n)

Çift Bağlantılı Liste:

  • Yerleştirme : O (1) , baş veya kuyrukta yapılırsa, O (n) başka herhangi bir yerde, çünkü bağlantılı listeyi doğrusal olarak geçerek o konuma ulaşmamız gerektiğinden.
  • Silme : O (1) , baştan veya kuyruktan yapılırsa, O (n) başka bir yerde ise, bağlantılı listeyi doğrusal olarak geçerek bu konuma ulaşmamız gerektiğinden.
  • Aranıyor : O (n)

Yığın:

  • İtin : O (1)
  • Pop : O (1)
  • Üst : O (1)
  • Arama (Özel bir işlem olarak arama gibi bir şey): O (n) (Sanırım öyle)

Kuyruk / Geri Çekme / Dairesel Kuyruk:

  • Ekle : O (1)
  • Kaldır : O (1)
  • Beden : O (1)

İkili Arama Ağacı:

  • Ekle, sil ve ara : Ortalama durum: O (log n) , En Kötü Durum: O (n)

Kırmızı-Siyah Ağaç:

  • Ekle, sil ve ara : Ortalama durum: O (log n) , En Kötü Durum: O (log n)

Heap / PriorityQueue (min / maks):

  • Min / Maks Bul : O (1)
  • Ekle : O (log n)
  • Min / Maks Sil : O (log n)
  • Min / Ekstrayı Çıkar : O (log n)
  • Ara, Sil (eğer varsa): O (n) , BST gibi sıralanmadıkları için tüm öğeleri taramamız gerekecek

HashMap / Hashtable / HashSet:

  • Ekle / Sil : O (1) amorti edildi
  • Yeniden boyutlandırma / karma : O (n)
  • İçerik : O (1)

3
Array'e bir eleman eklemek (ve ekleyerek, pozisyona yeni eleman eklemek demek istiyorum, tüm elemanları sağa kaydırmak) O (n) alacaktır. Silme için aynı. Sadece var olan elemanı değiştirmek O (n) alacaktır. Ayrıca, yeniden boyutlandırılabilir diziye yeni eleman ekleyerek karıştırmanız da mümkündür (O (1) zamanını amorti etmiştir).
Aivean

Ayrıca, Doubly-bağlantılı liste için hem başa hem de kuyruğa ekleme ve silme işleminin O (1) alacağını unutmayın (sadece baştan bahsettiniz).
Aivean

Ve son not, dengeli arama ağaçları (örneğin, Java'da TreeMap için gerçekte kullanılan Kırmızı-siyah ağaç) tüm işlemler için en kötü durumda O (ln n) süresini garanti etmiştir.
Aivean

@Aivean: Standart veri yapıları için standart işlemleri listelemeye çalışıyorum. Diziler için: Öğeleri eklerken / silerken kaydırmak standart bir işlem değildir. Ayrıca, mevcut elemanın değiştirilmesi O (n) yerine endeks kullanarak O (1) alır. Çift Bağlantılı Liste için: Haklısınız, düzeltme yapıyorum. Kırmızı-Kara Ağaçlar için: Yine haklısınız. Ancak dengelenmesi gerekmeyen bir BST listeledim. Bu yüzden Kırmızı-Kara Ağaçlar için yeni bir giriş ekleyeceğim. Yorumlarınız için teşekkürler!
Bhushan

1
@SuhailGupta: Set için Karmaşıklık zaten son nokta olarak verilmiştir.
Bhushan
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.