- Veri yapıları ve algoritmaların ne olduğunu ve nasıl bir araya geldiklerini anlamak, daha verimli ve ölçeklenebilir programlar yazmanıza olanak tanır.
- Diziler, yığınlar, kuyruklar, bağlı listeler, ağaçlar, grafikler, trie yapıları ve hash tabloları gibi temel kavramlara hakim olmak, profesyonel programlama ve teknik mülakatlar için çok önemlidir.
- Doğru veri yapısını ve uygun algoritmayı seçmek, yazılımın performansını, bellek kullanımını ve bakım kolaylığını doğrudan etkiler.
- İyi bir teorik temel ve bolca rehberli uygulama ile desteklenen aşamalı öğrenme, bu kavramları pekiştirmenin en etkili yoludur.
Algoritmalar ve veri yapıları Bunlar, bir yapboz gibi birbirine uyan iki parçadır: biri sorunu çözme prosedürünü özetler, diğeri ise bilgiyi nerede ve nasıl saklayacağımızı belirler. Akademik gibi görünse de, bu ikiliye hakim olmak, sadece çalışan bir kod ile sorunsuz çalışan ve ölçeklenebilen bir kod arasındaki farkı yaratır.
Profesyonel programlama alanında kariyer yapmak, teknik mülakatlara hazırlanmak veya LeetCode ve Codewars gibi alıştırmalarla boğuşmaktan kurtulmak istiyorsanız, sağlam bir temel oluşturmanız gerekiyor. veri yapıları ve algoritmalarBu makale boyunca bunların ne olduğunu, neden bu kadar önemli olduklarını, başlıca türlerini, gerçekleştirdikleri temel işlemleri ve sınavlarda ve seçim süreçlerinde genellikle hangi soruların çıktığını göreceksiniz.
Veri yapıları ve algoritmalar nelerdir?
bir veri yapısı Temelde, bellekte bilgileri düzenlemenin ve depolamanın, üzerinde verimli bir şekilde işlem yapabilmek için kullanılan özel bir yoludur. Bu düzenleme rastgele değildir: hangi işlemlerin hızlı, hangilerinin maliyetli olacağını doğrudan belirler (ekleme, arama, silme, gezinme vb.).
Doğru veri yapısını seçtiğinizde, programınız bunu yönetebilir. büyük hacimli veri Hiç zorlanmadan; yanlış seçim yaptığınızda, küçük bir uygulama bile zamanla yavaşlayabilir, çok fazla bellek tüketebilir veya bakımı imkansız hale gelebilir.
bir algoritma Bu, belirli bir problemi çözmek için girdileri çıktılara dönüştüren, iyi tanımlanmış adımlardan oluşan sonlu ve sıralı bir dizidir. Tıpkı bir yemek tarifi gibi: ne yapacağınızı, hangi sırayla ve hangi koşullar altında yapacağınızı söyler, ancak malzemeleri buzdolabında nasıl saklayacağınızla ilgilenmez; bu da veri yapısı kısmını oluşturur.
Bilgisayar biliminde, her algoritma çalışacağı veri türü göz önünde bulundurularak tasarlanır. Veri yapısının seçimi önemsiz bir ayrıntı değildir: Yapı ve algoritma birbirine bağlıdır.Ve bu iki parçadan birindeki küçük değişiklikler performansı artırabilir veya düşürebilir.
Teorik açıdan bakıldığında, Niklaus Wirth gibi yazarlar 70'lerden itibaren şu fikri yaygınlaştırmışlardır: algoritmalar + veri yapıları = programlarOn yıllar sonra bile bu durum aynı derecede geçerli: Java, Python, C++ ile programlama yapmanız veya bir eğitim kampından gelmeniz fark etmez; mülakatlarda ve ciddi projelerde sizden beklenen, her iki unsuru da iyi bir şekilde seçmeyi ve birleştirmeyi bilmektir.
Programlamada neden bu kadar önemliler?
Gerçek dünyadaki herhangi bir uygulamada, ne kadar basit görünürse görünsün, her zaman verilerle çalışırsınız: maaşlar, ürünler, kullanıcılar, işlemler, rotalar, belgelerKayıt tutma vb. Soru, verileri işleyip işlemeyeceğiniz değil, kodunuzun hızlı, anlaşılır ve bakımı kolay olacak şekilde nasıl organize edeceğinizdir.
Veri yapıları, probleme uygun olarak bilgileri düzenli ve tutarlı bir şekilde depolamak için kullanılır. Aynı değil Her zaman ilk öğeye erişmek, anahtar ile arama yapmak, sırayla ilerlemek, ortaya eklemek veya sık sık silmek; her kullanım modeli farklı bir yapıya daha iyi uyum sağlar.
Algoritmalar ise kendi paylarına düşeni sağlıyor. verileri verimli bir şekilde işleyin: bunları sıralayın, filtreleyin, öğeleri arayın, en uygun rotaları bulun, kalıpları tespit edin veri madenciliğiKaynakları optimize etmek vb. gibi birçok zor görünen problem, doğru algoritma ve veri yapısı kombinasyonunu bulduğunuzda önemsiz hale gelir.
Yazılım geliştirme alanındaki teknik mülakatlarda, bu konulara doğrudan değinmeyen bir soru sorulması nadirdir. Bazen soru yapıyı açıkça belirtir, örneğin "verilen bir ikili ağaçta...", bazen de dolaylı olarak: "Her yazarın kaç kitabı olduğunu saymak istiyoruz", bu da bir yapı kullanılmasını önerir. karma tablo veya anahtar-değer haritası.
Ayrıca, örgün ve mesleki eğitim genellikle bu alan etrafında şekillenir. Birçok üniversite ve yükseköğretim programı, bu konuda bir ders içermektedir... Veri yapıları ve algoritmalarResmi bir programı, ön koşulları, teori ve uygulama dersleri, sınavları ve ödevleri olan bu ders, herhangi bir yazılım mühendisi için temel bir ders olarak kabul edilir.
Önkoşullar ve gerekli temeller
Veri yapıları ve algoritmaları çalışmaktan en iyi şekilde yararlanmak için, genel amaçlı bir programlama diline aşina olmak faydalıdır; örneğin, Java, Python veya C++Uzman olmanıza gerek yok, ancak değişkenler, veri tipleri, koşullu ifadeler, döngüler, fonksiyonlar ve parametre geçirme gibi temel kavramlara aşina olmanız gerekiyor.
Bu aynı zamanda fikri anlamaya da çok yardımcı oluyor. algoritmik karmaşıklık ve Büyük O gösterimi: veri boyutu (n) arttıkça yürütme süresinin veya bellek kullanımının nasıl arttığını gösterir. O(1), O(log n), O(n), O(n log n) ve O(n²) arasındaki farkı bilmek, alternatifleri sağlam bir yargıyla karşılaştırmanıza ve kararlarınızı gerekçelendirmenize olanak tanır.
Bir diğer önemli husus da, biraz tartışma yaşamış olmamızdır. Problem çözümüYapılandırılmış programlama alıştırmaları, küçük mantık problemleri, basit alıştırmalar vb. Bir problemi adımlara ayırma konusunda "sezginizi" ne kadar çok geliştirirseniz, her duruma hangi veri yapısının uygun olduğunu görmek o kadar kolaylaşır.
Bazı müfredatlar açıkça belirtir ön koşullar veya eş koşullar Veri Yapıları ve Algoritmalar dersi için Programlama Temelleri, Programlama I veya Ayrık Matematik derslerinden birini geçmiş olmanız gerekmektedir. Bu mantıklı: Temel programlama ve mantık konusunda sağlam bir temel olmadan, bu dersten kolayca hayal kırıklığına uğrayabilirsiniz.
Son olarak, biraz aşinalığa sahip olmak gerçek dünya pratik ortamları (Küçük web projeleri, komut dosyaları veya konsol uygulamaları gibi) bu yapıların her birini ne için kullanacağınızı daha iyi görselleştirmenize yardımcı olur; böylece onu tamamen akademik bir şey olarak görmekten kurtulursunuz.
En sık kullanılan veri yapıları
Bilgisayar biliminde birçok veri yapısı vardır.Ancak, tekrar tekrar kullanılan bir grup "temel" fonksiyon vardır: diziler (vektörler), yığınlar, kuyruklar, bağlı listeler, ağaçlar, grafikler, trie'ler ve hash tabloları. Bunların nasıl çalıştığını, hangi işlemleri sunduklarını ve tipik maliyetlerini anlamak, programlamada sorunsuz ilerlemek için çok önemlidir.
Şimdi gidiyoruz her birini gözden geçirinBu kitap, geliştiriciler için derslerde, alıştırmalarda ve iş görüşmelerinde genellikle ortaya çıkan temel fikir, tipik işlemler ve problem örnekleriyle birlikte sunulmaktadır.
Diziler
Dizi En basit doğrusal veri yapısıdır ve en yaygın kullanılanlardan biridir. Genellikle sıfırdan başlayan bir tamsayı indeksiyle erişilebilen, aynı türden elemanlardan oluşan bir koleksiyonu depolayan bitişik bir bellek bloğundan oluşur.
1, 2, 3 ve 4 değerlerini içeren 4 boyutlu bir dizi hayal edin. Her pozisyonun bir değeri vardır. indeks (0, 1, 2, 3) ve herhangi bir elemana indeksiyle sabit zaman O(1) ile doğrudan erişebilirsiniz. Bu, dizileri rastgele okuma için çok verimli hale getirir.
İki ana kategori vardır: tek boyutlu diziler (tek bir eleman satırı) ve çok boyutlu diziler (Örneğin, dizilerin dizileri olan matrisler). Birçok programlama dili, bu iki varyantı da doğal olarak veya sözdizimi ve performans açısından küçük farklılıklarla sunar.
Diziler üzerinde gerçekleştirilen temel işlemler genellikle şunlardır:
- Sokmak: Bir öğeyi belirli bir konuma yerleştirme işlemi; statik dizilerde bu işlem diğer öğelerin kaydırılmasını da içerebilir.
- Elde etmek: Belirtilen dizindeki öğeye erişim, genellikle O(1).
- Silmek: Belirli bir konumdaki öğeyi silmek veya boş olarak işaretlemek, genellikle öğeleri sola kaydırarak yapılır.
- BoyutDiziye kaç eleman kaydedildiğini veya dizinin maksimum kapasitesini kontrol edin.
Mülakatlarda ve sınavlarda bu tarz alıştırmalar çok yaygındır. Bir dizinin ikinci minimumunu bulun.Tekrarlanmayan ilk tam sayıyı bulmak, önceden sıralanmış iki diziyi birleştirmek veya belirli özellikleri koruyarak pozitif ve negatif sayıları yeniden sıralamak. Tüm bunlar, indeks erişimine ve doğrusal veya çift yönlü geçişlere dayanır.
Yığınlar
Batarya Bu, LIFO (Son Giren İlk Çıkar) prensibini izleyen doğrusal bir veri yapısıdır. Üst üste dizilmiş bir kitap yığını hayal edin: yalnızca en üstteki kitapları alabilir veya koyabilirsiniz.
Bu davranış şu anlama gelir: Yalnızca yığındaki en üstteki öğeye erişiyoruz.Üstteki öğeleri kaldırmadan ortadaki öğeyi kaldıramayız. Bu da onu işlem geçmişlerini (geri alma), iç içe fonksiyon çağrılarını, gezinmeyi (geri/ileri) vb. modellemek için ideal bir yapı haline getirir.
Tipik yığın işlemleri şunlardır:
- ItmekEn üste yeni bir öğe ekleyin.
- PopYığın boyutunu küçültmek için en üstteki öğeyi ayıklayın ve döndürün.
- Tepe veya gözetlemeEn üstteki öğeyi silmeden inceleyin.
- boşPilinin boş olup olmadığını kontrol edin.
Mülakatlar bağlamında aşağıdaki gibi sorunlar görülmektedir: Postfix gösterimindeki ifadeleri değerlendirin (RPN), yalnızca yığınlar kullanarak elemanları sıralama veya parantez (ve diğer semboller) dizisinin push ve pop kullanarak düzgün bir şekilde dengelenip dengelenmediğini kontrol etme.
Pratikte, dillerin birçok dahili uygulaması (örneğin, sistem çağrısı yığınıBu prensiplere göre çalışan birçok eser var, ancak bunları doğrudan göremiyoruz.
Kuyruklar
Kuyruk Bu da doğrusal bir veri yapısıdır, ancak LIFO prensibini izlemek yerine FIFO modelini kullanır: İlk Giren İlk Çıkar. En açık benzetme, sinema salonu bilet gişesinde bekleyen insan kuyruğudur.
Standart bir kuyrukta elemanlar şunlardır: Sonunda eklerler, başta çıkarırlar.Önce gelen önce alır prensibiyle çalışır; bu da bekleyen görevleri, işletim sistemi süreçlerini, sunucu isteklerini, yazdırma kuyruklarını vb. yönetmek için idealdir.
Temel kuyruk işlemleri şunları içerir:
- KuyruğaSıranın sonuna yeni bir öğe ekle.
- Sıradan çıkarmakBaşlangıçta bulunan öğeyi kaldırın ve geri getirin.
- Ön veya üst: İlk öğeyi çıkarmadan inceleyin.
- boşKuyruğun boş olup olmadığını kontrol edin.
Programlama yarışmalarında, örneğin, size şu gibi sorular sormaları yaygındır: İki kuyruk kullanarak bir yığın yapısı oluşturun.Bir kuyruğun ilk k elemanını geri kalanını değiştirmeden tersine çevirmek veya kuyruğun FIFO davranışını kullanarak 1'den n'ye kadar ikili sayılar üretmek.
Temel kuyruk şeklinin yanı sıra, aşağıdaki gibi çeşitli varyasyonlar da mevcuttur. dairesel kuyrukÖncelik kuyruğu veya çift kuyruk (DEQ), belirli senaryolarda ek işlemler sunarak performansı artırır.
bağlantılı listeler
Bağlantılı liste Bağlı liste de doğrusal bir yapıdır, ancak içsel olarak dizilerden çok farklıdır. Bitişik bir bellek bloğu kullanmak yerine, birbirine referanslar veya işaretçilerle bağlı seyrek düğümlerden oluşur.
Her düğüm genellikle iki bölümden oluşur: veri Saklanacak olan düğümleri ve sıradaki düğüme işaret eden bir (veya birkaç) işaretçiyi (ve çift yönlü bağlantılı listelerde, önceki düğüme de) içerir. Liste, ilk düğüme işaret eden baş düğümüne yapılan bir referans aracılığıyla yönetilir ve daha karmaşık listelerde kuyruk düğümüne de bir referans tutulur.
İki ana çeşidi vardır:
- tek yönlü bağlantılı listeHer düğüm yalnızca bir sonraki düğüme işaret eder; yol genellikle tek yönlüdür.
- çift bağlantılı listeHer düğüm bir sonraki ve bir önceki düğüme işaret ederek çift yönlü geçişleri ve daha verimli silme işlemlerini kolaylaştırır.
Bağlantılı listeler üzerinde yapılan tipik işlemler şunlardır:
- Başlığa Ekle: Listenin başına yeni bir düğüm ekle.
- Sonuna Ekle: Sıraya bir düğüm ekleyin ve varsa sırayı güncelleyin.
- Sil: Komşu düğümlerin işaretçilerini ayarlayarak belirli bir düğümü kaldırın.
- Başlıktan Sil: İlk düğümü silin ve başı bir sonrakine taşıyın.
- AraListeyi tarayarak belirli bir değeri arayın.
- boşListenin başının boş olup olmadığını ve dolayısıyla listede hiç eleman olup olmadığını kontrol edin.
Bu tür sorunlar derslerde ve mülakatlarda çok sık karşımıza çıkıyor. bağlantılı listenin tersiDöngü olup olmadığını tespit edin (genellikle "kaplumbağa ve tavşan" algoritmasını kullanarak), sondan sayarak N düğümünü elde edin veya yinelenen düğümleri kaldırın, her zaman işaretçileri dikkatlice ele alın.
Bağlı listeler, uygulamada yaygın olarak kullanılır. zincirlemeli karma tablolarGrafiklerdeki komşuluk listeleri ve elemanların sık sık eklenip silindiği dinamik veri yapıları.
Ağaçlar
Bir ağaç Düğümlerin kenarlarla birbirine bağlanmasıyla oluşan hiyerarşik bir veri yapısıdır. Genel grafiklerin aksine, bir ağaçta döngüler bulunmaz: her zaman bir kök, çocuklar, ebeveynler, kardeşler, yapraklar, seviyeler ve alt ağaçlar vardır; bu yapı "aile" veya "organizasyon şeması" tipi bir organizasyona sahiptir.
Ağaçlar, ihtiyaç duyduğumuzda çok faydalıdır. hiyerarşik ilişkileri temsil etmek Ya da bir problemi daha küçük alt problemlere ayırın: dosya sistemleri, menüler, tarayıcılardaki DOM yapıları, yapay zekadaki karar ağaçları vb.
Ağaçların birçok çeşidi vardır, bunlar arasında şunlar bulunur:
- N-ary AğacıHer düğümün değişken (ve muhtemelen büyük) sayıda çocuğu olabilir.
- Dengeli ağaçPerformans düşüşünü önlemek için dallarını benzer derinlikte tutar.
- İkili ağaçHer düğümün en fazla iki çocuğu vardır (sol ve sağ).
- İkili Arama Ağacı (BST)Düğümün solundaki her şeyin daha küçük, sağındaki her şeyin ise daha büyük olduğu (belirli bir sıralama kriterine göre) ikili ağaç.
- AVL ağacı, kırmızı-siyah, 2-3 ve diğer varyantlarBunlar, ekleme, silme ve arama işlemlerinde iyi karmaşıklık sınırları sağlayan dengeli arama ağaçlarıdır.
Pratikte, egzersizlerde en sık rastlananlar şunlardır: ikili ağaç y el ikili arama ağacıTipik problemler arasında ağacın yüksekliğini hesaplamak, ikili arama ağacında k-inci en büyük değeri bulmak, kökten belirli bir mesafedeki düğümleri listelemek veya belirli bir düğümün atalarını belirlemek yer alır.
Ayrıca, geçiş algoritmaları (öncelikli, orta sıralı, sonradan sıralı, seviye seviye) birçok sonraki işlem için temeldir: sıralı yazdırma, ifade değerlendirmesi, ağaç serileştirme ve seri durumdan çıkarma vb.
Grafikler
Bir grafik Düğümler arasında döngülere ve birden fazla keyfi bağlantıya izin vererek ağaç kavramını genelleştirir. Bir dizi köşeden (düğümden) ve köşeleri birbirine bağlayan, bazen ilişkili bir ağırlık veya maliyete sahip bir dizi kenardan oluşur.
Çeşitli grafik türleri vardır: yönlendirilmemiş (kenarların yön duygusu yoktur, ilişki çift yönlüdür) ve yönlendirilmiş (Kenarların bir başlangıç noktası ve bir varış noktası vardır). Ayrıca ağırlıklı veya ağırlıksız, bağlantılı veya bağlantısız, döngülü veya döngüsüz vb. olarak da sınıflandırılabilirler.
Kodda grafikler genellikle iki temel şekilde temsil edilir:
- Komşuluk matrisi: i ve j düğümleri arasında bir kenar olup olmadığını (ve muhtemelen bağlantının ağırlığını) gösteren bir hücreden oluşan bir matris.
- Komşuluk listesiHer köşe için komşularının bir listesi saklanır, bu da seyrek grafiklerde bellekten tasarruf sağlar.
En klasik geçiş algoritmaları şunlardır: Genişlik öncelikli arama (BFS) ve Derinlemesine arama (DFS)Her ikisi de çok çeşitli problemler için temel yapı taşları olarak kullanılır: bir grafın bağlantılı olup olmadığını kontrol etmek, döngüleri tespit etmek, bağlantılı bileşenleri bulmak vb.
Teknik testlerde, BFS ve DFS algoritmalarını uygulamak, bir grafın ağaç oluşturup oluşturmadığını kontrol etmek, kenar sayısını saymak veya arama yapmak gibi görevler sıklıkla istenebilir. en kısa yollar Ağırlıksız grafiklerde Dijkstra veya BFS gibi varyantlar kullanarak iki düğüm arasında (örneğin, şehir haritasında) bağlantı kurmak.
Denemeler veya önek ağaçları
Trie (veya önek ağacı), özellikle kelime sözlükleri, otomatik tamamlama sistemleri veya önek aramalarıyla çalışırken kullanışlı olan, karakter dizilerini işlemek için optimize edilmiş ağaç şeklinde bir veri yapısıdır.
Bir trie yapısında, her düğüm tipik olarak bir karakteri temsil eder ve kökten belirli düğümlere giden yollar karakteri işaretler. tam kelimelerSon kelime düğümleri genellikle basit ön eklerden ayırt edilmeleri için bir şekilde (örneğin, bir Boolean göstergesiyle) işaretlenir.
“Top”, “thus” ve “their” kelimelerini bir trie yapısında saklarsak, aynı harflerle başlayan tüm kelimeler için başlangıç yolunun bir kısmını paylaşırız; bu da ön eke göre arama ve öneri yapılmasına olanak tanır. çok verimli zamanAradığımız kelimenin uzunluğuyla orantılıdır, depolanan toplam kelime sayısıyla değil.
Trie fonksiyonlarıyla ilgili yaygın işlemler ve sorunlar şunlardır: Kaydedilen kelime sayısını sayın.Tüm kelimeleri sözlükbilimsel sıraya göre yazdırabilir, bir dizinin elemanlarını trie yapısına ekleyerek sıralayabilir, bir harf kümesinden geçerli kelimeler üretebilir veya T9 sözlüğüne benzer yapılar oluşturabilirsiniz.
Mülakat ortamlarında, bu en temel talep edilen yapı olmayabilir, ancak bu tür taleplerle çalışan şirketlerde düzenli olarak karşımıza çıkar. arama, kelime işleme veya öneri sistemleri.
Karma tablolar ve karma algoritmalar
Karma Bu, her veri parçasına sayısal bir anahtar (karma değer) atama tekniğidir; böylece, bu anahtarı genellikle bir dizi olan dahili bir yapıda indeks olarak kullanarak, öğeleri neredeyse sabit bir sürede saklayabilir ve alabiliriz.
La karma tablosu Bu, bu mekanizmadan yararlanan veri yapısıdır. Her öğe bir anahtar-değer çifti olarak saklanır: anahtar, bir karma fonksiyonu kullanılarak tablo indeksine dönüştürülür ve değer (veya ona bir referans) orada saklanır. Daha sonra, arama yapmak için, anahtarı tekrar karma işlemine tabi tutun ve ilgili konuma erişin.
Bir karma tablonun performansı, üç önemli faktöre bağlıdır: Özet fonksiyonu seçilen (konsantrasyonu önlemek için tuşları iyi dağıtmalısınız), masa boyutu (Yetersiz boyut birçok çarpışmaya neden olur) ve çarpışmaları yönetme yöntemi (Bağlantılı listelerle bağlantı kurma, açık adresleme vb.). Bu, şuna benzer: veritabanındaki indeksUygun yapının belirlenmesi, aramaları ve erişimi iyileştirir.
Tipik karma programlama uygulamaları genellikle, örneğin, şunları gerektirir: Bir dizideki simetrik çiftleri bulun.Tek tek uçuşlardan bir seyahatin tüm güzergahını yeniden oluşturmak, bir dizinin diğerinin alt kümesi olup olmadığını hızlıca kontrol etmek veya iki dizinin ayrık olup olmadığını doğrulamak; bunların hepsini karma tablonun yaklaşık O(1) aramalarından yararlanarak yapmak.
Çoğu modern dilde, aşağıdaki gibi yapılar bulunur. harita, sözlük, karma harita veya karma küme İç yapılarında karma tablolara dayanırlar, ancak programcıya üst düzey bir arayüz sunulur.
Algoritmalar ve veri yapıları arasındaki ilişki
Veri yapısının seçimi, hangi algoritmaların mantıklı olduğunu ve karmaşıklıklarının ne olacağını doğrudan belirler. Bir veri yapısı üzerinde doğrusal arama algoritması... sıralanmamış liste Elemanları tek tek tarar; yapıyı dengeli bir arama ağacına veya karma tabloya dönüştürürsek çok daha iyi süreler elde ederiz.
Örneğin, büyük bir koleksiyonda anahtarları tekrar tekrar aramak istiyorsanız, verileri bir yerde saklamak faydalı olabilir. karma tablo veya ikili arama ağacı Bu, basit, sıralanmamış bir dizi kullanmaya kıyasla çok daha hızlı arama algoritmaları tasarlamanıza olanak tanır. Aynı durum, zamanlama veya en kısa yol algoritmaları için öncelik kuyrukları ve yığınlar için de geçerlidir.
Öte yandan, bir algoritma tasarlarken, genellikle belirli özelliklere ihtiyaç duyduğunuzu fark edersiniz: indeks erişimi, başlangıçta hızlı eklemeler, hiyerarşik geçişler, önek aramaları vb. Bu ihtiyaçlar, yapı seçiminizde size yol gösterir. diziler, listeler, ağaçlar, grafikler, karma tablolar, trie'ler...
Algoritma ve veri yapısının bu uygun kombinasyonu, karmaşık uygulamaların mümkün olmasını sağlar. verimli ve ölçeklenebilirSağlam bir temel olmadan, çözümler bilgi hacmi arttıkça yavaşlama, anlaşılması ve sürdürülmesi zorlaşma veya uyarlanması imkansız hale gelme eğilimindedir.
Dolayısıyla, algoritmalar ve veri yapılarına hakim olmak kolay değildir. neredeyse vazgeçilmez bir gereksinim Günümüz iş piyasasında yetkin ve rekabetçi bir programcı olmak isteyen herkes için.
Veri yapıları ve algoritmaları nasıl öğrenirsiniz?
Birçok insan, bu gibi platformlarla kendi başlarına öğrenmeye çalıştıklarında tıkanıp kalmış hissediyor. LeetCode veya CodewarsGenellikle "kolay" alıştırmalarla başlanır ve yine de probleme nereden yaklaşılacağı bilinmez; sonuç olarak çözüme bakılır ancak sonrasında nasıl yeniden oluşturulacağı konusunda net bir fikir bulunmaz.
Pratik bir yaklaşım genellikle birkaç bileşeni bir araya getirir: a iyi teorik açıklama Her yapı ve algoritma, görsel örnekler, bol miktarda rehberli uygulama ve mümkünse problem çözme becerilerinizi geliştirmenize yardımcı olacak deneyimli birinden destek içerir.
İspanyolca konuşulan dünyada, bu öğrenmeyi kolaylaştırmaya katkıda bulunan, geniş deneyime sahip profesyoneller bulunmaktadır. Bunun bir örneği, şu kişilerin çalışmalarıdır: İşletme ve eğitim alanında deneyimli öğretmenler. Programlama temelleri, Java, veri yapıları ve oyunlarla ilgili programlama zorlukları üzerine kitaplar ve kurslar yayınlamış, bu kavramları eğlenceli ve gerçek projelere uygulanabilir bir şekilde erişilebilir hale getirmişlerdir.
Ayrıca, akademilerin ve eğitim merkezlerinin web geliştiricileri veya uygulama programcıları için programlarına veri yapıları ve algoritmalar üzerine özel modüller eklemesi de yaygındır. Çoğu durumda, belirli bir yaklaşım vurgulanır. çok pratik ve proje tabanlıGiderek zorlaşan egzersizler ve tipik teknik mülakat sorularının simülasyonu ile birlikte.
Eğer bir yere takılıp kaldıysanız, yapılandırılmış bir rota izlemek yardımcı olabilir: Diziler ve listelerle başlayın.Teorik açıklamalar, küçük kod örnekleri ve bolca bireysel uygulama arasında sürekli geçiş yaparak, yığınlar ve kuyruklardan başlayarak, ağaçlar ve temel grafiklerle ve son olarak da karma tablolar ve trie'lerle devam ediyoruz.
Mülakatlara hazırlanırken, sadece yapıları değil, aynı zamanda... kaba kuvvet algoritmaları ve ilgili klasik algoritmaları (gezintiler, aramalar, sıralama, basit geri izleme, temel dinamik programlama) açıklayabilmeli ve belirli bir yapıyı neden seçtiğinizi ve ne anlama geldiğini sesli olarak açıklayabilmelisiniz. çözümünüzün karmaşıklığı.
Zamanla ve bir miktar tutarlılıkİlk başta aşılması zor bir duvar gibi görünen şey, yeni sorunlarla karşılaştığınızda neredeyse içgüdüsel olarak kullandığınız tanıdık araçlar setine dönüşüyor.
Algoritmaların ne olduğunu, temel veri yapılarının nasıl çalıştığını ve birbirleriyle nasıl ilişkili olduklarını iyi anlamak, program yazmanıza olanak sağlayacaktır. daha hızlı, daha net ve daha sağlamBu, zorlu seçim süreçlerinde size kapılar açacak ve hem akademik hem de profesyonel projelerinizin sağlam bir temele ve geleceğe dayanmasını sağlayacaktır.
İçindekiler
- Veri yapıları ve algoritmalar nelerdir?
- Programlamada neden bu kadar önemliler?
- Önkoşullar ve gerekli temeller
- En sık kullanılan veri yapıları
- Diziler
- Yığınlar
- Kuyruklar
- bağlantılı listeler
- Ağaçlar
- Grafikler
- Denemeler veya önek ağaçları
- Karma tablolar ve karma algoritmalar
- Algoritmalar ve veri yapıları arasındaki ilişki
- Veri yapıları ve algoritmaları nasıl öğrenirsiniz?