Her türlü karışım mevcuttur. Herhangi bir (gerçek) veri yapısı gerektirmeyen algoritmalarla, algoritmalarla ilişkili olmayan veri yapılarınız var, ancak çoğu zaman ikisi bir pakette geliyor.
Düzenleme: @Doval doğru şekilde işaret ettiği gibi, veri yapıları kendileri ile ilişkili herhangi bir işlem yok. Veri yapısı ve algoritmayı birleştirme eylemi soyut bir veri türü oluşturur.
Algoritmasız veri yapıları
Örneğin, uygun şekilde adlandırılan 2 boyutlu koordinatları saklamak için bir veri yapısı düşünün Point
. Bir nokta için yapılacak algoritmalar açısından çok fazla bir şey yoktur ve gerçekten sadece bir x
ve y
değeri için bir kaptır . Tabii ki, bu veri yapısını vererek, üzerine her türlü algoritmayı ekleyebilirsiniz (mesafe hesaplama, dışbükey gövdeler, ne var).
Sadece bireysel verilerin birikimi olan birçok veri yapısını düşünebilirsiniz. Bunlar pratikte sık sık meydana gelse de, iyi bir öğretim materyali oluşturmazlar, çünkü anladıktan sonra, tek veri öğelerinin yeni bir veri yapısında (ne öğrendiğiniz gibi) toplanabileceğini öğrendiğiniz bir şey yoktur. Yukarıdaki Point
örnekten sonra, size şu Point3D
üç boyutlu alan için aynı şeyi yapabilen müthiş veri yapısını sağlarsam ?)
(Gerçek) veri yapıları olmayan algoritmalar
"Gerçek", çünkü açıkçası her ilginç algoritma tamsayılar veya booleanlar gibi ilkel veri türlerine ihtiyaç duymaktadır ve biz bu bağlamda bunları veri yapıları olarak değerlendirmek istemiyoruz. Yukarıdakine benzer şekilde, bu algoritmalar tipik olarak oldukça basittir. Özellikle, herhangi bir türden karmaşık bir durumla gelmezler, çünkü bu genellikle bir veri yapısına girer (bir sonraki bölüme bakın).
Böyle bir algoritma için bir örnek, iki sayının en büyük ortak bölenini hesaplamak olabilir. Euklid'in gcd algoritmalarının gerçekten sadece iki tamsayıyı tutması ve manipüle etmesi gerekir.
Her şey daha ilginç olmaya başladığında, çok yakında soyut veri türleri dünyasına girersiniz. Örneğin, Eratosthenes'in eleği bir diziye dayanır. Şimdi bir dizinin hala ilkel olup olmadığını tartışabiliriz ya da aslında, bir tamsayı zaten bir veri yapısı değilse tartışabilirsiniz. Her iki durumda da, veri yapıları olmadan tamamen var olan algoritmalar, onların izole varlıklarını kabul etseniz bile, oldukça sıkıcıdır.
Veri yapıları ile birleştirilmiş algoritmalar, diğer bir deyişle soyut veri türleri
Şimdi bunlar ilginç olanlar, ama çok farklı iki nedenden dolayı. Tipik olarak, bunlara iki yönden yaklaşabilirsiniz: önce veri yapısı veya önce algoritma.
Soyut bir veri türü, veri yapısı + algoritmalar / işlemlerin birleşimi ile tanımlanırken, bunları genellikle bunlardan birine odaklanarak görüyoruz ve diğerini etkinleştiriciler olarak görüyoruz.
Veri yapısı, ardından algoritma
Kullanımı oldukça basit olan ancak dahili olarak çalışmasını sağlamak için az ya da çok karmaşık algoritmalar içeren soyut veri türleriyle karşılaşacaksınız. Örneğin, a HashMap
kullanımı önemsizdir, ancak şık bir karma işlevi ve içerideki karma çarpışmalarla uğraşmayı içerir. Yine de, kullanıcı olarak sizin açınızdan, sizin için bir şey yapan bir şey değil, sizin için veri tutan bir şey olarak önemsiyorsunuz.
Aşağıdaki son grubun aksine, bu veri yapıları kullanıcılarını bu algoritmalara maruz bırakmaz. Kullanabilmek için HashMap
dahili bir hash fonksiyonunu bilmenize veya umursmanıza gerek yoktur. (Etkili bir şekilde kullanmak için, bunları bilmek isteyebilirsiniz;)
Algoritma, daha sonra veri yapısı
Diğer yön, basitçe kullanmak istediğiniz, ancak amaçlandığı gibi çalışması için dahili olarak veri yapılarına ihtiyaç duyan bir algoritmaya sahip olduğunuz anlamına gelir. Bir örnek, Point
belirli bir sorgu noktasına en yakın olan büyük bir nokta kümesinden 2 boyutlu isteyebileceğiniz ikili bir uzay bölümleme (BSP) algoritmasıdır . Ancak, algoritmayı gerçekten yazmak için içeride bir ağaç yapısına (ve hatta mesafe hesaplamaları gibi ek algoritmalara) ihtiyacınız vardır.
Genel olarak, bu gruptaki algoritmaların dahili durum gösterimleri için veri yapıları kullandığını söyleyebiliriz. Bu algoritma grubunun en çeşitli olduğunu ve bu genel şemaya uyan birçok farklı algoritma bulacağınızı iddia ediyorum. Bakış açısıyla ilgili olarak, bunları ilginç olarak görüyoruz, çünkü onlar bizim için bir şeyler yapıyorlar (örn. Sıralama) ve veri tutma kısmı kadar umursamıyorlar.
Yakından ilişkili veri yapıları ve algoritmalar
Son olarak, doğrudan bunlara karşılık gelen algoritmalara çok yakın olan veri yapılarınız var. Tipik bir örnek, onunla anlamlı bir şey yapmak istediğinizde, ağaç yürüyüş algoritmaları konusunu (önce derinlik, önce genişlik, ne olursa olsun) zorlayan ikili bir ağaçtır.
Bu durumlar için, sonuçta ortaya çıkan soyut veri türlerine olan bakış açımızın odağını sık sık değiştiriyoruz. Bazen ağacınızın yapısını önemsiyorsunuz, birkaç dakika sonra üzerinde bir bulma işlemi gerçekleştirmeyi önemsiyorsunuz, o zaman bir düğümü silmeyi ve yapının hemen sonra nasıl göründüğünü merak ediyorsunuz. Tüm bunlar yukarıdaki diğer bölümler için de geçerli olsa da, örneğin, a / dan veri depolarken / Map
atarken veya bağlantılı bir listeyi sıraladığınızda, aklınızdaki birincil odak noktası olan bir şey değildir .