Yetkili bir programcı kendi en kısa yol algoritmasını bulabilmeli mi?


58

Bir bilgisayar programcısı olarak kabiliyetim konusunda kendime güven krizine giriyorum.

Dün bir grafik için kendi en kısa yol algoritmamı bulmaya çalıştım ve birkaç saat sonra havluya attım ve Dijkstra'nın algoritmasını öğrendim.

Bu, iyi bir programcının birkaç saat içinde yeniden icat etmesi gereken bir şey mi yoksa gerçekçi değil miyim?

Ah, en azından ben kabarcık türünü yeniden icat edebildi: D


7
20 yıldan beri UI yapan biri, kısa sürede başka bir alandan bir soruna bir çözüm bulmakta zorlanacaktır.
Kodlayıcı

38
SE sitelerinde çok fazla zaman harcamak, herkese güven krizi verir! (Bu kötü bir şey değil). Yaşamdaki mutluluk, olanın kabulü ile onu değiştirme arzusu arasındaki mükemmel dengeyi bulmaktır.
TrojanName

2
Kendim yeniden icat edemedim ama nasıl çalıştığını hatırlamaya çalışıyorum. Bu animasyonu anladığınızdan emin olun: upload.wikimedia.org/wikipedia/commons/2/23/…
İş

6
@Bri yerel dehanın trajedisi. Artık hiçbir şeyde en iyisi olamazsın.
Rei Miyasaka

7
İyi bir bilgisayar bilimcisi , mutlaka bir bilgisayar programcısı veya yazılım mühendisi olmak zorunda değildir
Neil McGuigan

Yanıtlar:


118

İyi bir programcı, bir problemi çözmek için zaten harika bir algoritma yazıldığını ve tekerlekleri icat etmek için zaman kaybetmediğini anlamalıdır.

Dijkstra'nın birkaç saat içinde en kısa yol algoritmasıyla karşılaştığından şüpheliyim, bu yüzden birinin 'iyi bir programcı' olup olmadığını belirlemek için kullanması gerçekten yüksek bir standart gibi görünüyor


25
@Nakilon - Mevcut çözümleri görmezden gelen programcılar sadece zamanlarını boşa harcıyorlar ve zamanlarını boşa harcamazlarsa, daha kötü bir çözüm yapıyorlar. Bakınız: Herkes kendi şifresini çözen şemaya karşı bcrypt yazıyor.
Monica’ya

10
@GSto: wikipedia'ya göre, Dijkstra algoritmayı bir saatten az bir sürede buldu: 20 dakika, wikipedia'daki ilk nota göre: en.wikipedia.org/wiki/Dijkstra%27s_algorithm
woliveirajr

9
Göreceli olarak basit bir algoritma, ancak Dijkstra çok yetenekliydi ve teorik fizik ve ileri matematik konularında eğitim görmüştü. Birkaç yıl boyunca, birinin algoritma tasarlama yeteneğini geliştirmek için ispat yazmak gibi bir şey yok.
kevin cline

19
@ woliveirajr - Eminim Newton, hareket yasalarını bulmak için aynı miktarda zaman aldı. İlk önce 20 yıl düşündükten sonra.
Rook

6
@Nakilon - Evet, bu yüzden herkes her şeyi C dilinde yazıyor, çünkü aksi halde sadece bir kodlayıcısınız, başka birinin üst düzey dilini kullanıyorsunuz. Bekle, montaj demek istedim, yoksa sadece başka birinin düşük seviyeli dilini kullanıyorsun. Bekle, elektrik devrelerini değiştirmek için anahtar çevirmek demek, yoksa sadece başka birinin talimatlarını kullanıyorsun. Ya da bilirsin, sadece orada olanı kullanabilir ve yeni bir şeyler yaratmaya çalışabilirsin . Neden yeni bir şey icat ederken, onu kullanan bir program gibi Dijkstra'nın algoritmasını yeniden icat etmekle zaman harcıyorsun?
Monica’yı

54

Bu, iyi bir programcının birkaç saat içinde yeniden icat etmesi gereken bir şey mi yoksa gerçekçi değil miyim?

İlk olarak, belki de programlama teorik bilgisayar bilimi ile karıştırıyorsunuz. Harika bir programcının bilgisayar bilimlerinde iyi bir yapıya ihtiyacı vardır, ancak fantastik olması gerekmez. Dijkstra bilgisayar bilimlerinde harikaydı.

İkincisi, grafikleri iyi bilen bir kimsenin biraz düşünmeden sonra kendi grafik geçişini geliştirmelerini beklerdim. Ama değil bir kısa yol algoritması. Dijkstra'nın özellikle algoritması oldukça karmaşık. Bir kere anlayınca, kör edici şekilde açık. Ancak çoğu şey bu şekildedir.

Bazı şeyleri denedikten ve bir süre fikir verdikten sonra muhtemelen bir çeşit en kısa yol algoritması türetebilirsiniz . Ancak bu saatler, hatta birkaç gün sürebilirse hayal kırıklığına uğramayın. Bu tamamen iyi ve normal.

(Caveat: Pekala, birkaç saat içinde sorunu zorlayabilmelisin, ama bu oldukça küçük grafiklerde bile çalışma algoritması vermeyecekti.)


56
Endişelenmeyin, eğer kaba kuvvet çalışmıyorsa, yeterince kullanmıyorsunuzdur.
Robbie

2
Teorik CS ve programlama arasındaki farkı yükseltmek için +1. Programlama gerçek dünyadaki problem çözmedir ve teorik CS programlamayı desteklemek için vardır. Bununla birlikte, teorik CS çoğu halkın günlük programlamasında% 100 şart değildir.
Phil

17

Bu, iyi bir programcının birkaç saat içinde yeniden icat etmesi gereken bir şey mi yoksa gerçekçi değil miyim?

Kesinlikle gerçekçi değil. İnsanlar sadece birkaç saat içinde algoritmalarla "gelmez". Çok çaba ve çalışma gerektirir. Bu blogu alıntı yapmak için :

Programlama İncilerinde, Donald Knuth'dan alıntı yapan Bentley, “İlk ikili arama 1946'da yayınlanırken, n'nin tüm değerleri için doğru çalışan ilk ikili arama 1962'ye kadar görünmedi” diyor.

Bentley'in versiyonu büyük setler için uygulandığında da sorunluydu.

Ayrıca, iyi bir programcı hangi araçların elinin altında olduğunu ve bu araçların ne zaman kullanılacağını bilir. Özgünlük için fazladan puan almazsınız veya farklı şeyler yaparsınız - çalışmasını ve iyi çalışmasını istersiniz.


1
BlackJack, Bentley'in söylediğini söylediğini söylemediğini belirtmek için bu foruma katılmak zorundaydım: Knuth bunu söyledi ve Bentley onu alıntıladı. Yorumunuzu okuduğumda iyi bir noktaya değindiğinizi düşünmüştüm, ancak kaynaklarımı doğrulamayı seviyorum ve Bentley'i hiç duymadım. Bununla birlikte, Knuth'u duydum ve söylediklerine güvenebilirim. Lütfen bir dahaki sefere kaynaklarını daha iyi kontrol et.
Richard

8
@ Richard - Yorum “Programlama İncilerinde Bentley diyor ..” Knuth ilk söyleyen oldu, ama benim kaynağım TAoCP değil Programlama İncileriydi, bu yüzden Bentley'nin yazdıklarını yazdım. Bentley'nin yaratıcı olduğunu iddia etmedim - sadece kitapta söylenenleri alıntı yaptım. Kitaplarda çok fazla materyal yazarların kendileri tarafından icat edilmedi, bu yüzden neden bu şekilde gördüğünü anlamıyorum.
BlackJack

Teklifi yalnızca Bentley’ye atfederek, Knuth kredisi nedeniyle başarısız olursunuz ve “Bentley’nin” ifadesi yanlışsa, Bentley’yi yalnızca yaymak yerine yanlış bilgi üretme konumuna getirdiniz. Açıkça konuşursak, Bentley’in ne dediğini söylemediniz: “Olsaydı,“ Bentley Knuth'un dedi ki… ”dedi. Alıntı burada iyi kullanılmaktadır, ancak söylendiği bağlamın dışına çıkarılmıştır.
Richard,

3
@Richard - Listelediğim alıntı doğrudan doğrudan kitaptan alıntı yapan blogdan geliyor (kelimenin tam anlamıyla, bence ilk baskının 57. sayfası). Açıklamada bu kadar sorun yaşarsanız, blog yazarıyla iletişim kurun ve onu değiştirmesini isteyin.
BlackJack

1
@Richard ve BlackJack: İkiniz de haklısınız, ancak asıl yazara atfettiğimizde ifade ve içerik ekler. Düzenlemem yeterli olmalı.
Steven Evers

9

Seçim yapabileceğinizlerden daha iyi bir çözüm bulabilmeniz çok düşük bir ihtimal.

"En iyisi" olarak nitelendirilenden daha iyi bir algoritma ile (durumunuzda, en kısa zamanda) herkesin yapabileceği bir şey değildir. Muhtemelen mümkün bile değil.

İyi bir programlayıcı algoritmanın arkasındaki mantığı ve neden aynı problemi çözmeye çalışan diğer algoritmalardan daha iyi veya daha kötü veya daha iyi (ya da belirli bir problem için yetersiz) anlayabilmelidir.

(s) Bu sorunu çözmenin gerçekten en iyi yolu olup olmadığını da öğrenebilmelidir.

Her neyse, pratik yapmak istiyorsanız, yine de bir algoritmanın kişisel uygulamasını yazmaya çalışarak aklınızı kullanarak bir sorunu çözmeye çalışabilirsiniz. En iyisi olmayabilir, ancak problem çözme için iyi bir uygulamadır.


6

Bu bana "yazılım mühendisliği" (programlama dediğim şey) ile diğer mühendislik disiplinleri arasındaki fark hakkında okuduğum bir şey hatırlatıyor. Bir düşününce, orijinal Tasarım Desenleri kitabı olduğunu düşünüyorum. Eminim buradaki birileri kafasının tepesinden alıntı yapabilir.

Her neyse, mesele (algoritma tasarımına tam olarak yönelik olmamakla birlikte), mühendislik disiplinlerinin kodlandığı; hiçbir inşaat mühendisinin I-ışınını yeniden icat etmeye çalışmak için zaman harcaması muhtemel değildir, ancak programcılar bunu her zaman yaparlar. Sorun (ve sadece birçoğunun duygularını yankıladığımı fark ettim), bu davranışın israf ve hataya eğilimli olması ve egoya çözümden daha fazla hizmet etmesidir.

Bilgisayar bilimi beni programlamaya yönlendirdi ve ikisini de seviyorum. Ancak ben bilgisayar bilimcisinden çok daha iyi bir programcıyım. Beceriksiz olduğun için seni asla suçlayamam, çünkü Dijkstra'nın algoritmasını öğleden sonra yeniden icat edemezsin. En kısa yollu bir grafik algoritmasıyla çözülebilecek bir problemi tanıyamazsanız , bir programcı olarak yetkinliğinizi sorgularım .

Bununla birlikte, algoritmalar hakkında düşünmenin ve yenilerini tasarlamaya ve uygulamaya çalışmanın (potansiyel olarak) eğlenceli ve (neredeyse) her zaman öğretici olduğuna inanıyorum. CS zamanımı programlama zamanımdan temiz bir şekilde ayırmaya çalışıyorum. Programcılar için (özellikle ücretli) zamanımız, asbtract yerine pratik problemleri çözmek için harcanması daha iyidir. Ayrıca, CS zamanı neredeyse her zaman güvenimi mahvediyor.


Ah, ironi ... şimdi herhangi bir yere yorum yapabilirim, bu ayrıcalığa kazandıran cevabı silmeli miyim? Bunun için bir rozet olmalı.
Keith Layne

Var - Disiplinli, ancak itibarınız yeniden hesaplanırsa, 1'e geri
dönersiniz

Evet, bu tam olarak benim açımdan ... IMO'nun bu noktasında disiplinin üstünde ve ötesinde olacaktım. Ben Bir yoruma cevabım dönüştürülmüş ise önce silinmesi, hepsini ... Ben yeni kullanıcı durumunu marka dönmek neden olan herhangi bir silme işlemi için UberDisciplined denilen yeni bir rozet önermek olabilir. :)
Keith Layne

3

Diğerlerinin de aynı şeylerini fark etmeyeceksiniz. Bence bu sadece birlikte yaşamak zorunda olduğumuz hayatın bir gerçeği. Bunların çoğu pasif öğrenmenize ve bunun sonucunda geliştirdiğiniz zihinsel modellere bağlıdır.

DeMorgan kanununu tutarlı bir şekilde yapabilmeleri için okulda öğretilmesi gereken çok zeki ve yetkin programcılar biliyorum . Dijkstra'nın Algoritmasını kendi başıma çözdüm (ve bununla biraz gurur duyduğumu itiraf etmeliyim), ama baloncuk düzenini bile anlayabilmem çok uzun zaman aldı.

Daha da önemlisi, düğüm teorisinde uzman olacağını düşündüğünüz Einstein, yaklaşık on yaşına gelene kadar kendi ayakkabı bağlarını bağlayamadı.

Muhtemelen, açıkça öğretilmemeleri için, başkalarının asla çözemediği birçok şeyi bilmeden yeniden icat etmeniz iyi bir şey.


3

Cevapların çoğu için söyledikleri için farklı olmak için yalvarıyorum. Dijkstra'nın algoritmasına göre herhangi bir seviyedeki bir programcının kendisinin ortaya çıkmasını beklemesem de, problemi çözmek için kesinlikle herhangi bir şekilde (verimli ya da değil) gelmesini beklerdim.

Örneğin, yan yorum olarak kendi başınıza baloncuk sıralaması yapabileceğinizi söylediniz. Sıralama algoritmalarının en zorlu olduğunu biliyorum, ancak bir sorunu çözmenin bir yolunu buldunuz ve programcıların yapabilmelerini beklediğim şey: problemleri çözmenin bir yolunu bulmak.

Elbette, başkaları tarafından yapılan çözümleri araştırmak ve bulmak da işe yarıyor, ama bu noktanın kendisi, kendini düşünmeyen ve programları Google aramalarının bir özeti olan bir adam.

Sanırım istediğimden daha sert çıkıyorum, ama demek istediğim: bir programcının bir soruna çözüm bulabilecek kadar yaratıcı olmasını beklerim, çözüm çok karışık ya da dağınık olsa bile.


Bu yüzden, davanıza geri dönersek, Dijkstra'nın algoritmasını bulmak zorunda kalmayacağınızı düşünmüyorum, ancak çeşitli olasılıkları denemek ve sonsuz bir döngüye son vermeden en kısa yolu bulmak için bir algoritma yazabilme yeteneğine sahipseniz, o zaman benim onayımı aldın.

(BTW onayım, ücretsiz bir araba yıkama kuponuyla aynı derecede önemlidir.)


3
Evet, yetenekli bir programcının kabarcık türünü veya eşdeğerini bulabilmesi gerektiğine katılıyorum. Belki de sorunu daha iyi anlamak için, gerçekten uygulamak ve denemek için zamanın verimli bir kullanımı olabilir. Ancak bence yetkin bir programcının devam etmeyeceği ve bunu üretim kodunda kullanmayacağı söylenmelidir . Bunu yapmak, müşterilerinizin gelecek yıl geri gelmesini sağlar ve işlemek için daha fazla veriye sahip olduklarından, O (n!) Algoritmanızın evrenin yaşını iki katına çıkaracağından şikayet eder ...
Thomas Padron-McCarthy

Algoritmaları icat edip edemeyeceğini, ne zaman berbat olduğunu bile bilmiyorsan kimin umrunda? Öz eleştiri, bir programcı için yaratıcılık kadar önemlidir. Her çarkı yeniden icat etmek isteyen bir programcıdan ziyade kendi çözümlerinin çok uzun sürdüğünü veya en iyisi olma ihtimalinin düşük olduğunu bildiklerinde itiraf edecek hızlı bir programcı ile çalışmayı tercih ederim.
Rei Miyasaka,

İki noktada da hemfikirim, ancak iki farklı şeyi ölçtüğümüzü düşünüyorum. Birincisi, programcının problemleri çözme yeteneği (gerekli olduğunu düşündüğüm bir şey). Diğeri öz-eleştiridir (bunu zorunlu ama programlama için değil: yaşam için) ve kodu yargılama kabiliyeti (çok arzu edilir). Ayrıca sonsuza dek sürecek olan çözümlerin gerçekten çözüm olmadığını söyleyebilirim, değil mi? ;)
Alpha

2

Evet, yapmalı.

Kabarcık türünün ahlaki karşılığı olabilir, ama bence iyi bir programcının en azından işe yarayan bir şey bulabilmesi gerekir, ancak verimsiz olabilir.

Söylemeye gerek yok, eğer bu belirli sorun ortaya çıkarsa, iyi bir programcı önce kendisi için bunu yapacak bir kütüphane olup olmadığını ya da yayınlanmış algoritmaların bunu yapıp uygulamalarının kolay olup olmadığına bakardı.

Tabii ki, birçok programlama işi çok daha az zordur ve herkesin bu tür zorlu problemleri çözebilmesi gerekmez. Ancak ekibinizde böyle bir akla sahip olan birisine sahip olmak isteyeceksiniz, çünkü daha önceki bilimsel araştırmalara dayanamayacağınız, projeye özgü bazı problemleriniz olabilir.


1

Endişelenme

Bir Perl Programcısı olarak, tekerleği asla yeniden icat etmeyeceğim . CPAN'ın işi budur. Basit, iyi desteklenen bir algoritma veya modül varsa, onu kullanırız. İyi bir modül yoksa, o zaman biz icat tekerlek. Perl hakkındaki en büyük şeylerden biri bu.

Demek istediğim bu:

  1. Tekerleği yeniden icat etmeyi tavsiye etmiyorum ama sen ...
  2. Tamamen yeniden icat etmemeye çalış ve ...
  3. Endişelenmeyin, yapamazsanız. Bu yüzden bir programlama topluluğumuz var :-).

Yeniden icat etmekle ilgili değil, genel olarak problemleri çözmekle ilgili. Bir şeyleri kendi başınıza icat etmeye çalışmazsanız, asla iyileşemezsiniz.
Nils,

0

Grafik teorisi ve bunun için geçerli olan algoritmalar, yüzeyde basit görünüyor, ancak genellikle ondan uzak. Örneğin, ilk bakışta, çapraz olmayan (düzlemsel) grafiklerin oluşumunun basit olduğunu düşünürsünüz. Geçen yıl bu soruna yoğun baktım (Kuratowski altyazılarını ortadan kaldırarak düzlemselliği). Size, bu deneyimlerden, bu algoritmaları yazan insanların doktora çalışmalarının sürelerini genellikle harcadıklarını ve bazen de araştırmaların ekipler halinde yapıldığını söyleyebilirim. Ve araştırmacılar olarak , bu zaman zarfındaki tek çalışma odağı. Yerdeki mühendislerin de aynı şeyi bekleyebileceğini düşünmek mantıklı değil. Burada bir başkasının haklı olarak söylediği gibi, çözüm önünüzde olduğunda kör edici şekilde açıktır. Bu her zaman böyle görünüyor!


0

Bu, iyi bir programcının birkaç saat içinde yeniden icat etmesi gereken bir şey mi yoksa gerçekçi değil miyim?

En kısa yol gibi bilinen bir problem için kendi başına bir algoritma icat edebiliyorsanız, kötü bir programcı olduğunuzu söyleyebilirim .

Bu görmezden geldiğin ifade edecek Kısa Yol problemi üzerinde uzunca bir geçmişi (| V | ^ 4) Dijkstra'nın en olduğu (1984 yılında yayınlanan O (E + V günlük V) algoritmasına 1955 yılında yayınlanan ALGORITM, bir O'dan gidiyor Fibonacci ağaçları ile algoritma). Zaten tasarlanan algoritmalardan daha kötüsünü yapmanın neredeyse garantisi var. Daha da kötüsü, algoritmanızın boşluk ya da hata yapma olasılığının yüksek olması ihtimali yüksektir. Ayrıca, algoritmanızı düşünmek, uygulamak ve test etmek için varolan bir algoritmayı tekrar kullanmak için harcadığınız zamandan çok daha fazla zaman harcayacaksınız.

Algoritma tasarımını algoritma tasarımcılarına bırak. Programcılar, sonuçlarının tüketicileridir. Programcılar algoritmaları birleştirir ve onları gerçek dünyadaki görevler üzerinde çalışmaya koyar. Bir polis memuru, çalışabilmek veya iyi bir memur olmak için yasayı yeniden icat etmemelidir.

Algoritmaları orta derecede karmaşık bir algoritma için kendiniz uygulamak yerine uzmanlar tarafından yapılan uygulamaları kullanmanıza bile teşvik ediyorum. Doğru olması daha muhtemeldir, şansınız her zamankinden daha hızlı gerçekleşir ve size çok zaman kazandırır. Bu özellikle şifreleme algoritmaları için geçerlidir, çünkü genellikle yalnızca uzmanların sağlayabileceği ek güvenlik talebini alırsınız.


Şifreleme algoritmalarının bir uygulamasını doğrulamak kolaydır; Bilinen doğru test vektörleri genel olarak belirlenmiş herhangi bir algoritma için bir düzinedir ve doğru ya da değildir. (Özel bir uygulamayla daha düşük performans gösterebilirsiniz, ancak yalnızca doğruysa, üzerinde çalışılabilir.) Kriptografinin zor kısmı rasgele sayı oluşturma, işlenmemiş anahtarların düzgün kullanımı ve bellekteki anahtar genişletme tabloları gibi kullanıcı girdilerinin kullanımı (tuzlama, vb.), şifresi çözülmüş verilerin geçerli olup olmadığını çözmenize olanak sağlayacak bir şeyler saklar.
bir CVn

Zamanlama saldırıları vs. boyunca daha fazla düşünüyordum, neredeyse hiçbir programcının bilmediği şeyler. Bu her zaman bir sorun değil, yine de önemli bir konu. Ayrıca, kriptografik ilkellerin birleştirilmesi genellikle beklendiği gibi çalışmaz, bu aynı zamanda güvenliğin de zor bir parçasıdır.
Alex ten Brink,

Zamanlama saldırıları vb. Kesinlikle geçerli bir endişe olsa da (ve yalnızca kriptografide değil), bir uygulamanın buna karşı duyarlılığının doğruluğunu etkilemediğini iddia ediyorum . Ve kriptografide sadece zamanlama saldırılarını sağlamaktan daha fazla kirlenmenin birçok yolu var. Bruce Schneier, Doghouse serisini yönetiyordu ; Son zamanlarda hiçbir şey görmedim, ancak burada çok sayıda ihtiyati örnek var. google.com/search?q=site%3Aschneier.com+%22the+doghouse%22
Bir CVn
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.