Veri Yapıları ve Algoritmaları Niçin Öğrenmeliyiz?

Merhaba değerli dostlar. Bu yazıyla birlikte Kotlin programlama dilini kullanarak veri yapıları ve algoritmalar hakkında bilgi sahibi olacağız. Bu uzun ve eğlenceli bir süreç olacaktır ama bu seriyi tamamladığınız zaman Kotlin dilini kullanarak programcılık becerilerinizi geliştireceksiniz. Her şeyden önce veri yapıları ve algoritmaları niçin öğrenmeliyiz sorusuna cevap vermemiz gerekiyor.

Bilgisayar programlamanın temel amacı gerçek hayatta bulunan bir problemi çözmek ve dünyayı daha yaşanır bir hale getirmektir. Sorunların farklı çözüm yolları bulunabilir. Programcılıkta amaç en uygun çözüm yolunu bulmaktır. Bu yol, en az kaynak gereksinimi (cpu, ram vb) ile sorunu en hızlı çözen yol olmalıdır. Ayrıca bir problemi parçalara bölerek çözmek bilgisayar biliminde yaygın olarak kullanılan bir yöntemdir. Bu bilgilerden yola çıkarak bir problemi çözmek için takip edilmesi gereken en uygun adımlar dizisine bilgisayar biliminde algoritma denir. Amacımız algoritmanın ne olduğu ve programcılıktaki önemi hakkında bilgi vermektir. Bir algoritma uygun veri yapıları ile kullanıldığında daha güçlü bir hale gelir. Bundan dolayı yaygın olarak kullanılan veri yapıları hakkında bilgiler vereceğiz.

Veri yapıları veri tutmak için kullanılırken, algoritmalar bu verileri kullanarak problemi çözmeyi sağlar. Bundan dolayı algoritmalar uygun veri yapıları ile beraber kullanıldığı zaman mevcut bir problemin çözümü daha etkili olmaktadır. Bazı problemler için yıllarca yapılan araştırmalar sonucu en uygun algoritmalar tespit edilmiştir. Örneğin; bir dizinin elemanlarını küçükten büyüğü sıralamak için eklemeli, seçmeli, kabarcık, hızlı sıralama gibi birçok algoritma geliştirilmiştir. Ancak bunlar içinde işlemi en hızlı yapan hızlı sıralama algoritmasıdır. Diğer algoritmalar gereksiz olmayıp bazı özel durumlarda daha iyi sonuçlar vermektedir. Yine graflar üzerindeki en kısa yol problemlerini çözmek için Dijkstra, Bellman-Ford ve Floyd algoritmaları kullanılmaktadır. Tabi bunlar en ünlüleri olup bu gibi problemleri çözen birçok algoritma geliştirilmiştir. Dijkstra, kenar maliyeti sıfır veya sıfırdan büyük olan graflarda etkili iken; Bellman-Ford, kenar maliyeti eksi olan graflar üzerinde de çalışabilmektedir. Floyd algoritması ise kısa yol bulmada en çok kullanılan algoritmadır. Ayrıca yoğun graflarda daha çok tercih edilir. Google Maps gibi uygulamalarda iki konum arasındaki en kısa mesafeyi bulmak ve en uygun rotayı hesaplamak için bu ve benzer algoritmalar kullanılır.

Bu bilgilerden anlaşılacağı üzere, veri yapıları ve algoritmalar problem çözme kalıplarıdır. Bu iki alanda ne kadar bilgi sahibi olursanız, çözebileceğiniz problem sayısı da o kadar artar. Ayrıca yeni sorunlara yeni çözümler bulma ihtimaliniz aynı oranda artacaktır. Yani bunları bir programcının repertuarı olarak düşünebiliriz. Veri yapıları ve algoritmalar ile bilgisayarın çalışma mantığını daha iyi kavrarsınız. Çünkü; tüm bilgisayarlar temel veri yapılarına dayanır, onları daha iyi anlamak bilgisayarı daha iyi anlamanıza yardım eder.

Bu iki alanda bilgi sahibi olmanın yararını daha iyi anlamak adına bir sorun olduğunu varsayalım. Bu sorunu kesinlikle çözmeniz gerekiyor. Ciddi bir çalışma ve hata ayıklamadan sonra sorunu çözen bir program elde ettiniz. Program, bir dizinin elemanlarını küçükten büyüğe sıralamayı sağlıyor. Ancak programın performans analizini, optimize işlemini yapıp minimum yürütme süresine sahip olduğundan emin misiniz? Çok büyük bir diziyle yürütmeye çalışırsanız ne olacağını düşündünüz mü? Algoritma ve veri yapılarını öğrenerek bu sorulara cevap verebilir ve programı kolay bir şekilde optimize edebilirsiniz.

Söz konusu algoritma ve veri yapıları olduğu zaman programlama dili tamamen tercihinize kalmıştır. Hatta hangi dilde yazdığınızın önem yok diyebiliriz. Hangi dili kullanırsanız kullanın ölçeklenebilir bir sistem geliştirmek için veri yapıları ve algoritmaları öğrenmek çok önemlidir. Bizim tercihimiz Kotlin dilini kullanarak adı geçen konular hakkında sizleri bilgilendirmektir.

Konumuzla doğrudan ilgili olduğu için mevcut algoritma ve veri yapıları hakkında kendinizi gerçekten geliştirmek istiyorsanız Competitive Programming yani rekabetçi programlama etkinliklerine katılmanızı kesinlikle tavsiye ediyoruz. Bu etkinliklerde bir problem verildiğinde kodunuzun bazı şartları sağlaması hatta bazen milisaniye zaman diliminde bir işlemi yapması istenir. Böylece etkinliğe katılanların kod yazma deneyimi artar. Yapılan bazı etkinliklerde dereceye girenlere ödüller verilmektedir. Yani hem para kazanıp hem de yeteneklerinizi geliştirebilirsiniz. Ancak bu etkinliklerin asıl amacı kod yazma deneyimini arttırmak ve gerçek hayatta bulunan sorunlara en etkili çözümleri üretmektir. Codeforces, Codechef, Topcoder ve Google Code Jam olmak üzere dünya genelinde bu faaliyetleri düzenleyen birçok site var. Bu sitelere üye olarak etkinliklere katılabilir veya daha önce düzenlenen etkinliklerin problemlerine ait çözümleri inceleyip kod yazma yeteneğinizi geliştirebilirsiniz.

Özetle; kod yazma deneyiminizi arttırmak, etkili kod yazarak işverenlerinizi kendinize hayran bırakmak, piyasada daha rahat iş bulabilmek, karşınıza çıkmadan birçok problemin çözüm yolunu önceden bulmak, mesleğinizde zirve olmak ve yazılım geliştirmekten gerçekten zevk almak istiyorsanız veri yapıları ve algoritma bilginizi kesinlikle geliştirmeniz gerekiyor.