Bağlantılı Listesi ve bir BinarySearchTree arasındaki temel farklar nelerdir? BST bir LinkedList korumanın bir yolu var mı? Hocam LinkedList hakkında konuştuk ve sonra BST ancak bunları karşılaştırmak did't veya başka üzerinden bir tercih ne zaman söylemedi. Bu muhtemelen bir aptal soru ama gerçekten kafam karıştı. Birisi basit bir şekilde bu netleştirmek miyim memnun olurum.
Bir LinkedList ve ikili arama Ağacı arasındaki fark
Ben ANA fark ikili arama ağacı sıralandığını olduğunu söyleyebilirim. Eğer bellekte saklanmasını bu öğelerin sona bir ikili arama ağacına, içine eklediğinizde onların değerinin bir fonksiyonudur. Bağlantılı bir listeyle, elementler gözü kapalı değeri ne olursa olsun listesine eklenir.
Hemen bazı ticari unsurlar olabilir: Bağlı listeler ekleme düzeni korumak ve yerleştirmek, daha az pahalı İkili arama ağaçları aramak için genellikle çabuk olur ise
Bilgisayar bilimi, bir ikili arama ağacı (BST) aşağıdaki özelliklere sahip bir ikili ağaç veri yapısı şöyledir:
- Her bir düğüm (ağacında et) belirgin bir değere sahiptir;
- hem sol ve sağ alt ağaç da ikili arama ağaçları olmalıdır;
- Bir düğüm sol alt ağaç, sadece düğümün değerden daha az değer ihtiva eder;
- Bir düğüm sağ alt ağaç, sadece daha büyük ya da düğümün değerine eşittir değerleri içerir.
Bilgisayar bilimi, bir bağlantılı liste temel veri yapılarından biridir ve diğer veri yapılarını uygulamak için kullanılabilir.
Yani bir ikili arama ağacı bağlantılı liste veya bir dizi uygulanabilir soyut bir kavramdır. bağlantılı liste temel bir veri yapısı iken.
Onlar kaplar gibi hareket her iki veri yapılarını olmaları dışında Bağlantılı listeleri ve BSTS gerçekten çok ortak yok. Bağlı listeler temelde takıp listenin sıralamasını korurken, listede herhangi bir yerde verimli unsurları kaldırmak için izin verir. Bu liste bir sonraki (ve genellikle önceki) için bir öğeden işaretçileri kullanılarak uygulanır.
Bir ikili arama ağacı (belirtilen değil yani diğer taraftan daha yüksek bir soyutlama bir veri yapısıdır nasıl verimli aramalar için izin verdiğini, bu dahili olarak uygulanan) (yani belli bir elemanı bulmak için size hiç bakmak gerekmez elementler.
Bağlantılı bir liste tüm düğümlerin sadece bir çocuk bir ağacın, yani bir dejenere ikili ağaç olarak düşünülebilir dikkat edin.
Bağlantılı liste:
Item(1) -> Item(2) -> Item(3) -> Item(4) -> Item(5) -> Item(6) -> Item(7)
İkili ağaç:
Node(1)
/
Node(2)
/ \
/ Node(3)
RootNode(4)
\ Node(5)
\ /
Node(6)
\
Node(7)
Bağlantılı bir listede, öğeleri tek bir sonraki işaretçi üzerinden birbirine bağlanmıştır. bir ikili ağaç, her bir düğüm, sol düğümün anahtar düğümün anahtar ve sağ düğümün anahtar daha az (a ikili arama ağaç halinde) daha, 0, 1 ya da 2 subnodes sahip olabilir, düğümü. Sürece ağaç dengeli olduğu gibi, her öğeye searchpath bağlı bir listedeki bundan çok kısadır.
Searchpaths:
------ ------ ------
key List Tree
------ ------ ------
1 1 3
2 2 2
3 3 3
4 4 1
5 5 3
6 6 2
7 7 3
------ ------ ------
avg 4 2.43
------ ------ ------
Daha büyük yapılar tarafından ortalama arama yolu önemli küçülür:
------ ------ ------
items List Tree
------ ------ ------
1 1 1
3 2 1.67
7 4 2.43
15 8 3.29
31 16 4.16
63 32 5.09
------ ------ ------
Bir ikili arama ağacı herhangi bir şekilde uygulanabilir, bir bağlantılı liste kullanmaya gerek yoktur.
Bir bağlanmış liste sadece düğümleri ve işaretçiler / bir düğüm içinde diğer düğümlere referanslar içeren bir yapıdır. Listenin baş düğümünü göz önüne alındığında, bağlı listedeki başka düğüme göz atabilir. sonraki düğüme normal referans değil, aynı zamanda önceki düğüme bir referans: Çift Bağlı Listeler iki işaretçiler / referanslar vardır. Bir çift-bağlı listesindeki son düğüm sonraki düğüme olarak listedeki ilk düğümü başvurur ve birinci düğüm, önceki düğüm olarak son düğümüne başvuran, dairesel listesi olduğu söylenir.
Bir ikili arama ağacı bir ikili arama karşılaştırma algoritması dayalı iki kabaca-eşit parçaya girişini böler bir ağaçtır. Böylece, yalnızca bir öğe bulmak için bir çok az sayıda arama ihtiyacı vardır. Eğer 1-10 ile bir ağaç vardı ve üç aramak için gerekirse Örneğin, ilk üstteki öğe muhtemelen 5 veya 6. Üç, bu yüzden sadece ilk yarısı daha az olur, teslim alınacaktır ağaç sonra kontrol edilecektir. Bir sonraki değeri 3 ise, o bulunmazsa ya kadar, aksi takdirde bir karşılaştırma, vb yapılır veya veri döndürülür var. Böylece ağaç değil nessecarily hızlı ekleme veya silme işlemi için, arama için hızlı. Bunlar çok kaba açıklamalardır.
Listesini Linked wikipedia ve gelen İkili Arama Ağacı wikipedia dan da.
Bir bağlantılı liste sadece ... bir listedir. Bu doğrusal değil; (Eğer doubly bağlı listenin konuşuyorsanız ve önceki) her düğüm sonraki düğüme bir referansı vardır. Bir ağaç dalları --- her düğüm çeşitli alt düğümleri bir referansı vardır. Bir ikili ağaç her düğüm sadece iki çocuğu bulunduğu özel bir durumudur. Böylece bağlı bir listedeki her düğüm bir önceki düğümü ve bir sonraki düğüm vardır ve bir ikili ağaçta, bir düğüm bir sol çocuğu, sağ çocuğu ve ebeveyni vardır.
Bu ilişkiler Yapıyı çapraz edebilmek için ne bağlı olarak çift yönlü veya tek yönlü olabilir.
Aslında oldukça basit. Bir bağlantılı liste özel bir sırada, birbirine zincirlenmiş öğelerin sadece bir grup olduğunu. Sen gerçekten sıska ağacın asla dalları olarak düşünmek olabilir:
1 -> 2 -> 5 -> 3 -> 9 -> 12 -> |i. (Bu son bir ASCII-sarfedilen bir çaba sonlandırıcı olarak bir boş olan)
Bir İkili Arama Ağacı 2 şekilde farklıdır: ikili bölüm her bir düğüm sahip olduğu anlamına gelir 2 çocuk, bir değil, ve arama bölümü bu çocuklar aramaları hızlandırmak için düzenlenir anlamına gelir - sadece sola daha küçük öğeleri ve sadece daha büyük olanları sağa:
5
/ \
3 9
/ \ \
1 2 12
9 hiçbir sol çocuğu vardır ve 1, 2, ve 12 "yaprak" vardır - onlar hiçbir şubeleri var.
Mantıklı olmak?
kullanımların çoğu "arama" türünde, bir BST daha iyidir. Ama tıpkı şeylerin türlü "sonradan İlk-Giren-İlk-Out veya son-In-İlk Çıkar başa şeylerin bir listesini tutmak" için, bir bağlantılı liste iyi sonuç verebilir.
Bağlantılı listesi birbirine örneğin A-> B> C ile bağlı komşu düğümlere sahip düz doğrusal bir veridir. Sen düz bir çit olarak düşünebilirsiniz.
BST sadece dalları ve benzeri diğer şube ve bağlı yer-turn bu dalların bağlı ana gövde ile bir ağaç gibi hiyerarşik bir yapıdır. "İkili" kelimesi burada her dal iki kol maksimum bağlı olduğu anlamına gelir.
Yalnızca bir öğenin en fazla bağlı her öğe ile düz verileri temsil etmek liste bağlantılı kullanırsanız; İki öğe bir öğe bağlamak için BST kullanabilirsiniz oysa. Böyle aile ağacı gibi bir veriyi temsil etmek BST kullanabilirsiniz, ancak bu her kişiye en fazla iki çocuk olabilir gibi n-li arama ağacı olacaksınız.
Onlar tamamen farklı veri yapıları vardır.
Bir bağlanmış liste, her eleman bir sonraki bağlantılı elemanının bir dizisidir ve iki kat bağlantılı liste, bir önceki durumunda.
Bir ikili arama ağacı tamamen farklı bir şeydir. Bu kök düğüm iki çocuk düğüme kadar vardır ve her çocuk düğüm en fazla iki çocuk notlar vs vs Bu oldukça zeki veri yapısıdır olabilir, ama burada anlatmaya biraz sıkıcı olurdu, bir kök düğüm vardır. Check out Vikipedi artcle üzerinde.
Bağlantılı bir liste ile sorun (ister alma için veya insert) içindeki arıyor.
Tek bağlantılı listesi için başında başlayacak ve istenen maddeyi bulmak için sırayla aramak zorunda. tüm listeyi taramak için gereğini önlemek için, bu durumda, artık basit bağlantılı liste, liste içinde düğümlerine ek başvurular gerekir.
Bir ikili ağaç doğal olarak sıralı ve gezilebilir kalarak daha hızlı arama ve ekleme için izin verir.
Geçmişte başarıyla kullandım alternatif bir SkipList olduğunu. Bu ikili ağaca arama performansı kıyaslanabilir izin vermek bağlı listesine ama ekstra referanslarla benzer bir şey sağlar.
Bağlantılı bir listesi örneğin, birbirine bağlı "düğümler" sıralı bir sayıdır:
public class LinkedListNode
{
Object Data;
LinkedListNode NextNode;
}
Bir İkili Arama Ağacı benzer bir düğüm yapısını kullanır, ancak bunun yerine bir sonraki düğüme bağlama, iki çocuk bezlerine bağlamaktadır:
public class BSTNode
{
Object Data
BSTNode LeftNode;
BSTNode RightNode;
}
Bir BST yeni düğümleri eklerken belirli kurallar takip ederek, hareket için çok hızlı bir veri yapısı oluşturabilirsiniz. Burada Diğer cevaplar bu kuralları ayrıntılı var, ben sadece kod düzeyinde düğüm sınıflar arasındaki farkı göstermek istedik.
Bir BST içine sıralı veri eklerseniz, bağlı liste ile bitireceğiz dikkat etmek önemlidir ve bir ağaca kullanmanın avantajını kaybeder.
Bu nedenle, bir LinkedList bir TSİ en kötü durumda, bir O (K) çapraz geçiş veri yapısıdır ve süre, bir O (K) çapraz geçiş veri yapısı en iyi durumda bir O (log N).
Bir İkili arama ağacı her iç düğüm olduğu bir ikili ağaçtır x sol alt ağacında saklanır eleman dair bir öğeye saklayan x daha az veya eşit , x ve sağ alt ağacında saklanır elemanları x için eşit veya daha büyük olan x .
![]()
Şimdi Bağlantılı listesi önceki ve / veya sonraki düğüm işaret düğümleri, her biri isteğe bağlı değerleri ve bir ya da iki referans bir dizi içerir.
![]()
Onlar benzerlikleri var, ama temel fark bir İkili arama ağacı verimli bir eleman için arama veya "anahtar" destekleyecek şekilde tasarlanmıştır olmasıdır.
Bir ikili arama ağacı, doubly bağlı listesi gibi yapısında iki diğer öğelere işaret ediyor. Sadece listenin sonuna onları ekleme yerine, yapı elemanları eklerken "sol" düğüme bağlantılı elemanlar "sağ" ile bağlantılı akım düğüm ve elemanlarına göre daha az olacak şekilde ancak, ikili ağaç yeniden düzenlendi düğümü mevcut düğümün daha büyüktür.
Basit bir uygulamada, yeni eleman yapısı (ağacın kökü) birinci elemana karşılaştırılır. Daha az ise, "sol" dal aksi takdirde "doğru" dal incelendiğinde, alınır. bir kolu boş olduğu kadar, bu, her bir düğüm ile devam eder; Yeni eleman bu pozisyonu doldurur.
elementler sırayla eklenirse bu basit yaklaşımla, (aynı performansla) bağlantılı liste ile bitirmek. Farklı algoritmalar düğümleri yeniden düzenleyerek, ağaçtaki dengenin bazı ölçüsünü korumak için vardır. Örneğin, AVL ağaçları iyi arama sürelerini vererek mümkün olduğunca dengeli bir ağaç tutmanın en işi yapmak. Kırmızı-siyah ağaçlar biraz daha yavaş aramalarda sonuçlanan olarak dengeli ağaç tutmak, ancak anahtarlar takılı veya kaldırıldığında olarak ortalama olarak daha az iş yapmak yoktur.













