Veri yapılarına ve algoritmalara yatırım yapmaya devam etmeli miyim? [kapalı]


28

Bugünlerde veri yapılarına ve algoritmalarına çok yatırım yapıyorum ve bazı programlama bulmacalarını çözmeye çalışıyorum.
Java ve Clojure ile kodlamaya ve çözmeye çalışıyorum.

Vaktimi boşa mı harcıyorum? Daha derin bilgi edinmek için daha önce bildiğim teknolojilere ve çerçevelere daha fazla yatırım yapmalı mıyım?

Veri yapılarını ve algoritmaları inceleyerek daha iyi bir programcı olacağım mı yoksa bu konular sadece üniversite yıllarında önemli mi?


5
Hangi veri yapıları ve algoritmaları ile çalışıyorsunuz? Hangi programlama bulmacalarını kullanıyorsunuz?
oosterwal

Hash tabloları, Haritalar, Yığınlar, Grafikler, Ağaçlar ve beraberindeki algoritmalar üzerinde çalışmak için henüz çalışıyorum. Yapbozlar TopCoder ve Google Code Jam yarışmalarından.
Chiron

Yanıtlar:


24

Kariyerinizin çoğunu / tamamını, yalnızca algoritmalar ve veri yapıları hakkında en az bilgiyle, önemli ve faydalı işler yaparak geçirmek tamamen mümkündür.

Asgari sırayla algoritma ve veriyapılarıdır için bilgi, düzeyi gerektirir olacak, başarılı olmak için:

  • Birçoğunun farkında olun (dışarı çıktıklarında ara sıra yenilerini okumak da dahil)
  • iyi, test edilmiş, çalışma uygulamalarını nerede bulacağını bilmek
  • Algoritmaları ve kullanışlılıklarını karşılaştırabilme
  • Açık kaynak kodlu bir örnekten, kendi ortamınıza küçük bir parça ince ayar ile doğru şekilde kopyalayabilme

Orada hiçbir * maksimum * . İsterseniz, çalışmanızı doktora seviyesine ve ötesine götürebilirsiniz. Yararı, ilgilenmek istediğiniz mesleklerle ve en ilginç ve faydalı bulduğunuz işle doğrudan ilgilidir.

Kaba (ancak mutlak olmayan) bir kılavuz olarak, daha düşük seviye, daha fazla kaynak yoğun ve daha az otomatik hale getirilmiş, üzerinde çalıştığınız dil, çerçeve ve uygulamanın otomatikleştirilmesi söz konusu olduğunda, söz konusu olduğunda gereken beceri seviyesi daha yüksek olacaktır. algoritmalar ve veri yapıları. Örneğin, Ukkonen'in algoritmasını montajda uygulamak büyük olasılıkla olacaktır, ancak zorunlu olarak, bir ustadan ilgili algoritmayı ve veri yapılarını anlama seviyesini isteyeceğiniz anlamına gelecektir.

Özel durumunuzda, Java geliştirme geçmişinden iO'lar üzerinde çalışmaya, diğer her şey eşit olmak üzere, genel algoritmalar ve veri yapıları anlayışınıza biraz daha yüksek bir talep beklersiniz. Daha az kaynak içeren bir cihazda verimli bir şekilde çalışmayı isteyeceksiniz. Ayrıca, cephaneliğinize birkaç yeni kategori eklemeyi bekleyin - en önemlisi, bellek yönetimi hakkında daha fazla bilgi edinmek istersiniz.


2
Kesinlikle katılıyorum. Neredeyse hiçbir zaman doğrudan algoritmalarla uğraşmam gerekmiyor çünkü ihtiyaç duyulanların büyük çoğunluğu zaten temel kütüphanelere dahil edildi. Ancak, belirli bir kullanım durumu için uygun algoritmayı veya yapıyı seçecek kadar performans özelliklerini anlamadım, başım belaya girer. OP, algoritmalarda çalışmak istemediğiniz sürece, diğer kütüphaneleri ve araçları ve teknikleri öğrenmek için harcadığınız zaman için çok, çok , çok daha iyi bir yatırım getirisi elde edebilirsiniz .
quentin-starin

1
Ukkonen'in algoritmasını Python'a yazmak yeterince zordur, hatta bunu mecliste yapmayı hayal etmeye başlayabilirim.
rjzii

2
Bu, "algoritmaları karşılaştırmak" noktasında yer almaktadır, ancak ben sadece uzay ve zaman karmaşıklığı arasındaki dengeyi bilmeniz gerektiğini açıklamak istedim. Hızları nedeniyle masaüstlerinde yaygın olarak kullanılan birçok algoritma, iOS'ta mümkün olmayabilir, çünkü büyük veri yapıları gerektirir.
Karl Bielefeldt

3
Katılmıyorum. Basit sebep, birileri Algoritmalar veya Tasarım veya Mimari öğrenmek için zaman harcadığı zaman, sadece onu ne zaman / nerede kullanacağı ile ilgili değildir. Bu sadece kişiyi daha akıllı yapar ve öğrenmeyi başka problemleri çözerken de kullanabilir. Ayrıca işleri en iyi şekilde yapma duygusunu da teşvik eder. Örneğin her şey için el yapımı bir Algoritma olmayabilir, ancak birçok şey bildiğinizden, kendi başınıza istisnai bir şeyle gelebilirsiniz.
Geek

14

Hayır. Eğer daha yeni başlıyorsanız, UI programlama gibi büyük resme girmeye çalışıyorsanız, bu da sizi geri tutar. Sonunda oraya gitmeniz ve daha büyük çerçeveleri öğrenmeniz gerekiyor ... DİĞER kişilerin yazdığı veri yapılarını ve algoritmaları nasıl kullanacağınızı. Yeni başlıyor olsanız da, sınırlı kapsam sorunlarına bağlı kalmak iyidir.

Algoritmalar ve veri yapıları temelde her şeyin temelidir, ancak başlangıç ​​aşamasını geçtikten sonra muhtemelen kendinizden birini asla yazmazsınız. Onları tanımak veya en azından onları tanımak, sonunda sizi daha iyi bir geliştirici yapacaktır. Her birini ne zaman ve neden kullanacağınızı bileceksiniz çünkü NASIL çalıştıklarını bileceksiniz. Ayrıca, algoritmalarınızı ve veri yapılarınızı genel hale getirmek için X arayüzüyle herhangi bir tür veya türle çalışabilmelerini sağlamak, gerçekten kariyerinizin geri kalanında kullanacağınız bir şeydir.

Qt gibi şeylerle uğraşan çok fazla insan görüyorum, sonuçta C ++ hakkında sıfır bilgi gösteren sorular soruyorlar (örneğin). Çok fazla adımı atlamaya çalışıyorlar ve sonunda öğrenmeleri daha uzun sürüyor. Doğru yolda olduğunu söyleyebilirim.


Java programcılığını profesyonelce yapıyorum (demek istediğim gibi) 2007'den beri.
Chiron

9

Vaktini boşa harcamıyorsun.

İşinizde, daha önce kullanmadığınız bir araç veya çerçeveyi kullanmanız gerekirse, onu öğrenir ve kullanırsınız.

Ancak, daha önce kullanmadığınız bir veri yapısını veya algoritmasını kullanmanız gerekiyorsa, onun var olduğunu bile bilmiyor olmanız muhtemeldir ve sorununuzu bir demet daha fazla alan bazı korkunç alt-optimal teknik kullanarak çözeceksiniz. çaba ve korkunç ölçekler.

Söylemeye çalıştığım şey, bu sadece yaparak yaparak öğrenmeyeceğiniz türlerdir, bunu akademik bir ortamda ya da sizin gibi kişisel bir emek yatırımı ile öğrenerek öğrenmeniz gerekir. şimdi yapıyor.


6

Uygulamada, mevcut veri yapılarının ne olduğunu, karmaşıklık özelliklerinin neler olduğunu, bunların nerede iyi bir şekilde uygulanabileceğini ve Algoritmalara Giriş kopyasını daha sonra aramak için nerede sakladığınızı unutmayın .


1

Seni mutlu eden şey buysa, kesinlikle buna sadık kalmalısın. Eğer endişeleniyorsanız, yeterince teori uygulamadığınızdan, teori ağırlıklı bir proje düşünün. Sıfırdan, İksir gibi küçük bir programlama dili oluşturun . Tam bir uygulama Hash tablolarını, Graphs, Trees ve geniş bir algoritma dizisini kullanacaktır. İlginç görünüyorsa, optimizasyona, yerel kod üretimine veya kullanıcı genişletilebilirliğine daha derine dalabilirsiniz.

İlgilendiğiniz ve odaklandığınız zaman daha pratik bir programcı olacaksınız, pratik görünen projeler üzerinde değil, biraz sıkıcı.

Tavşan deliğinden aşağı, Dorothy!


1

OpenGL ile C / C ++ 'da dolaşarak çok fazla zaman geçirdim. Dilleri ve API'leri yeterince iyi tanıyorum ... ve bu deneyim yüzünden makul bir geliştirici ve programcı oldum. Bu, karşılaşılan çeşitli sorunları çözmek için gereken gerçek algoritmik bilginin sadece gerçekten kavrayabildiğimi söyledi.

Kişisel deneyimlerden bahsetmişken, uygulama yapmaya odaklanmak, inşa etmeye çalıştığınız şeyle ilgili sorun alanlarının arkasındaki teoriyi bilmiyorsanız, zamanınızı boşa harcar.

Pek çok farklı yazılım türü için, bu alanlar kendi spesifik niş-temelli teorilerine ek olarak algoritmaları inceleyerek öğrendiğiniz temellerden kaynaklanacaktır (örneğin, bilgisayar grafiklerinde doğrusal cebir, kriptografide sayı / bilgi teorisi, vb.).

Her şeyin ardında hesaplamalı bir büyücü olmak zorunda değilsiniz, ancak bu görev sırasında yaptığınız şeyi yapmak, bir kişinin programlama yolculuğunda en az bir kere inmek için çok, çok gerekli bir yoldur. onlar kendi kendine öğretilmez.


0

Sanırım onları iyi tanımıyorsan, onları kullanmak için sebep bulamazsın. Her zaman onlar için faydalar buluyorum. Fakat şunu itiraf etmeliyim ki, son yarım düzine yıldaki jeneriklerde meydana gelen gelişmelerle birlikte, kendi yuvarlamanızın gereği daha az sıklıkta ortaya çıkıyor. Bu, nasıl ve ne zaman kullanılacağını bilmenin faydalarını ortadan kaldırmaz ve aksi takdirde karmaşık kodları büyük ölçüde basitleştirebilirler.

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.