Bir programcının bellekten QuickSort / MergeSort algoritmasının nasıl uygulanacağını bilmesi ne kadar önemlidir? [kapalı]


58

Notlarımı inceliyordum ve farklı sıralama algoritmalarının uygulanmasına rastladım.

QuickSort ve MergeSort'un uygulanmasını anlamayı denediğimde, bir yaşam için programlama yapmama ve yaptığım işte kendimi iyi görmeme rağmen, ne fotografik hafızam ne de tam bir beyin gücüne sahip olmadan bu algoritmaları uygulama notlarıma güveniyordum. Hatırladığım tek şey, bu algoritmaların bazılarının kararlı, bazılarının ise. Bazılarının tamamlanması O (nlog (n)) veya O (n ^ 2) zaman alır. Bazıları diğerlerinden daha fazla hafıza kullanır ...

Konumum, standart API'lerde bulunanlar dışında herhangi bir sıralama algoritması kullanmamı gerektirmediği için olmasaydı, bu tür bir işi haketmediğimi hissediyorum. Yani, kaçınızın, bu tür şeyleri kendi başınıza hatırlayabilmeniz veya bulabilmenizin zorunlu olduğu bir programlama pozisyonunuz var?


13
Bir çözümün var olduğunu ve ne zaman kullanacağınızı hatırlamanız gerekir. Ardından dokümanlar içine gidin ve uygulayın. QuickSort veya Mergesort hakkında bir şey bilmiyor olsaydınız, bubblesort kullanıyor ve programınızın bir taramaya girdiğini ve veriler arttığında subpar çözümleri bulduğunu izlerdiniz.
Pieter B

1
Aşağıda belirtilen iyi cevapların yanı sıra, birçok şirketin (1) bu algoritmaların karmaşıklığını bilmesini, (2) bir tahtaya uygularken akıcı olmaları gerektiğini de unutmayın.
sakisk

3
Google’ın çevrimdışı olma sıklığı için bu algıları ezberlemenin önemli olduğuna eminim. : o
Lee James

Performanslarını bilmeniz, vakaları kullanmanız vs.
sakisk

@ PieterB, katılmıyorum. Bir Google 'en iyi performans gösteren sıralama algoritması' 'mergesort' ve 'quicksort' hakkında bilmek gerekmez
hyankov

Yanıtlar:


117

Albert'e soralım ve konuyla ilgili ne söyleyeceğini görelim:

“Her şeyi bilmeye ihtiyacım yok, sadece ihtiyacım olduğunda nerede bulacağımı bilmem gerekiyor”

- Albert Einstein , tekrar yazılmış

Amin, Kardeş Albert, Amin.

Herhangi bir disiplinde (sıralama, arama, ne olursa olsun) gerekli algoritmaları iyi bir şekilde inceledikten sonra, gerçekte algoya ihtiyaç duyana kadar uygulama detaylarını unutabilirsiniz, bu durumda yukarı bakıp kullanın. önceden var olan lib. 25 yıl önce B * -rerees kullanarak büyük bir arama sistemi kurdum, ancak bugün bunları iyi kullanabilmem için RTFM'ye ihtiyacım olacaktı.



9
Bu soruya nasıl cevap veriyor? O, vermedi “Ben her şeyi bilmek gerekmez” dedi değildi “Ben bir şey bilmek gerekmez” derler. Bazı beceriler temeldir ve bütün soru, belirli bir bilginin temel beceriler kategorisine ait olup olmadığıyla ilgilidir.
Konrad Rudolph

1
Hedefin hızlı bağlantı noktasını ezberlemek olduğunu düşünmek, sorunun amacını kaçırmaktır. Elbette, gerçek dünyada, genel bir quicksort'a ihtiyacınız varsa, kütüphane yordamını kullanır ya da kodu araştırır ve kopyalarsınız. Test, özyinelemeyi, döngü değişmezlerini vb. Anlayıp anlamadığınızı görmek ve bir sıralama algoritmasını hızlıca not almanızı istemek, bu bilginin gerçekten basit bir göstergesidir. Eğer yerinde 20 hatlı bir hızlı bağlantı noktasını yeniden türetme yeteneğine sahip değilseniz, bunu bile bilmeden gerçekten verimsiz veya yanlış olarak rutin olarak ne kadar şey yapıyorsunuz?
Larry Gritz

3
@Larry: Sanırım çoğu programcının algoritmaların ayrıntılarını bildiğinden daha fazlasını unuttum - ve sıfırdan Hızlı sıralama onlardan biri - çok iyi bir sebepten dolayı - yüksek seviyeli şeyleri okumayı ve yüksek seviye dilleri kullanmayı seçtim. düşük seviyeli uygulama detayında kaplarda durmak. Açıkçası - Kullandığım kütüphane rutinini ne tür kullandığım umrumda değil - endişelendiğim kadarıyla peri tozu ve periler kullanabilir. Doktorlar O () 'ya boyutlandırma için söyleyecektir - bilmem gereken tek şey bu.
mattnz 11:12

2
@ matttnz: "O () boyutlandırmanız" için biraz gecikmeli bir takip. Zor yoldan öğrendiğim bir şey, büyük bir veri kümesi ile kötü bir referans konumunun O () tamamen bastırılabileceği idi. Eğer bir algo olabilir O(n log n), ancak çok fazla önbellek özlüyor ya da (Tanrı korusun) diske vurursanız, o zaman o n log nbir düşkün bellek olacaktır.
Peter Rowell

49
  1. Bu gerçekten ezber meselesi değil. Bölme ve fethetme gibi genel algoritma sınıflarını derinlemesine anlama meselesi. Eğer gerçekten ayrılmayı ve fethetmeyi gerçekten anlarsanız, hızlı bağlantı noktasını ezberlemeniz gerekmez. Gerektiğinde yerinde yeniden türetebilirsiniz. Dahası, gerçek kazanç, hızlı bağlantı noktasını kendi başınıza yeniden türetmek bile değildir, yeni bir sorunun bir bölme ve fethetme çözümüne uygun olduğu zaman fark edersiniz .

  2. Tüm programlama işleri aynı değildir. Bazı işler derin bir algoritma bilgisine, bazıları tip teorisini anlayan kişilere ihtiyaç duyuyor ve bazıları sadece bir web formundan veriyi çizip bir veritabanına taşıyabilen kişilere ihtiyaç duyuyor. Bazı işler aynı anda tüm bu yeteneklere ihtiyaç duyar. Ne tür bir işte çalışmak istersiniz?


5
QuickSort'u hatırlamadan QuickSort'u anlamanın mümkün olduğunu sanmıyorum. Bu karmaşık ve eğlenceli bir şey değil, sadece iki genel fikir bir araya geldi. Aynı şey birleştirme sıralaması için de geçerlidir, ancak orada tek bir fikriniz var: P
drxzcl

2. noktaya katılmıyorum. tüm işler aynı, sadece görüşmeci değişiyor. Bu, çok iyi sıralama yapmayı bilir ve her iyi programcının sıralamayı bilmesi gerektiğini düşünür, çünkü bildiği ve umursadığı şey budur.
IAdapter

2
@IAdapter, kesinlikle jest! Kendi tecrübelerime göre, bir shrink-wrap yazılım şirketi için TROFF makroları yazarken ilk işim için ihtiyaç duyduğum bilgi ve becerilerin bilgisayarlı bir biyoloji laboratuarında şu anki işim için ihtiyaç duyduğumdan çok farklı olduğunu biliyorum.
Charles E. Grant

@ CharlesE.Grant, çoğu zaman interviwer, işinizi yapmanız için gereken becerilere sahip olup olmadığınızı kontrol etmez (son javascript / css sorusunu hatırladım ve webapps yapıyorum).
IAdapter

10

Bence, hepsini hatırlamanız gereken tek zaman, iş yerinize başvurduğunuzda ve cevaplarınızı bulmak zorunda kaldığınızda ve dışarıda bir kaynak bulunmadığında.

İş arkadaşlarım hızlı bağlantı noktasını yeniden yazdılar ve ne anlama geldiklerini, ancak dillerinde bulunan yerleşik sıralama işlevlerini kullanmaya devam etmelerini söylüyorum. Hangi tür projeler üzerinde çalıştığımıza bağlı olarak, genellikle standart kütüphanelere dahil edilmediklerinden, diğer algoritmaları hatırlamamız gerekeceğini biliyorum, ancak sıralama genellikle dilin içine yerleştirildiği için ortaya çıkan bir şey değil.

Yine de bu algoritmaları hatırlamamız gerektiğinde, genellikle google'a ya da kitaplara yöneliriz ve genellikle belirli bir uygulama aramaz, ancak sorunumuz için en iyi uygulama ne olurdu.


6

Hangi algoritmanın hangi senaryolarda faydalı olduğunu hatırlamanız, işiniz boyunca yardımcı olmak için fazlasıyla yeterli olacaktır. Aslında, çoğu programlama işi , yaklaşımın hafızaya alınmasını gerektirmez , bunun yerine , sorunla karşılaştığında algoritmik modeli tanıma yönteminizle ilgilenirler .

Nitekim, çoğu programlama blogunda / algoritma konusundaki makalelerde bol miktarda bilgi vardır. Bu nedenle, tam uygulamanın ezberlenmesi önem taşımaz. En değerli bilgiler, ne tür algoritmaların mevcut olduğu ve hangi problemi çözmede iyi oldukları hakkında temel fikir edinmek olacaktır . Ne aradığınızı öğrendikten sonra tam olarak uygulama yapmak oldukça hızlıdır.

Özetle, aradığınızı ve referansların nerede olduğunu bilmek daima daha iyidir - bu sizi kaynağa yönlendirecektir.


5

Kesin uygulama çok önemli değil. Ancak mergesort / quicksort - özyineleme, bölümleme, vb. İlkesi çok temeldir ve her programcının anlaması gerekir. Bu algoritma, anladıktan sonra kelimelerle anlatılması çok basittir.

Bu, gerçekten bakıp bakamayacağınıza ya da Google'a bakıp bakamayacağınıza ilişkin bir sorun değil, programcının bu problem çözme tekniklerini anlaması ve diğer durumlara uygulayabilmesidir.


3

Bu konuda iki kafam var. Sıralama algoritmasının ne olduğunu bilmeyen birçok programcı biliyorum, ancak işlerini oldukça iyi yapıyorlar. Ayrıca, alanı gerçekten anlamak için ilkeleri anlamaya da inanıyorum.

Uzun zamandır programladığım için bu konuda tarafsız bir cevaba sahip olmak zor, muhtemelen şu anda bildiğim daha fazla algoritmayı unuttum - ama yine de bu soruda belirtilen sıralamaları biliyorum. Agile'deki düşünce liderlerinin (örneğin Ron Jeffries, Alistair Cockburn) bu fikre yakın iyi fikirleri olduğunu düşünüyorum (örneğin Shu-Ha-Ri).

Bu başıboş yanıtın özeti olarak: Kesinlikle API'yi kullanın (NIH, geliştiricinin olgunlaşmamışlığının bir işaretidir), ancak her zaman temel prensipleri anlayın. Umarım bu yardımcı olur.


2

Donald Knuth hayranı ya da bir sonraki Larry Page olmak istersiniz, sıralama ve arama yapmak çok önemlidir. Bulunduğunuz işe ve adaylarınız arasında yönetebileceğiniz rekabet düzeyine bağlı olarak, görüşmeye aşağıdaki kavramlardan bazılarını eklemenizi öneririm.

sınıflandırma

  • Bir çeşit sıralama algoritması taslağı.
  • Sıralama algoritmalarının bazı örneklerini listeler.
  • Farklı performans özelliklerine sahip iki çeşidi karşılaştırın / karşılaştırın.
  • Hafıza kullanımından bahsetmiyorlarsa, sor.

Aranıyor

  • Mümkün olduğunca çok sayıda arama algoritması olarak adlandırın.
  • İki arama algoritmasını karşılaştırın / karşılaştırın.
  • Doğrusal arama dışındaki herhangi bir aramayı eskiz.

Bazıları, iş için internet bağlantısı olmayan ıssız bir adada olmadığı sürece, bu algoritmalar için kod gerektirmesinin gereğinden fazla geçersiz olduğunu söyleyebilir. Diğer bir husus, 30 dakikanız varsa ve birçok aday için herhangi bir şey sormak istiyorsanız, sıralama işlemini uygulamak zamanınızın çok büyük bir kısmını alabilir.


İnsanlardan röportajlar hakkında program yapmalarını istemenin saçma olduğunu düşünmüştüm, ama sadece görünüşte harika özgeçmişleri olan ve "sosyal" soruları uçan renklerle cevaplayan insanların sayısına inanmazdınız, ama kimin yaşamı için 'strcat' doğru bir uygulamasını ya da başka bir basit işlevi not edin. Birkaç kez bu, beni aptalca kodlama sorusu olmasaydı, sonsuz bir kedere yol açabilecek ve takımı beceriksizce sürükleyecek birisini işe almaktan kurtardı.
Larry Gritz
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.