Farklı veri yapılarının pratik kullanımları [kapalı]


102

Veri yapıları hakkında çok fazla konuşma var, ancak basit bir veri yapıları listesi ve pratik kullanımları bulamıyorum. Bir röportaj için çalışmaya çalışıyorum ve bence bu, diğerleriyle birlikte bana yardımcı olur. Bunun gibi bir şey arıyorum:

Veri yapısı - Örnek / Şunun için kullanılır

Karma tablosu - hızlı veri araması ... sonra bir örnek verin

Dizi - ...

İkili ağaç - ...

Bir yerde bunun gibi bir kaynak varsa lütfen bana bildirin.

Teşekkürler!

DÜZENLEME: Yani wikipedia iyidir ve hepsi, ancak sayfaların çoğunda aslında pratik kullanımları listelemiyorlar. Bundan daha fazlasını arıyorum.

Yanıtlar:


96

Listeyi daha önce StackOverflow'da benzer bir soruda buldum:

Hash Table - hızlı veri araması için kullanılır - derleyiciler için sembol tablosu, veritabanı indeksleme, önbellekler, Benzersiz veri gösterimi.

Trie - otomatik tamamlama ve yazım denetimi için cep telefonunda bulunanlar gibi sözlük.

Sonek ağacı - çoğu kelime işlemcide kullanılan hızlı tam metin aramaları.

Kelime işlemcilerde yığın - geri al \ yinele işlemi, İfade değerlendirme ve sözdizimi ayrıştırma, JVM gibi birçok sanal makine yığın yönelimlidir.

Kuyruklar - Çeşitli varlıkların depolandığı ve daha sonra işlenmek üzere bekletildiği, yani kuyruk bir arabellek işlevi gören taşıma ve operasyon araştırması.

Öncelik kuyrukları - çekirdekte işlem planlama

Ağaçlar - Ayrıştırıcılar, Dosya Sistemi

Taban ağacı - IP yönlendirme tablosu

BSP ağacı - 3D bilgisayar grafikleri

Grafikler - Sosyal ağ sitelerinde bağlantılar / ilişkiler, Yönlendirme, iletişim ağları, veri organizasyonu vb.

Heap - Lisp'de dinamik bellek ayırma

Bu, orijinal olarak RV Pradeep tarafından gönderilen cevaptır

Diğer, daha az kullanışlı bağlantılar:

Uygulamalar sadece bazı veri yapıları için listelenmiştir

Uygulama odaklı değil, iyi bir özet ve alakalı


1
ilk bağlantınız koptu
Dan Beaulieu

Teşekkürler @DanBeaulieu. Ölü bağlantıyı kaldırdım.
MXMLLN

1
Çok güzel özet. Muhtemelen kullanımların listesi asla bitmez, ancak kişi anlıyor.
Nick L.

1
Geri alma / yineleme gerçekten bir Yığın mı olur? Geri alma, Yığının üst kısmından çıkarsa, yeniden yapamazsınız.
Tony L.

5
@TonyL. Bunun daha eski bir soru olduğunu biliyorum, ancak 2 yığın kullanıldığına veya Geri Al / Yinele olduğuna inanıyorum. Bir eylemi geri aldığınızda, eylem yığınından çıkar ve Yinele Yığını'na yerleştirilir. Yeniden yaparsanız, onu Yinele Yığını'ndan çıkarır ve eylem yığınına itersiniz. Terminolojiyi yanlış bulmuş olabilirim, ancak orada örnekler olmalı.
Rick Henderson

14

Ben seninle aynı gemideyim. Teknik röportajlar için çalışmam gerekiyor, ancak bir listeyi ezberlemek gerçekten yardımcı olmuyor. Eğer 3-4 saatiniz varsa ve daha derin bir dalış yapmak istiyorsanız, incelemenizi tavsiye ederim.

mycodeschool Coursera'ya
ve bloglar ve ders kitapları gibi diğer kaynaklara baktım, ancak bunları ya yeterince kapsamlı bulmuyorum ya da yelpazenin diğer ucunda, önkoşul olan bilgisayar bilimi terminolojileriyle çok yoğun buluyorum.

Videodaki adam, veri yapıları üzerine bir sürü ders veriyor. Aptalca çizimlere veya hafif aksanlara aldırmayın. Yalnızca hangi veri yapısını seçeceğinizi değil, aynı zamanda insanlar veri yapıları hakkında düşünürken göz önünde bulundurmanız gereken diğer bazı noktaları da anlamanız gerekir:

  • ortak veri yapılarının artıları ve eksileri
  • neden her veri yapısı var
  • aslında hafızada nasıl çalışıyor
  • belirli sorular / alıştırmalar ve maksimum verimlilik için hangi yapının kullanılacağına karar verilmesi
  • lucid Big 0 açıklama

Ayrıca ilgileniyorsanız github'a notlar da gönderdim.


7

Anladığım kadarıyla veri yapısı, verimli bir şekilde yönetilebilen herhangi bir elektronik sistemin belleğinde bulunan herhangi bir veridir. Çoğu zaman bu bir hafıza oyunu veya verilere daha hızlı erişilebilirliktir. Yine bellek açısından, o son ürünün firmasına maliyete dayalı verilerin yönetimi ile yapılan ödünleşmeler var. Verimli bir şekilde yönetilmesi, son ürünün birincil gereksinimine göre verilere en iyi nasıl erişilebileceğini bize söyler. Bu çok üst düzey bir açıklamadır ancak veri yapıları geniş bir konudur. Görüşmecilerin çoğu, görüşmelerde sahip oldukları zamana bağlı olarak tartışmayı karşılayabilecekleri, bağlantılı listeler ve ilgili konular olan veri yapılarına dalmaktadır.

Şimdi, bu veri türleri mantıksal olarak inşa edilme ve erişilme şekillerine bağlı olarak ilkel, soyut ve bileşik olarak ayrılabilir.

  • ilkel veri yapıları , tüm veri yapıları için temel yapı taşlarıdır, onlar için sürekli bir belleğe sahiptirler: boolean, char, int, float, double, string.
  • bileşik veri yapıları , birden fazla ilkel veri türünden oluşan veri yapılarıdır. sınıf, yapı, birleşim, dizi / kayıt.
  • Soyut veri türleri, onlara verimli bir şekilde erişme yoluna sahip olan ve algoritma olarak adlandırılan bileşik veri türleridir. Verilere erişilme şekline bağlı olarak veri yapıları doğrusal ve doğrusal olmayan veri türlerine bölünür. Bağlı listeler, yığınlar, kuyruklar vb. Doğrusal veri türleridir. yığınlar, ikili ağaçlar ve karma tablolar vb. doğrusal olmayan veri türleridir.

Umarım bu, dalmanıza yardımcı olur.


6

Skienna'nın mükemmel kitabı " Algoritma Tasarım Kılavuzu" , Algoritmalar ve Veri yapısının büyük bir deposunu içerir.

Tonlarca problem için veri yapıları ve algoritma tanımlanır, karşılaştırılır ve pratik kullanım tartışılır. Yazar ayrıca uygulamalara ve orijinal araştırma makalelerine referanslar da sağlar.

Probleminizin çözülmesi için en iyi veri yapısını araştırırsanız, kitabın masanızda olması harikadır. Mülakata hazırlık için de çok faydalıdır.

Bir başka harika kaynak da NIST Veri yapıları ve algoritmaları Sözlüğüdür .


4

Veri yapılarının birkaç pratik uygulaması

Kırmızı-Siyah Ağaçlar (Sık sık Ekleme / Silme ve az arama olduğunda kullanılır) - Kırmızı siyah ağaç kullanarak K-ortalama Kümeleme, Veritabanları, Basit fikirli veri tabanı, sözlükler içinde sözcük arama, web'de arama

AVL Trees (Daha Fazla Arama ve Daha Az Ekleme / Silme) - Veri Analizi ve Veri Madenciliği ve daha fazla arama içeren uygulamalar

Min Heap - Kümeleme Algoritmaları


3

Çeşitli veri yapılarının herhangi bir sıralaması, en azından kısmen sorun bağlamına bağlı olacaktır. Algoritmaların zaman ve mekan performansının nasıl analiz edileceğini öğrenmeye yardımcı olacaktır. Tipik olarak, "büyük O gösterimi" kullanılır, örneğin ikili arama O (log n) zamanındadır, yani bir elemanı arama zamanı eleman sayısının günlüğüdür (2 tabanında, örtük olarak). Sezgisel olarak, her adımda kalan verilerin yarısı ilgisiz olduğu için atıldığından, öğelerin sayısını iki katına çıkarmak süreyi 1 adım artıracaktır. (İkili arama oldukça iyi ölçeklenir.) Alan performansı, daha büyük veri kümeleri için bellek miktarının nasıl büyüdüğüyle ilgilidir. Ayrıca, büyük-O gösteriminin sabit faktörleri göz ardı ettiğini unutmayın - daha küçük veri kümeleri için, bir O (n ^ 2) algoritması daha yüksek sabit faktöre sahip bir O (n * log n) algoritmasından daha hızlı olabilir.

Zaman ve mekanın yanı sıra, diğer özellikler arasında bir veri yapısının sıralanıp sıralanmayacağı (ağaçların ve yüzeylerin sıralanması, karma tabloların sıralanmaması), kalıcılık (ikili ağaçlar eski sürümlerdeki işaretçileri yeniden kullanabilirken, karma tablolar yerinde değiştirilir) vb.

Bunları karşılaştırabilmek için birkaç veri yapısının davranışını öğrenmeniz gerekse de, performans açısından neden farklı olduklarını anlamanın bir yolu, birkaçını yakından incelemektir. Tek tek bağlantılı listeleri, ikili arama ağaçlarını ve atlanan listeleri karşılaştırmanızı öneririm , bunların hepsi nispeten basittir, ancak çok farklı özelliklere sahiptir. Bir değer bulmak, yeni bir değer eklemek, tüm değerleri sırayla bulmak vb. İçin ne kadar çalışma gerektiğini düşünün.

Algoritmaları / veri yapısı performansını analiz etme konusunda insanların önerdiği çeşitli metinler var, ancak onları bana gerçekten anlamlı kılan şey OCaml'ı öğrenmekti. Karmaşık veri yapılarıyla uğraşmak, ML'nin güçlü bir özelliğidir ve C'deki gibi işaretçilerden ve bellek yönetiminden kaçınabildiğinizde davranışları çok daha nettir (OCaml'i sadece veri yapılarını anlamak için öğrenmek neredeyse kesinlikle uzun bir yoldur. :))

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.