Veri yapıları ve algoritmalar arasındaki ilişki nedir? [kapalı]


13

Veri yapılarında iyi bir çevrimiçi kurs arıyordum, ancak Google'ın algoritma kursları için de sonuç döndürdüğünü bulduk:

Bu derste algoritma tasarımının birkaç temel ilkesini öğreneceksiniz: bölme ve fethetme yöntemleri, grafik algoritmaları, pratik veri yapıları (yığınlar, karma tablolar, arama ağaçları) , rastgele algoritmalar ve daha fazlası. [kaynak]

ve

Bu dersin sonunda, grafikler ve diğer önemli veri yapıları için yeni algoritmalar tasarlamak ve bu algoritmaların verimliliğini değerlendirmek için gerekli temel kavramları anlayacaksınız . [kaynak]

ve

Bu ders hesaplama problemlerinin matematiksel modellenmesine giriş niteliğindedir. Bu problemleri çözmek için kullanılan yaygın algoritmaları, algoritmik paradigmaları ve veri yapılarını kapsar . [kaynak]

Sorum şu: Algoritmalar ve veri yapıları birbiriyle yakından bağlantılı mı, yani birlikte anlaşılması mı gerekiyor, yoksa bir konu diğerinden daha temel mi?

EDIT: Oylama bu soruyu kapatmak için, lütfen bana nedenini ve belki de bu soruyu nasıl geliştireceğini söyleyebilir misiniz? Doğru soruları sormayı öğrenmek, eğitim sürecinin bir parçasıdır.


17
Bir veri yapısı statiktir ve hiçbir şey yapamaz. Algoritma, bazı veriler üzerinde gerçekleştirilecek bir dizi talimattan ibarettir. Biri olmadan diğeri işe yaramaz. Birlikte bilgisayar programları yaparlar. İkisi de temel.
Phoshi

2
@Phoshi Yanlış. Veri yapısı, verileri işleyen algoritmalara yakından bağlıdır. Bu nedenle yakından bağlanan algoritmalar veri yapısının bir parçası olarak kabul edilir. Örneğin Çizgili Liste veri yapısı, verilerin nasıl kaydedildiğini ve verilerin nasıl okunduğunu ve işlendiğini gösterir.
Euphoric

7
@Ehohoric Algoritmaların veri yapısının bir parçası olduğunu söylemenin yanlış olduğunu iddia ediyorum. İkili bir arama yapmanın birden fazla yolu vardır: örneğin, naif if less than recurse to the left; if greater than, recurse to the right; if equal, returnarama veya biraz daha karmaşık bir arama yapabilirsiniz if less than recurse to the left; otherwise keep track of this value as a potential candidate and recurse to the right; check for equality once we reach the leaves. Biraz farklı karşılaştırmalara sahiptirler. Her ikisi de bir ağaçla yapmayı seçebileceğiniz birçok şeyden biridir.
Doval

4
@Euphoric Veri yapısını, veri yapısı ve algoritmaların birleşiminin uyguladığı soyut veri türüyle karıştırıyorsunuz.
Doval

7
@Euthoric, katılmıyorum. birleştirme sıralaması bir algoritmadır. Dizi bir veri yapısıdır. Bağlantılı liste farklı bir veri yapısıdır. Ben de üzerinde çalışmak için bir MergeSort uygulaması yazabilirsiniz. Bazı veri yapıları belirli bir algoritma için daha doğal veya daha verimli olabilir, ancak nadiren mutlak bir gereksinimdir (yığın türünü uygulamak için bir yığınınız olması gerekir). Nicholas Wirth 1980'lerde "Algoritmalar + Veri Yapıları = Programlar" başlıklı popüler bir metin kitabı yazdı
Charles E. Grant

Yanıtlar:


20

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 xve ydeğ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 HashMapkullanı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 HashMapdahili 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, Pointbelirli 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 / Mapatarken veya bağlantılı bir listeyi sıraladığınızda, aklınızdaki birincil odak noktası olan bir şey değildir .


1
Veri yapılarını ve soyut veri türlerini karıştırıyorsunuz. Bir veri yapısı hiçbir şey yapmaz . Bir veri yapısı sadece bir yapı olduğu için "kullanımı oldukça basit olan veri yapılarıyla karşılaşacaksınız" demek hiç mantıklı değildir. A Map, belirli bir veri yapısı ve yapıyı çaprazlayarak ve manipüle ederek istenen sonuçları üreten bir dizi algoritma kullanılarak uygulanabilen soyut bir veri türüdür. Veri yapısı algoritmaları gizlemez, çünkü hiçbiri yoktur; soyut veri türü veri yapısını gizler (soyut yapan da budur.)
Doval

Bir bakıma algoritmaların her zaman gizlendiğini unutmayın, çünkü fonksiyonları incelemenin bir yolu yoktur. Muhtemelen bu yüzden lambda hesabında (tek veri tipi fonksiyon olan) soyutlama denir .
Doval

2
Haklısın. Bununla birlikte, farklı ADT'leri nasıl gördüğümüz arasında bir ayrım görüyorum. Cevabımı düzenledim ve umarım şimdi daha net ve artık yapıyı ADT'lerle karıştırmıyor, yine de herhangi bir ADT'nin yapısına ve / veya işlemlerine odaklanabileceğinizi vurgulamaktayım.
Frank

Veri yapılarının isimler ve algoritmaların fiiller olduğunu söylemek gerçekten çok mu basit? Sana algoritma fiilin uygulanması olduğunu söyleyebilirsiniz varsayalım, ama yine de arama bir ağaç arama ikili arama olsa bile. Bunu söyleyerek tüm teknik detayları kaçırırsınız, ancak belli bir zarafeti vardır.
Magus

@Doval: Bir dizideki birbirleriyle ilişki kurması ve sürdürmesi gereken bir grup sayıdan oluşan bir veri yapısı olsa bile, gerekli değişmezleri korumak kolaysa böyle bir şey "kullanımı kolay" olabilir istediği şeyi yaparken veya zorsa "kullanımı zor".
supercat

5

Veri yapıları genellikle bir algoritmanın ayrıntılarını etkiler. Bu nedenle ikisi genellikle el ele gider.

Örneğin, çiminizi kesmek için bir algoritma düşünün. Çimlerinizi nasıl keseceğiniz, çimlerinizin gerçek yapısından etkilenecektir. Yoğun paketlenmiş bir banliyöde küçük bir evde yaşıyorsanız ve çimleriniz birkaç metre kare alan küçük bir dikdörtgense, muhtemelen çiminizi traktör / sürme biçme makinesi yerine bir itme biçme makinesi ile kesmeyi tercih edersiniz. Çimleriniz çok sayıda dönümlük düz çayır arazisi içeriyorsa, tercihiniz itmeli biçicinin aksine sürüş biçme makinesi için olabilir (her iki biçici de sonunda işi bitirebilir). Çimleriniz geniş düz alanlara sahip dönümlük arazileri içeriyorsa, ancak birkaç küçük tepe ve birkaç ağaç varsa, hem bir çim biçme makinesi hem de bir itme biçme makinesi veya başka bir çim içeren çimleri kesmek için daha ilginç bir algoritma geliştirebilirsiniz. kesme teknikleri.

Nihayetinde, verilerinizin yapısı algoritmanızı (veya hangi algoritmaları kullanacağınızı) nasıl geliştireceğinize dair kararlarınız üzerinde önemli bir etkiye sahip olabilir. Bu nedenle, iki konu genellikle el ele gider.

Ve tersi: bazen kullanmak istediğimiz algoritma (en azından hesaplama başlangıcında) algoritmayı desteklemek için geliştirdiğiniz veri yapılarını etkiler. Örneğin, bir dizi listesinden bağlantılı liste fikrine ve sonunda hızlı bulmaya izin verecek sıralı bir listeyi saklamak için bir BST'ye gitmek.

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.