Aynı amaca hizmet eden farklı algoritmaları / veri yapılarını öğrenmek için sebepler nelerdir?


91

Lisans öğrencisi olduğumdan beri bu soruyu merak ediyorum. Bu genel bir sorudur ancak aşağıdaki örneklerle çalışacağım.

Bir çok algoritma gördüm - örneğin, maksimum akış problemleri için, problemi çözebilecek yaklaşık 3 algoritma biliyorum: Ford-Fulkerson, Edmonds-Karp ve Dinic, Dinic en iyi karmaşıklığa sahip.

Veri yapıları için - örneğin yığınlar - ikili yığınlar, binom yığınları ve Fibonacci yığınları vardır, Fibonacci yığını en iyi toplam karmaşıklığa sahiptir.

Kafamı karıştıran şey şu: hepsini bilmemiz için herhangi bir neden var mı? Neden sadece en iyi karmaşıklığı öğrenmeye ve tanımaya başlamıyorsunuz?

Hepsini bilmemizin en iyisi olduğunu biliyorum, sadece bilmek istediğim "daha geçerli" sebepler var, bazı problemler / algoritmalar sadece A kullanılarak değil, B kullanılarak çözülebilir .


17
Her zaman dediğim gibi: bunlar (genellikle) "en iyisi" değildir. Açıkça ne demek istediğinizi "daha iyi" ile tanımladığınızda, cevap açık hale gelir.
Raphael

2
Bu iyi bir soru, ancak eğitiminizde düzeltmek isteyeceğiniz bir delik düşüneceğime değiniyor. Bu pratik bir deneyim, aslında bu algoritmaları eğitiminiz sırasında yazmadıysanız, onları şimdi yazmayı düşünebilirsiniz, bu sorunun cevabını kendileri için kullanmaya çalıştıkça çabucak ortaya çıkacağından şüpheleniyorum.
Sam,

@Sam Tecrübelerime göre, derslerde ya da bazı ders kitaplarında, bilgilendirici olduklarını, birçok algoritmayı, analizleri, vb. Sunduğunu, ancak A'nın göstereceği pek çok pratik durumu ya da örnek senaryoyu sunmadıklarını düşündüm. A'dan Z'ye algoritmaların türü ve bazı ev ödevi problemleri, ancak bana göre hepsi yalnızca A, veya sadece Z, vb.
Şubat'ta 19:16

5
Akademik ilgiyi bir kenara bırakmak konusunda ısrarcıysanız, optimal algoritmalardan daha az öğrenmenin en pratik sebebi, onları oldukları için tanıyabilir ve en uygun olanlara tekrar aktararak optimize edebilirsiniz. Bir ok ve yayın ne için olduğunu bilmiyorsanız, bir ok ve yayı yükseltemezsiniz.
candied_orange

1
Aslında bunun gibi CS eğitim sorularına yardımcı olmak için bir StackExchange sitesi önerdik. Bizi burada bize destekleyin: area51.stackexchange.com/proposals/92460/…
vk2015

Yanıtlar:


121

Veri Yapıları, Algoritmalar ve Tradeoffs başlıklı bir noktada yazılmayı bekleyen bir ders kitabı var . Lisans düzeyinde öğreneceğiniz hemen hemen her algoritma veya veri yapısının, bazı uygulamalar için diğerlerinden daha iyi olmasını sağlayan bir özelliği vardır.

Örnek olarak sıralayalım, çünkü herkes standart sıralama algoritmalarına aşinadır.

Öncelikle, karmaşıklık tek endişe değil. Pratikte, sabit faktörler önemlidir, bu yüzden (örneğin) hızlı sıralama, hızlı sıralama korkunç en kötü durum karmaşıklığına sahip olmasına rağmen, yığın sıralamadan daha fazla kullanılma eğilimindedir.

İkincisi, her zaman garip kısıtlamalar altında programlama yaptığınız bir durumda kendinizi bulma şansınız vardır. Bir keresinde mümkün olduğunca hızlı örneklerin toplanması (bu yüzden 1000 veya) kuantil mütevazı ölçekli dan çıkarma yapmak zorunda, ama o kadar çok dışladı ki çok az yedek okuma-yazma hafızası vardı küçük mikrodenetleyici oldu sıralama algoritmaları. Kabuk sıralaması en iyi tradeoff'du çünkü ikinci dereceden ikinci dereceydi ve ek bellek gerektirmiyordu.O(nlogn)

Diğer durumlarda, bir algoritmadan veya veri yapısından gelen fikirler özel amaçlı bir soruna uygulanabilir. Kabarcık sıralama, gerçek donanımdaki ekleme sıralamadan her zaman daha yavaş görünmektedir, ancak bir kabarcık geçişi gerçekleştirme fikri bazen tam olarak ihtiyacınız olan şeydir.

Örneğin, modern bir video kartında bir çeşit 3B görselleştirme veya video oyunu düşünün; bu, performans nedenleriyle en yakın kameradan en uzak kameraya kadar nesneleri çizmek için Siparişi tam olarak alamazsanız, donanım bununla ilgilenir. 3B ortamın etrafında hareket ediyorsanız, nesnelerin bağıl sırası kareler arasında çok fazla değişmez, bu nedenle her karede bir kabarcık geçişi gerçekleştirmek makul bir tradeoff olabilir. (Valf Kaynak Motoru, bunu partikül efektleri için yapar.)

Süreklilik, eşzamanlılık, önbellek yerleşimi, bir küme / buluta ölçeklenebilirlik ve bir veri yapısının veya algoritmasının önemsediğiniz işlemler için aynı hesaplama karmaşıklığına rağmen diğerinden daha uygun olmasının diğer olası nedenleri vardır.

Bunu söyledikten sonra, bu sadece bir durumda algoritmaları ve veri yapılarını ezberlemeniz gerektiği anlamına gelmez. Savaşın çoğu, ilk başta sömürülecek bir tradeoff olduğunu ve uygun bir şey olup olmadığını düşünerek nereye bakacağını bilmek.


7
Harika örneklerle harika cevap! Kabarcık geçişinin bile gerçek dünyada pratik bir kullanımı olduğunu bilmiyordum ...
shole

1
@shole Oyun sektöründe çok fazla deneyimim yok, ancak yukarıdakilerin hepsi değişik derecelerde önemlidir. (Açıkçası, oyunlar için ihtiyaç duyduğunuz algoritmalar, veri yapıları ve matematik türleri muhtemelen veritabanları veya biyoinformatik için gerekli olanlardan ya da sizde olanlardan farklıdır.) Yerinde olsam ve izlemeye başlardım: handmadehero. org Ayrıca gamedev'de gizlenmeye
Pseudonym

1
Önbellek verimliliği çok fazla araştırılmayan büyük bir faktördür (google "hafıza duvarı").
Raphael

6
Dikkatli, Quicksort ortalama olarak Heapsort'tan daha hızlıdır , ancak Heapsort daha tutarlıdır (çalışma süresinin değişmesi daha azdır ve en kötü durum çok daha iyidir). Ve Heapsort, Quicksort'un sol ve sağdan doğrusal taramalarına karşı dizide zıplıyor, önbellek / sayfalama devreye girdiğinde büyük bir fark yaratıyor.
vonbrand

1
@shole Ne tür bir oyun geliştirme ile ilgileniyorsunuz? En az iki tane çok farklı alt alan var, 3 boyutlu grafikler ve oynanış (AI içeren). Yalnızca grafiklerle ilgili deneyimim var, ancak veri yapılarının ve matematiğin grafiklerde ve algoritmalarda daha az derecede önemli olduğunu söyleyebilirim . Bir motor kullanıyorsanız, bu işlemlerin çoğu elbette halledilir, ancak yine de 3D geometrinin temel matematiğini anlamalısınız.
gardenhead,

51

Makine modellerinin sayısız değeri üzerinde çok fazla maliyet önlemi (çalışma süresi, bellek kullanımı, önbellek özeti, şube yanlışlığı, uygulama karmaşıklığı, doğrulamanın yapılabilirliği ...) olması dışında (TM, RAM, PRAM, ...) , ortalama-en kötü-durum yanı sıra birbirlerine karşı ağırlıklandırmak için amortisman düşünceleri, genellikle temel ders kitabı şartname kapsamı dışında işlevsel farklılıklar vardır .

Bazı örnekler:

  • Mergesort, Quicksort'un olmadığı yerlerde kararlıdır.
  • İkili arama ağaçları sırayla yineleme sağlar, karma tabloları vermez.
  • Bellman-Ford negatif kenar ağırlıkları ile baş edebilir, Dijkstra yapamaz.

Yapılması gereken didaktik düşünceler de var :

  • Daha basit olanlardan önce daha ilgili bir çözümü anlamak ne kadar kolaydır? (BST'ler olmadan AVL ağaçları (ve analizleri); Ford-Fulkerson'sız Dinic; ...)
  • Birçok çözüme maruz kalmaya kıyasla, sorun başına yalnızca bir çözüme maruz kaldığınızda aynı ilkeleri ve kalıpları görüyor musunuz?
  • Problem başına sadece bir çözüme maruz kalmak yeterli eğitim sağlıyor mu (ustalığa doğru)?
  • Hangi çözümlerin bulunabileceğini biliyor musunuz (tekerleği tekrar tekrar icat etmenizi engellemek için) ¹?
  • Her sorun için yalnızca bir çözüme maruz kaldığınızda, vahşi ortamda bulduğunuz diğer çözümleri anlayacak mısın (örneğin, gerçek dünyadaki bir programlama kütüphanesinde)?

  1. Bu, emrinde zengin bir CS araç kutusu olmayan programcı türlerinden çok gördüğümüz bir şey .

4
Didaktik gerekçeleri dahil etmek için +1! Bazı gerekçelerle (özellikle ikinci ve üçüncü) ilgili olarak, algoritmaların ve veri yapılarının nasıl geliştirildiğini ve optimize edildiğini görmek, gelişim ve optimizasyon tekniklerini ve bir takas anlayışını öğretir (sadece "ne" değil, aynı zamanda "nasıl" ve "neden" de ).
Paul A. Clayton

2
Bir başka husus, farklı alternatiflerin analiz edilmesinin, belki sıradışı ortamlar için yeni algoritmaların analizinde faydalı araçlara örnekler sunmasıdır.
vonbrand

1
İyi nokta, @vonbrand. Yayvan ağaçların davranışlarını anlamak için itfa edilmiş karmaşıklık analizi icat edildi, ancak yayvan ağaçlar uygulamada nadiren kullanılır. Zaten yayınlandığı gibi ağaçları açmayın. Windows NT çekirdeği, sanal bellek haritalarını uygulamak için yayılmış ağaçları kullanır, ancak her aramayı yeniden sıralamaz.
Sahte

1
@ vonbrand Evet. Bir algoritma sınıfındaki araç-boyutuyla en çok ilgilenen birinin, bu sebeple nasıl hakaret edeceğini anlarım.
Raphael

7

In gerçek dünyada , bir noktada, diğer kişilerle bir ekip tarafından yazılmıştır yazılım üzerinde çalışıyor olması muhtemeldir. Bu yazılımlardan bazıları siz doğmadan önce yazılmış olacak!

Kullanılan algoritmaları / veri yapılarını anlamak için, artık “teknolojinin son halini” düşünmeyen seçenekler de dahil olmak üzere çok sayıda algoritma / veri yapısını bilmek çok yararlıdır.

Ayrıca standart olmayan ve üzerinde çalıştığınız uygulamada kullanılan algoritmalar üzerinde de çalışmanız gerekir. Bu algoritmaları geliştirmek zorunda kaldığınızda, diğer insanların algoritmaları nasıl geliştirdiğini incelemiş olduğunuz gibi, beyninizin algoritmaları iyileştirmek için faydalı yöntemlerle doldurulduğunu göreceksiniz.

Bilgisayar bilimi eğitimi almış birini programlamayı yeni öğrenmiş olandan ayıran şey budur. Çalıştığım işlerin çoğunda, bilgisayar bilimi okuduğumda, “kitaplardan öğrenilen” bir programcının çözemediği bir sorunu çözebildiğim zamanlar oldu, ancak zamanımın% 95'i bilgisayar bilimi okuduğumun bana bir avantaj sağlamadığını tespit etti. diğer deneyimli programcılar üzerinde .


Çözmeye çalıştığınız şeylerin% 95'i Makine öğrenimi ile ilgili olmadığı sürece. Normal programcının, gerçek ML problemlerinin karşılaştığı problemlerin herhangi birini denemek için nasıl doğru bir şansa sahip olduğunu göremiyorum.
Pinokyo

3
Amaç:% 5'ten daha iyi oranda bir iş bulmak.
Raphael

CS öğrenmenin algoritmalar ve veri yapıları hakkında bilgi toplamak için harika bir yol olduğunu unutmayın. Kodlama olduğu kodlayıcıları için - en iyi meslek.
greybeard

5

Pek çok insan haklı olarak sık sık en iyi algoritmanın bulunmadığından bahsetmiştir - bu duruma bağlıdır.

Ayrıca bir gün bilmediğiniz bir durumla karşılaşma olasılığınız da var. Algoritma ne kadar fazla algoritma varsa, temel olarak kullanabileceğiniz neredeyse bir çözüm olanı tanıma şansınız o kadar fazladır .


5
Bu cevap sadece eskilerden gelen puanları tekrarlar.
Raphael

1

Çok büyük cevaplar, eksik olduğunu düşündüğüm bir şey var, ancak Raphael'in cevabı bundan biraz bahsetti.

Uygulama kolaylığı da dikkate alınması gereken bir şeydir.
Bu genellikle sıralama algoritmaları ile ilgili bir sorun değildir, çünkü çoğu platform / dil zaten bir tane uygulamıştır (ve genellikle yapabileceklerinizden daha iyidir), ancak daha alışılmadık algoritmalar mevcut olmayabilir.
Sorununuza bağlı olarak, uygulama süresi 2 haftaya karşı 1 gün ise mutlak en iyi algoritmaya ihtiyacınız olmayabilir.

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.