O (1) bağlantılı bir listenin ortasına neden ekleniyor?


105

Göre bağlantılı listelerde Vikipedi'ye bağlantılı bir listenin ortasında ekleme düşünülen planlanmış O (1) 'dir. O (n) olacağını düşünürdüm. Listenin sonuna yakın olabilecek düğümü bulmanız gerekmiyor mu?

Bu analiz düğüm işleminin bulunmasını (gerekli olmasına rağmen) ve sadece eklemenin kendisini hesaba katmıyor mu?

DÜZENLE :

Bağlı listelerin dizilere göre birçok avantajı vardır. Bir listenin belirli bir noktasına bir öğenin eklenmesi sabit zamanlı bir işlemdir, oysa bir diziye ekleme öğelerin yarısının veya daha fazlasının hareket ettirilmesini gerektirebilir.

Yukarıdaki ifade benim için biraz yanıltıcıdır. Yanılıyorsam düzeltin ama bence sonuç şöyle olmalı:

Diziler:

  • Ekleme / silme noktasını bulma O (1)
  • Ekleme / silme işleminin gerçekleştirilmesi O (n)

Bağlı Listeler:

  • Ekleme / silme noktasını bulma O (n)
  • Ekleme / silme işleminin gerçekleştirilmesi O (1)

Bence konumu bulmak zorunda kalmayacağınız tek zaman, bir tür işaretçi tutmanızdır (bazı durumlarda baş ve kuyrukta olduğu gibi). Dolayısıyla, bağlantılı listelerin ekleme / silme seçenekleri için dizileri her zaman geçtiğini açıkça söyleyemeyiz.

Yanıtlar:


113

Haklısınız, makale "İndeksleme" yi ayrı bir işlem olarak görüyor. Yani eklemenin kendisi O (1), ancak bu orta düğüme ulaşmak O (n).


3
Aynı konuma 1'den fazla nesne eklerken daha büyük bir fark yaratıyor ...
ÇIKTI - Anony-Mousse

@ Anony-Mousse bunu biraz daha açıklar mısınız? yani, birkaç nesneyi eklerken yalnızca bir kez ekleme konumunu bulmamız gerekir mi?
MyTitle

2
Mevcut listenin boyutunda O (n), orada yapmayı planladığınız ekleme sayısı değil.
ÇIKTI - Anony-Mousse


25

Hayır, eklemek istediğinize karar verdiğinizde, listeyi yinelemenin ortasında olduğunuz varsayılır.

Bağlantılı Listeler üzerindeki işlemler, genellikle genel bir "liste" olarak değil, bir düğümler koleksiyonu olarak ele alınacak şekilde yapılır - düğümün kendisini ana döngünüzün yineleyicisi olarak düşünün. Listeyi karıştırırken, iş mantığınızın bir parçası olarak yeni bir düğümün eklenmesi (veya eski bir düğümün silinmesi) gerektiğini fark edersiniz ve bunu yaparsınız. Tek bir yinelemede 50 düğüm ekleyebilirsiniz ve bu düğümlerin her biri, iki bitişik düğümün bağlantısını çözme ve yenisini ekleme zamanıdır.

Düzenleme: Dostum, ikinci bir paragraf yazarsın ve birdenbire ilk cevap veren olmak yerine ilk 4 ile aynı şeyi söyleyen 5. sensin!


1
Ha evet bu berbat ... seninkini + 1'ledim çünkü bağlantılı listeler ekleme karmaşıklığının zaten istenen işaretçide olma bağlamında değerlendirildiğini belirtmeye değer.
Daniel Macias

6

Bir dizi ile karşılaştırma yapmak amacıyla, ki bu grafiğin gösterdiği şey, O (1) 'dir çünkü yeni düğümden sonra tüm öğeleri taşımak zorunda değilsiniz.

Yani evet, o düğüme yönelik işaretçiye zaten sahip olduğunuzu veya işaretçiyi elde etmenin önemsiz olduğunu varsayıyorlar. Başka bir deyişle, sorun şöyle ifade edilir: " X'teki düğüm verildiğinde , bu düğümden sonra eklenecek kod nedir?" Ekleme noktasından başlayabilirsiniz.


5

Bağlantılı bir listeye ekleme, üzerinde yinelemekten farklıdır. Öğeyi bulmuyorsunuz, öğeyi oraya koymak için işaretçileri sıfırlıyorsunuz. Ön uca yakın mı yoksa sona yakın bir yere mi yerleştirileceği önemli değil, ekleme yine de işaretçilerin yeniden atanmasını içeriyor. Elbette, nasıl uygulandığına bağlı olacaktır, ancak listelerin gücü budur - kolayca ekleyebilirsiniz. İndeks yoluyla erişim, bir dizinin parladığı yerdir. Ancak bir liste için n'inci öğeyi bulmak tipik olarak O (n) olacaktır. En azından okuldan hatırladığım buydu.


3

Çünkü herhangi bir döngü içermez.

Eklemek şuna benzer:

  • eleman ekle
  • öncekine bağlantı
  • sonrakine bağlantı
  • bitti

bu her durumda sabit zamandır.

Sonuç olarak, arka arkaya n eleman eklemek O (n) olur.


3

Bu analiz düğüm işleminin bulunmasını (gerekli olmasına rağmen) ve sadece eklemenin kendisini hesaba katmıyor mu?

Anladın. Belirli bir noktada ekleme, sonrasına eklemek istediğiniz öğeye yönelik bir işaretçiyi zaten tuttuğunuzu varsayar:

InsertItem(item * newItem, item * afterItem)


2

Hayır, aramayı hesaba katmaz. Ancak listenin ortasındaki bir öğeye yönelik bir işaretçiyi zaten tutuyorsanız, o noktada ekleme O (1) olur.

Eğer onu aramak zorunda kalırsanız, arama süresini eklemeniz gerekir, bu O (n) olmalıdır.


0

Makale dizileri listelerle karşılaştırmak hakkındadır. Hem diziler hem de listeler için ekleme konumunu bulmak O (N) 'dir, bu nedenle makale onu yok sayar.


1
Bir dizinin ekleme noktasını bulmak O (1) olmaz mıydı? Diziler bitişik bellekte depolandığından, tek yapması gereken ofseti eklemektir.
Rob Sobers

@ vg1890 - Önce ofseti bulmanız gerekir.

0

O (1), yeni öğeyi ekleyeceğiniz bir öğeye sahip olduğunuz gerçeğine bağlıdır. (önce ya da sonra). Eğer yapmazsanız, bu O (n) 'dir, çünkü o öğeyi bulmanız gerekir.


0

Sanırım bu, O () gösterimi için neyi saymayı seçtiğinize dair bir durum. Normal işlemin eklenmesi durumunda sayılacak kopyalama işlemleridir. Bir dizi ile ortada ekleme, bellekteki konumun yukarısındaki her şeyi kopyalamayı içerir. Bağlantılı bir liste ile bu, iki işaretçi belirlemeye dönüşür. Ne ekleyeceğiniz önemli değil, konumu bulmanız gerekir.


0

İşlemden sonra eklenecek düğümün referansına sahipseniz, bağlantılı liste için O (1).
Bir dizi için, tüm ardışık düğümleri taşımanız gerektiğinden, hala O (n) 'dir.


0

En yaygın durumlar muhtemelen listenin başına veya sonuna eklemedir (ve listenin sonlarının bulunması zaman almayabilir).

Bunu, bir dizinin başlangıcına veya sonuna öğeler eklemeyle karşılaştırın (bu, dizinin sonunda ise yeniden boyutlandırmayı veya başlangıçta ise tüm öğeleri yeniden boyutlandırmayı ve taşımayı gerektirir).


Sonunda boş öğelerden oluşan bir tampon tutarsanız, bir dizinin sonuna öğe eklemeyi O (1) yapmak mümkündür, ancak ara sıra ekler yine O (1) olacaktır. Çoğu koleksiyon bunu yapar. Ayrıca, indeks operatörünüzü eleman numarası (n + x)% len döndürmek için değiştirerek bir dizinin başlangıcına eylemsizleştiren öğeleri O (1) yapmak da mümkündür; burada x, öğeleri başlangıca kaç kez eklediğinizdir listenin. Deques bazen bu şekilde uygulanır (ancak bazen çift bağlantılı listelerle de uygulanır.
Brian,
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.