Veri yapıları görüşmelerde neden bu kadar önemlidir? [kapalı]


106

Üniversiteden mezun olduğumda veri yapılarında o kadar güçlü olmadığımı itiraf etmeliyim. Mezuniyet sırasındaki kampüs yerleşimleri boyunca, Amazon, Microsoft vb. Gibi büyük teknoloji şirketlerinin çoğunun, çoğunlukla veri yapılarına odaklandığını gördüm. Veri yapıları mezunlardan bekledikleri tek şeymiş gibi görünüyor.

Dürüst olmak gerekirse, bu konuda kendimi kötü hissettim. İyi kod yazarım. Kodlamanın standart tasarım desenlerini takip ediyorum, veri yapılarını kullanıyorum, ancak Java ile ArrayList, LinkedList gibi API'lerde olduğu gibi yüzeysel düzeyde kullanıyorum. Ancak şirketler genellikle göstergeye dayalı bellek manipülasyonu ve zaman karmaşıklıkları gibi Veri Yapıları'nın karmaşık yönlerine odaklandılar.

Muhtemelen Java arkaplanım nedeniyle, o zamanlar, kod verimini ve mantığını sadece nesneler, örnekler gibi Nesneye Yönelik Programlama açısından konuşulduğunda anladım, ancak bit ve bayt seviyelerine hiç girmedim. Veri Yapılarımdaki bu bilgi açığı için insanların bana bakmalarını istemedim.

Öyleyse gerçekten neden tüm bu veri yapılarına vurgu yapıyor?


36
Gerçekten sorunuzu anlamadım. "İyi kod yazıyorum" diyorsunuz - veri yapıları iyi kodun bir parçası olamaz. Ve, samimi bir görüşmecinin, onlara aşırı derecede takıntılı olacağından şüpheliyim.
treecoder

6
@greengit: Bir karma haritasını uygulama ile API'sini kullanma arasında bir fark var. Bir röportajda değer vereceğim, benim için bir başvuru açıklarlarsa, merkezi veri yapılarını oluşturmamı ve seçimlerimi açıklamamı istediler.
György Andrasek

7
Ne sorulmasını tercih edersiniz?
temptar

13
@Jurily - Bir konteyner kütüphanesinin ne zaman kullanılacağını anlamak, altta yatan veri yapısının nasıl çalıştığı hakkında biraz bilgi sahibi olmaya yardımcı olur. Kullandığınız kütüphanelerin zaman ve mekan karmaşıklıklarını bilmiyorsanız, kodun verimliliği hakkında bilgi sahibi olduğunuzu kabul etmek zor - sadece küçük test veri kümelerinde iyi çalıştığı için, daha büyük veri kümelerine iyi ölçekleneceği anlamına gelmez gerçek dünyada. IMO, zaman ve mekan karmaşıklıklarını anlamak, sınıf ve yöntem adlarını bilmek kadar API'yi anlamanın bir parçasıdır - belki de daha doğrusu, intellisense size karmaşıklığı anlatmayacak.
Steve314

2
İyi bir veri yapısı temiz ve basit kodlar verir. Kötü bir veri yapısı karmaşık kodlar verir. Doğru olmak önemlidir.

Yanıtlar:


121

Microsoft gibi büyük teknoloji şirketlerinin çoğu temel olarak veri yapılarına odaklanmaktadır. Veri yapıları mezunlardan bekledikleri tek şeymiş gibi görünüyor.

Hayır, dahası var. Örneğin, aynı zamanda size kısa bir miktar içinde yeni çerçeveler, API'ler ve hatta programlama dilleri öğrenebilir hızlı bir öğrenci olmasını bekliyoruz. Çıplak asgari bir çubuktur. Yeni bir çerçeve, API veya dil öğrenmek için uzun zaman alan biri, Microsoft'taki çoğu ekipte başarılı bir geliştirici olmayacaktır.

Ve elbette, veri yapılarının ham bilgisinden başka görüşmelerde odaklandığımız daha birçok konu var. Belirsiz özelliklerle başa çıkma yeteneği, örneğin, güvensiz kod üreten kodlama modellerini veya bir düzine başka şeyi tanıma yeteneği. Ancak veri yapılarını anlama yeteneği kesinlikle çok büyük bir tanesidir.

Öyle özellikle görüşmeler son CS mezunlarının veri yapılarının test bilgisi doğru eğilimli olmaktadır olgusu. Birçoğu gerçek dünya deneyimi olmayan yeni mezunların, on beş yıllık endüstri deneyimine sahip birisinin iyi olacağı şeylerle iyi olması beklenmemektedir.

İtiraf etmeliyim ki, veri yapılarında o kadar güçlü olmadığımı

Kendin hakkında bunu bilmen güzel. Bunu kendinizle ilgili olarak değiştiremiyorsanız veya istemiyorsanız önerim, veri yapıları olan tesis gerektiren bir işe başvurmamanızdır.

Bu genel bakış açısı iyi bir programcının mutlaka veri yapıları hakkında iyi bilgisi olan bir kişi olduğu yönündedir.

İyi bir programcının, inşa edilmesi gereken çeşitli programları oluşturmada iyi olan bir programcı olması tatolojiktir. Birçok programcı, veri yapıları hakkında derinlemesine bilgi gerektirmeyen işler üzerinde çalışır. Bazıları, örneğin, kullanıcı arayüzü tasarımı hakkında derinlemesine bilgi gerektiren görevler üzerinde çalışır. Veya veritabanı normalleştirmesi. Ya da her neyse. Bu insanlar hala kendi alanlarında "iyi programcılar" olabilir.

neden tüm bu veri yapılarına vurgu yapıyor?

Veri yapıları hakkında röportaj soruları soruyorum çünkü ekibimde geliştiriciler her gün karmaşık veri yapılarını tasarlıyor, uyguluyor ve yönetiyor. Dün yarım düzine geliştiricinin belirli bir ağaç düğümüne tek Boole alanı eklemenin artılarını ve eksilerini tartıştıkları dört saatlik bir toplantı yaptık. Muhtemelen ekibimde veri yapılarını derin bir seviyede anlama yeteneğinden daha önemli bir beceri yoktur. Yaptığımız şey bu olduğundan röportajda soru sormamak aptalca olurdu.

Veri Yapıları hakkında bilgi sahibi olmak, birinin programlamadaki kariyerini gerçekten etkilemiyor mu?

Bu kesinlikle benim takımımda iş bulmanızı önleyecektir. Ama daha önce de söylediğim gibi, programlama çok büyük bir alandır. Veri yapıları hakkında bilgi gerektirmeyen birçok bilgisayar programı vardır.

iyi ve kötü bir programlayıcıyı ayırt etmek için bu konudaki bilgi gerçekten yeterli mi?

Hayır. Ancak Microsoft'ta başarılı olamayacak geliştiricileri tespit etmek neredeyse her zaman yeterlidir. Öncelikle tespit etmekle ilgilendiğim şey olduğundan, veri yapılarının bilgisi görüşmelerde test ettiğim faktörlerden biri.


10
Bir ton Eric teşekkürler! Sorum için aldığım en utanç verici cevap bu. :-)
Vamsi Emani 18:11

2
@EricLippert, bu mükemmel cevap için teşekkür ederim. Resmi veri yapıları konusundaki resmi bilgi birikiminden dolayı henüz ısırılmamış, kendi kendini eğiten bir geliştirici olarak, bana ne kaçırdığımı gösterebilecek bir kitap tavsiye eder misiniz?
Kapanış Kovboy

5
@ Cowboy: Veri yapılarının ve algoritmaların temelleri için, Cormen, "Leeserson ve Rivest tarafından" Algoritmalara Giriş "standart ders kitabıdır. İşlevsel stil veri yapılarıyla ilgileniyorsanız, Chris Okasaki'nin kitabı çok iyi ama oldukça gelişmiş.
Eric Lippert

2
@ClosureCowboy Princeton tarafından sunulan Kursra 'Algoritmaları I' kursunu inceleyin. Ben de kendi kendine öğrenen bir programcıyım ve CS teorisi bilgisindeki boşluklarımı doldurmaya yardımcı olmak için çok şey yapıyorum.
Evan Plaice

133

Veri yapıları hakkındaki önemli noktalardan biri, evrensel ve zamansız olmalarıdır, en azından pratik amaçlar için. Son 30 yılda geliştirici olan herkes, tek / çift bağlantılı listeler, ikili ağaçlar veya grafikler gibi temel veri yapılarını bilmelidir. İki geliştiriciye onlar hakkında soru sorarsanız, geliştiricilerin bilgilerini cevaplarıyla karşılaştırabilirsiniz. Bu, çerçeveler ve hatta diller için söylenemez: Rails hakkında iki geliştiriciye sorarsanız, biri diğerinden çok daha fazla şey biliyorsa, bu size ne anlatıyor? Soruda söylediğiniz gibi, akıllı bir geliştirici yeterince hızlı bir şekilde yeni bir çerçeve öğrenebilir, bu nedenle mevcut bilgilerini test etmek pek mantıklı gelmiyor.

Veri Yapıları hakkında bilgi sahibi olmamak, bir kişinin kariyerini programlamada gerçekten etkiler mi?

Evet. Kesinlikle. Bütün hayatını CRUD uygulamaları yazarak geçirmek istemiyorsan.

Yoksa bu konudaki bilgi, iyi ve kötü bir programlayıcıyı ayırt etmek için gerçekten yeterli bir temel midir?

Hayır, yeterli değil. Ancak bir iş görüşmesinde yeterli olabilecek bazı şeyler var. Ve algoritmaların bilgisinin, en azından okuldan yeni çıkanlar için iş tecrübeleri hakkında soru soramayacağınız en iyi göstergelerden biri olduğunu söyleyebilirim.


Küçük bir nitpick, veri yapılarının kendi başına zamansız olduğunu söyleyemem. Günümüz donanımıyla ilgili sorunların çözümü için birçok yapı modellenmiştir. Örneğin, aramayı dosya sayfalarında optimize etmek için bir B + Ağacı kullanıyoruz, ancak temel donanım değişiyor. Belki de SSD'ler farklı algoritmalar gerektirebilir, ya da RAM erişimine disk io'dan daha fazla taşınırken. Yani algoritma kendi içinde "zamansız" olsa da, onun yeri ve amacı değil
Homde

3
@konrad: "Pratik amaçlar için" derken bunu kastediyorum. "Eski" olan bir veri yapısı ya da algoritması düşünemiyorum ve bir iş görüşmesinde göreceğinizden şüpheliyim. Çoğu algoritma / veri yapısı mevcut donanımımızdan çok önce geliştirildiğinden ve hala faydalı olduklarından, yeni donanım gelişmelerinin bildiğimiz veri yapıları tarafından yönlendirildiği bir tür coevolution olduğunu tahmin ediyorum.
nikie,

Eğer / eşzamanlılık fiilen zorunlu olduğunda, modası geçmiş olan birçok veri yapısını düşünebilirim :)
Homde

9
@konrad: Ve eğer / kuantum bilgisayarları standart hale gelirse, birkaç tane daha düşünebilirim. Fakat OP'nin o zamana kadar yaptığı iş görüşmelerinde beklemek istemediğini farz ediyorum ;-)
nikie

3
... ya da yeni yapay
zekamızın

45

Ben hızlı bir öğreniciyim ve çok kısa sürede yeni çerçeveler, API'ler ve hatta programlama dilleri öğrenebilirim.

Çok sert görünmemekle birlikte, yarı saygın bir geliştirici, nispeten kısa bir sürede yeni bir dil veya çerçeve seçebilecek.

Veri yapıları evrenseldir, bilgisayar biliminin temel bir yapı taşıdır - kırmızı-siyah bir ağaç temelde aynıdır, ister Java, Python, PHP, ne de başka bir şekilde uygulanmışsa. Bu nedenle, belirli dilleri veya belirli çerçeveleri test etmek yerine, bir işveren (en azından göze çarpan geliştiriciler arayan bir işveren), hangi ayın tadı olursa olsun, bilgisayar biliminin temellerini bilip bilmediğinizi test edecektir. şu anda kullanıyorum.

(en azından, şu anda kullandıkları şeye ek olarak temelleri test etmeliler ... hayatında hiç bir kod satırı yazmamışsa, bir bilgisayar bilimi sihirbazını işe almanın bir anlamı yok)


1
Bilgisayar bilimi buradaki anahtar kelimelerden biridir. Veri yapıları genellikle yüksek lisansta derinlemesine görülür ve görünüşte önemli bir konudur.
James P.

1
Veri yapıları tamamen işlevsel programlama ile bağlanıncaya kadar evrenseldir: P.
Tikhon Jelvis

30

Buna inanıyor musunuz F1 yarışçılar sadece sürücü hızlı arabalar? Hayır, kullandıkları arabayı anlıyorlar ve ayarlamak için tamirciler / mühendislerle çalışıyorlar. Tabii ki, normal bir sürücü sadece kullanıyor.

Sadece kod yazan normal / ortalama bir programcı olabilirsiniz . Arkasında ne olduğunu anlamıyorsun. İşleri halledersin. Hepsi bu, ertesi gün görüşürüz.

Ancak birçok şirket F1 geliştiricilerini arıyor. Kodlarının arkasında ne olduğunu bilerek gelişecek insanlar. Aynı zamanda şirketin daha iyi bir şeyler yapmasına yardımcı olacak insanlar.

Veri yapılarını bilmek oldukça iyidir, çünkü onları "önceden pişirilmiş" biçimde çok kullanacaksınız. Aynı zamanda iyi çünkü fikirlerinden türeyen bir şey yaratacaksınız.



Öyleyse bekleyin, programcı olma ile arabayı kullanmadan önce yakından tanıma alışkanlığım arasında bir korelasyon olduğunu mu söylüyorsunuz?
Robbie

@Robbie: +1 LOL Bir şeyleri sökmeyi sever misiniz?
graffic

2
Evet. Babam bana nasıl bir şeyi ayırmayı öğretti . Bana nasıl bir şeyleri bir araya getireceğimi öğretmeyi ihmal etti, bunu tüm hayatım boyunca çözdü.
Robbie

17

Veri yapıları konusundaki sınıfımda profesörün ilk söylediği şey şuydu: Bu sınıf gerçekten hızlı arama yapmakla ilgili değil. Daha sonra yarım yıl harcadık ve gerçekten hızlı arama yapılabilecek en iyi veri yapılarını ve algoritmaları bulduk.

Yine de haklı kaldı. Veri yapılarını analiz edebilmek, doğru veri yapısını verilen bir probleme uygulayabilmek veya yeni veri yapılarıyla gelebilmek bir mühendisin birçok niteliğini gerektirir:

  • Somut bir problemi modellemek için soyutlamalar bulmak
  • Problemleri parçalayabilmek
  • Mantıklı / formel olarak akıl yürütme
  • Yaratıcılık
  • vb.

Amazon ve Microsoft insanları işe aldıklarında veri yapıları hakkında sorular sormazlar çünkü bir sonraki hızlı bağlantı noktasını icat etmeyi ummaktadırlar . Yukarıda belirtilen özelliklere sahip birini işe aldıklarından emin olmak istiyorlar.

Tabii ki bu niteliklerin büyük bir setine sahip olmak ve hala veri yapılarını emmek mümkündür. Fakat öyleyse, durum buysa, veri yapılarında uzman olmanız uzun sürmez.


Olduğu söyleniyor, hala ArrayListoldukça ölçeklemeyen bir sorun var . Sistemler büyüdüğünde, işi gerçekleştirmek için daha iyi uyarlanmış çözümler gerekir. Ve iyi bir veri yapıları olmadan, somut senaryonuzda büyük ölçüde ölçeklenen yapıları ve algoritmaları bulamaz ve oluşturamazsınız.


3
Bununla ilgili olarak ArrayList, veri yapılarını iyi bir şekilde anlamadıkça , bunun oldukça ölçeklendirilmediğini bile farkArrayList edemeyebilirsiniz ve ölçeklenen yapıları ve algoritmaları bulmanız ve oluşturmanız gerekir.
phoog

12

Genel olarak algoritmalar ve veri yapıları programlamadaki en "sert çekirdekli" konulardan biri olarak kabul edilir. Bunun nedeni, bilgisayar bilimlerinde bunlarla ilgili çok büyük bir çalışma ve araştırma bütünü olmasıdır. Ayrıca, matematik ve bilim gibi şeyleri seven (ki bir sürü programcı olan) tipik "sol lob" programlayıcılarını çekiyorlar.

Bununla birlikte, bunların bilgisi, kariyerinizi, özellikle google gibi mühendislik odaklı işyerlerinde röportaj yapıyorsanız, mülakatlar açısından etkileyebilir. Ancak şimdi diğer şirketler bu yönü önemsiyor olabilir.

Tecrübelerime göre algoritma / veri yapısı talepleri bazen alfa geek'lerin en zeki olduğunu göstermek için jokeyleştikleri "programcı seçkinliği" olarak karşımıza çıkabilir. Dışarıda ne olduğunu bilmek her zaman iyidir, ancak kırmızı / siyah bir ağaç kullanmayı veya boylamacı bir aramayı kodlamayı asla bilmek zorunda kalmayacağınız birçok farklı programlama işi vardır.

Onları ilginç bulursanız ve onlarla ilgilenebileceğiniz bazı kişisel projeleriniz varsa, konular hakkında daha fazla bilgi edinmenizi öneririm, aksi halde şimdilik onlar olmadan başlayabilirsiniz

PS. İle Yeterlilik temel veri yapıları (bağlı listeler, sözlüklere, karışık tablolar gibi) herhangi bir programcı DS için zorunlu bir bilgi olmalıdır.


7

Öyleyse gerçekten neden tüm bu veri yapılarına vurgu yapıyor?

İki sebep.

Birincisi, problemi spesifik bir programlama dili yerine soyut terimlerle düşünebileceğinizi göstermektedir. Bir karma tablonun neden belirli bir uygulamada kırmızı-siyah bir ağaçtan daha iyi veya daha kötü bir seçim olabileceğini biliyor musunuz ?

Bir başka açıdan, bir orada korkutucu orada sadece işlerle insanların sayısı yalan tecrübeleri hakkında ve herhangi bir programlama yeteneği varsa çok az var; veri yapılarıyla ilgili sorular, bu insanları ayıklamanın hızlı bir yoludur.


Burada tartışmalı olabilecek bir fikir sunacağım. Bir veri yapısının veya diğerinin neden verimlilik ve performansa bağlı olduğu sorusu . Geliştiricilere yapmamaları için ne söylüyoruz? Erken optimizasyon yok! Veri yapısı seçiminin performans sorunlarına yol açtığını bilmediğiniz sürece , seçme 'hakkı' en aşina olduğunuzdur. Başka bir karar erken optimizasyon ve bu nedenle de kötülük!
Tom

2
Sağ veri yapısı Toplamaya ön uygulanabilirliği göre ve beklenen performans özellikleri , bağımsız bir şekilde, altta yatan uygulama olduğu olmayan erken optimizasyonu için bir örnek.
John Bode

İkili öbek üzerinde fibonacci öbek toplama işlemi yapılabilir. Yığın vs listesini kullanma (yığın uygun olduğunda) değildir.
user470365

5

Onlar temeldir, ama aynı zamanda, ne için mezun olursun? Kurs çalışmaları dışında deneyim sahibi olabilirler veya olmayabilirler. Kursları, Microsoft'tan Java teknolojisinden daha fazlasını ya da tam tersini içerebilir. Veri yapıları ortak zemindir.


Başka bir öğrencinin sınavını bitirmek için +1, çünkü bütün mezunların bildiklerini bilmesi gereken başka bir şey yok .
Ian

4

Çoğu zaman en iyi kod düşük seviye veri yapılarını yeniden icat etmekten kaçınır. Bu, özellikle yüksek seviyeli dillerde geçerlidir. CRUD işlerinde bile düşük seviye veri yapısı sorularına doğru bir eğilim olduğunu fark ettim. YMMV, ancak korsan bilim adamının uzmanlığına yapılan vurgunun büyük bir geliştirici yapan diğer becerileri gölgelediği görülüyor:

  • proje / zaman yönetimi:% 1 daha hızlı çalışan yeni bir bağlantılı liste değil, iş dünyasının gerçek dünyasına ayak uydurabilmek.
  • Asgari miktarda sosyal beceri: Kibirli ve geçinemeyen bir geliştirici, çapadan başka bir şey değildir.
  • hızlı ve sürekli yeni şeyler öğrenme yeteneği: veri yapıları yıllar içinde neredeyse hiç değişmiyor ... ama her şey var. Veri yapıları büyük temellerdir ve her geliştirici onları oldukça iyi tanır, ancak bir muhabir görüşme yapmak için girdiklerinde uzun bölüm becerilerini test etmez. Büyük geliştiriciler, yeni şeyler keşfedebilen ve sevebilen insanlardır.

Veri yapıları harika. Veri yapıları önemlidir. Her programcının onları anlaması gerekir. Ancak, bu temelleri kendi yerlerinin dışına itmek konusunda takıntılı olduk. Veri yapıları hakkında TÜM değildir ve vakaların% 99'unda veri yapılarının temellerinin ötesinde sorular sormaya gerek yoktur. Bir muhasebeciyle görüşüyorsanız, 9'a bölünen 81'in ne olduğunu kesin olarak söyleyin, ancak "98425454242412 * 4512324'ün küp kökü nedir?" o zaman sahip olabileceğiniz makul, akıllı, yetenekli ve hoş insanlardan yüzde yüzünü korkutuyorsunuz. Temel bir ilişkisel veri modeli yapıp yapamayacaklarını sorun, ilgili çerçeve tarafından sağlanan gelişmiş dizi yapılarını kullanıp kullanamadıklarını sorun, ve ikili aramanın düz aramaya göre daha hızlı olduğunu açıklayıp açıklayamayacaklarını sorun; Bu şeyleri yapabiliyorlarsa, en güzel, en profesyonel, en yaratıcı olanı aramaya başlayın.

Joel'in yazdıklarını seviyorum, ama onun "Java Okulları" olayının yanlış olduğunu düşünüyorum. C ++ 'da ustalaşmanın ötesinde birisinin akıllı olduğunu kanıtlayabilecek pek çok şey var. Bir düşünün, 10 dakika boyunca birisine onlarla konuşabilirsiniz, onlara işaretçi aritmetik hakkında soru sormadan ve şeyleri halledebilecek ve yapabilecekleri tipte olup olmadıkları hakkında iyi bir fikir edinebilirsiniz. Böyle olmamıza gerek yok:

Röportajcı: "Bana başarılarından bahset."

Kodlayıcı: "Son görevimde, milyar dolarlık bir finans firması için özel bir ERP sisteminin tek geliştiricisiydim. Programın ilerisinde aylar geçirdik ve sistem son 3 yıldır üretimde."

Röportajcı: "Açıklığa kavuşturmama izin ver. Programlamadaki başarılarından bahset. "

Kodlayıcı: "Umm ..."

Röportajcı: "Örneğin, hiç kendi bağlantılı listenizi yaptınız mı?"

Kodlayıcı: "... [yürüme]"


İlginç - iyi liste. Buna biraz daha farklı bakmaya ne dersiniz? 1. proje / zaman yönetimi: işleri, veri yapıları görüşme zamanının sadece küçük bir kısmını boşa harcayacak şekilde hazırlayabilmek. 2. Asgari miktarda sosyal beceri: Görüşme yapanların daha ilginç alanlara geçmeden önce genellikle temel veri yapılarını hızlıca kontrol etmek istediğini anlayabilen bir geliştirici . 3. Veri yapılarına ilişkin temel bilgilerin eksik olmasından kaynaklanabilecek rahatsızlıklar olmadan hızlı ve sürekli yeni şeyler öğrenme yeteneği .
gnat

@gnat - Bu da iyidir. Sanırım ne elde edeceğim, temelleri en derinlemesine anladığımın, belirli bir noktadan geçen genel yetenekle konuşmadığı, ancak tam tersini varsayma eğiliminin olduğu. Veri yapıları çoğu insanın bir başkası (genellikle bir öğretmen) tarafından öğretildiği bir şeydir. Kendi başlarına ne öğrenebileceklerini bilmek istiyorum, çünkü gerçek dünya böyle işler. İyi programcılar, en iyi uygulamalara dayalı makul sistemler tasarlayabilir. Büyük programcılar, korkunç programcılar tarafından yazılmış çılgın sistemleri, en kötü uygulamaları kullanarak öğrenip çalıştırabilirler.
Morgan Herlocker

1
ERP sisteminde çalışan adamın takım için uygun olmadığını hayal edebiliyorum.
Christopher Mahan

4

İyi bir programcı olmak, dilleri ve çerçeveleri öğrenmekle ilgili değildir. Karmaşık problemlere çözümler üretebilmekle ilgilidir. Bu çözümlerin verimli ve güvenilir olması neredeyse her zaman iyi algoritmalara ve veri yapılarının uygun kullanımına bağlı olacaktır. Var olan veri yapılarını bilmek yeterli değildir. Veri yapılarının problem için doğru olanı kullanmaya yetecek kadar olduğunu anlamanız gerekir. Listeler ve haritalar bazı değerli özellikler sunar, ancak maliyetle gelirler ve yanlış olanı kullanmak yazılımınızın performansını önemli ölçüde azaltabilir.

İyi bir görüşmeci bunu bilir ve ekibi veya şirketi için değerli olup olmayacağınızı belirlemeye çalışır. Bundan 2 yıl sonra kullanacağınız dil (ler) çok farklı olabilir, ancak etkili algoritmalara ve veri yapılarına olan ihtiyaç değişmeyecektir.


2

Veri yapıları, zaman karmaşıklığı, bellek kullanımı ve işaretçiler, kendilerini Bilgisayar Bilimcisi olarak adlandıran birinin bilmesi gereken temel unsurlardır. Herhangi bir kod maymunu bir dili öğrenebilir ve nasıl kullanılacağını öğrenebilir, ancak CS uzmanlarının ve öğrencilerin kendilerini ayrı tutmaları gereken yerler, yalnızca bağlantılı bir listeyi veya karma haritayı kullanmayı değil, aynı zamanda NEDEN bilmektir.

NEDEN, bizi temel senaryo kiddie, code monkey ve bilgisayar dünyasının hırıltılarından ayıran şey. Niçin bağlantılı bir liste yerine bir karma tablo kullanmalı, NEDEN karma tablom yaklaşık kabaca bir küme yoğunluğunda olmalı .6-.8, NEDEN burada iki kat bağlantılı bir liste yerine dairesel olarak bağlı bir liste kullanmalıyım. NEDEN kodum en kötü durumda 'x' ve ortalama durumda 'y' veriminde çalışıyor olmalıdır.

Bu temel veri yapıları ve sadece NASIL kullanıldığının (her programcıda nasıl olması gerektiği gibi) nasıl kullanıldığına ilişkin bilgi değil, aynı zamanda bu durumlarda aradıklarından daha fazla olma eğiliminde olan WHY'nin kullanıldığı agnostik dili.

Pek çok yer, kodu size aşina olduğunuz bir dilde yazmanızı sağlayacaktır, ancak bu daha genel bir durumdur, C'nin gerçekten programlama dünyasının dil frangı olmadığını görünce, ve sözde kodun yapılandırılması karmakarışık olabilir. yerde ve, çoğu durumda sahte kod / p & p kodunun gerçekten öğretilememesi, başa çıkmak imkansız.


0

Veri yapıları tüm programların temel dayanağıdır. Bunları derinlemesine anlamak zorunda değilsin, ama nasıl çalıştıklarını kesinlikle bilmelisin.

Neden? Çünkü tüm kodunuz verilerle etkileşime giriyor ve bunları işler. Veri seti bir yapı içinde saklanamıyorsa, kullanılamaz. Veriler bir evin yapı malzemeleri gibidir. Bir yapıya koyana kadar, sadece işe yaramaz bir tahta yığınınız var.

Veri setinizi nasıl düşüneceğinizi ve tanımlayacağınıza karar verdikten sonra , ikiliyi klasik algoritma kısmı olan şeyleri yapmak için kullanmaya başlayabilirsiniz. Yazdığınız her program bir veri yapısı kullanır, ancak çoğu durumda bu yapı neredeyse varolmayacak kadar basittir. Durum verileri için birkaç değişken var ve bitti!

Önemsiz programların ötesine geçtiğinizde, hemen hemen her şey bir veri yapısı gerektirir. Hangisini tercih edersiniz, gökdeleninizi en iyi uygulamalar ve matematikle tasarlayan profesyonel bir mimar mı yoksa hemen inşa etmeye başlayan joe amca mı?


-2

Ne inşa etmek @Pelshoff diyor , bu ne yaptığınızı biliyoruz göstermektir. Eğer her şey için LinkedList kullanıyorsanız, bu ne yaptığınızı bilmediğinizi veya problemi durdurmak ve düşünmekle ilgilenmediğinizi gösterebilir. Bunun üzerine, en azından aldığım veri yapıları dersini, büyük veri setleriyle uğraşırken çok önemli olan bu veri yapılarının temel karmaşıklık teorisini ele aldım. Amazon veya Microsoft gibi şirketlerin böyle bir şey yapmasının nedeni budur.

Söylemeliyim ki, bir veri yapı sınıfına girmeden önce, önemli olmadıklarını, ancak en azından bağlantılı bir liste (veya ArrayList) pratik olmadığında veya bunların geri çekilmesinin ne kadar önemli olduğunu belirleyebildiğini belirleyebildiğimi düşündüm.


"Her şey için LinkedList kullanıyorsanız, bu ne yaptığınızı bilmediğinizi gösterebilir" veya bir Lisp programcısı olduğunuz için :-)
Peter Alexander

@Peter - o zaman ne yaptığımı bilmediğimi ispatlayacaktım! ;)
Jetti

Bu , silinen yanıtla ölü bir bağlantıya dayanıyor gibi görünüyor - okuyucular için oldukça kafa karıştırıcı. Bununla ilgilenmek için düzenlemeyi düşünür müsün?
gnat

-2

İyi kod yazıp yazmaman öznel bir ifadedir. İşlevsel kodun her zaman iyi kod oluşturmadığını bilmek önemlidir.

Bununla birlikte, veri yapıları önemlidir, çünkü programcı olarak yönlendirdiğiniz perde arkası işçileri gibiler. Yaptıklarını gerçekten anlamadan bir yapıdaki yöntemleri çağırabileceğiniz ve verilerin gerçekten nasıl depolandığını elde etmeden bir yapıdan yararlanabileceğiniz doğrudur, ancak bu ayrıntıların bilinmesi, bir yapıyı kullanmak için uygun olduğunda sizi daha iyi hazırlayacaktır. bir diğeri.

Örneğin, her iki yöne iki kat bağlantılı bir listeden geçebileceğinizi ve yalnızca tek bir bağlantılı listeden ilerleyebileceğinizi bilmek, veri depolanırken hangi yapının önemli olduğunu belirlemenize yardımcı olabilir. Tek başına bir listenin bellek tüketimi açısından potansiyel olarak daha düşük bir ek yüke sahip olabileceğini bilerek daha da fazla bir eğitim kararı verebilirsiniz (çünkü önceki öğelere işaretçiler içermez), yalnızca bir listeyi ilerletmek zorunda kalırsanız Uygun bir yapı kullanarak hafızada bir miktar hafıza tasarrufu yapabilirsiniz.

Bunlar sadece küçük örneklerdir ve nihayetinde, kariyerinizde veri yapılarını bilmeden iyi yaptığınızı düşünüyorsanız, belki daha fazlasını öğrenmenize gerek kalmaz. Yine de, başlık altında neler olup bittiğini anlamak, gerçekten işlevsel kodu iyi bir koda dönüştürmeye yardımcı olabilir.


-3

Veri yapıları yapmak istediğiniz birçok şeyin yapı taşlarıdır. Her veri yapısının kullanımlarını, zayıf yönlerini ve güçlü noktalarını biliyorsanız, sorunları kolayca çözebilirsiniz.

Örneğin, binlerce nesneyi yönetme gereksinimimiz vardı. Arada bir, bir nesnenin zaman damgasını kimliğine göre güncellememiz gerekir. Arada bir, X dakikadan daha uzun bir süredir güncellenmeyen nesneleri çıkarmamız gerekiyordu.

Veri yapılarınızı biliyorsanız, sorunu kolayca tanımlayabilirsiniz ve ayrıca bir çözüm bulmak çok kolaydır. Yeterli veri yapısını bilmeyen bir programcı bir çözüm bulmaya çalıştığında çözümü garipti. Senin gibiydi - akıllı, kod programlayıcı, çerçeveleri hızlıca öğrenebildi. Ancak veri yapılarında bilgi sahibi olmadan tekerleği kendisinin icat etmesi gerekiyordu. Daha sonra - kırmızı-siyah ağaçlar (Java'daki eski TreeMap'iniz) gibi anlamadığı veri yapılarına dayandığından daha basit çözümleri anlamakta zorlanıyordu.

Bu yüzden, önemli olanın, her bir veri yapısını düşünmeden, nasıl ve ne zaman kullanacağını bilmek olduğunu söyleyebilirim. Fakat aslında nasıl çalıştıklarını anlamadan bunu başarmanın bir yolu olduğunu sanmıyorum.

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.