Programlama Ve Algoritmalar Dersi 1. Ünite Özet

Algoritma Kavramı ve Programlama Temelleri

Giriş

Bu ünitede algoritma kavramı, algoritma gösterim yöntemleri, algoritma sınıfları ve veri yapıları yer almaktadır.

Algoritma Nedir?

Algoritma, bir işin nasıl yapılacağını tarif eden adımlar kümesidir

Bir algoritmayı oluşturan temel bileşenlerin, yapılacak işe yönelik açıklama ve işin yapılmasında izlenecek adımlar olduğu söylenebilir. Açıklama kısmında işin tanımı yapılır ve işle ilgili detaylar bildirilir. Adımlar kısmında ise işin başlangıcından sonuna kadar takip edilecek işlemler belirtilir.

Algoritmaların Temel Özellikleri: Yazılım dünyasında geliştirilen programlar, bilgisayarın yapacağı işlemleri algoritmalar aracılığıyla tarif eder. Bilgisayar programları aracılığıyla çözülmek istenen bir problem için uygun bir algoritma geliştirilemiyorsa, o problemin program ile çözülmesi mümkün değildir

Algoritmalar kendi aralarında sınıflandırılabilir ve karşılaştırılabilir. Aynı işlevi gören algoritmalar, farklı adımlara sahip olabilir. Programcılar kendi ihtiyaçları doğrultusunda en uygun algoritmayı tasarlamak ve kodlamak durumundadırlar.

Bir algoritmanın sahip olması gereken temel özellikler:

  • Girdi ve çıktı bilgisi: Algoritmalarda girdi ve çıktı bilgileri olmalıdır. Girdi bilgisi algoritmaya dışarıdan verilirken, çıktı bilgisi ise algoritma içerisinde üretilir. Bu bilgiler, algoritma için tanımlı veri kümesine ait olmalıdır.
  • Açıklık: Algoritmayı oluşturan adımlar doğru ve kesin bir şekilde tanımlanmalıdır
  • Doğruluk: Farklı girdi bilgileri ile çalışabilen algoritmalar, her girdi için doğru bir çıktı üretmelidir.
  • Sonluluk: Algoritmaların daima bir sonu olmalıdır. Girilen veri boyutundan bağımsız bir şekilde, algoritma adımları farklı bir aşamaya geçebilmeli veya sonlanmalıdır. Algoritma adımları gerçekleştirilirken, algoritma sonsuz döngüye girmemelidir.
  • Verimlilik: Algoritmayı oluşturan adımlar, yapılan iş için kabul edilebilir bir süre içerisinde tamamlanmalıdır.
  • Genellik: Bir algoritma, aynı türdeki problemlerin hepsine uygulanabilir olmalıdır.

Algoritma Gösterim Yöntemleri

Algoritmaların tanımlanmasında ve gösteriminde kullanılan farklı yöntemler mevcuttur. Bu yöntemlerden başlıcaları konuşma dili ile gösterim, akış şeması ile gösterim ve sözde kod (pseudocode) ile gösterimdir.

Konuşma Dili: Bir algoritmanın açıklaması ve algoritmada yer alan adımlar, konuşma dili kuralları çerçevesinde ifade edilebilir. Bu gösterim yönteminde, algoritma açık ve kesin bir dille tanımlanır. Algoritmada yer alan adımlar liste halinde yazılır.

Akış Şeması: Akış şeması, algoritmaların gösteriminde kullanılan faydalı bir yöntemdir. Bir akış şemasında algoritma adımlarını ifade eden kutucuklar, adımlar arası geçişleri gösteren oklar, karar verme mekanizmaları olarak kullanılan şekiller bulunabilir. Bir algoritmanın görsel halini ifade eder.

Sözde Kod: Sözde kod (pseudocode), bir algoritma veya program oluşturulurken kullanılan, konuşma diline benzer bir yapıya sahip, programlama dillerinin detaylarından uzak bir anlatım şeklidir. Sözde kodlar, programlama mantığı ile konuşma dili cümlelerinin harmanlanmasından meydana gelir ve herkes tarafından rahatlıkla anlaşılabilir.

Algoritmaların Sınıflandırılması

Algoritmalar, problemlerin çözümü için uyguladıkları yönteme göre sınıflandırılabilir.

Özyinelemeli Algoritmalar (Simple Recursive Algorithms): Kendisini doğrudan veya dolaylı olarak çağıran algoritmalara özyinelemeli algoritma adı verilir. Bu algoritmalarda, problemler daha küçük ve basit parçalara indirgenir.

Geri İzlemeli Algoritmalar (Backtracking Algorithms) Geri izlemeli algoritmalar, genellikle optimizasyon problemlerinde kullanılan, problem çözümünde tüm olasılıkları deneyen algoritmalardır. Bu algoritmalarda çözüm kademeli şekilde oluşturulur. Algoritma çözüm aşamasında ilerlerken, olası çözüm yollarının hepsini deneyerek bir sonraki adıma geçmeye çalışır. Algoritmanın denediği çözüm yolundan sonuç alınamazsa, algoritma bir önceki adımda bulunan diğer olası çözüm yollarına geri döner.

Böl ve Yönet Algoritmaları (Divide and Conquer Algorithms): Problemlerin mümkün olan en küçük alt parçalara ayrıldığı, her bir alt parçanın diğerlerinden bağımsız şekilde çözüldüğü algoritmalardır.

Böl ve yönet algoritmaları, genellikle üç ana aşamadan meydana gelmektedir:

  • Bölme (Divide): Problemin daha küçük parçalara ayrıldığı aşamadır.
  • Yönetme (Conquer): Problemin alt parçalarının, birbirlerinden bağımsız olarak çözüldüğü aşamadır.
  • Birleştirme (Merge): Problemin alt parçalarına ait çözümlerin, özyinelemeli bir yaklaşımla birleştirildiği aşamadır

Dinamik Programlama (Dynamic Programming): Dinamik programlama, karmaşık problemleri küçük parçalar halinde çözen, elde edilen sonuçları bilgisayar hafızasında bir veri yapısında saklayan, genel çözümü elde ederken de veri yapılarında saklanan sonuçları kullanan bir programlama yöntemidir.

Bir problemin dinamik programlama ile çözülebilmesi için problemin alt parçalara ayrılabilmesi ve genel çözümün bu alt parçalardan oluşturulabilmesi gerekmektedir. Dinamik programlama yaygın olarak optimizasyon problemlerinde kullanılır.

Bir problemin alt kümelerinin çözümlerini tekrar tekrar hesaplamak yerine, bilgisayar hafızasında saklayan yöntem ezberleme (memorization) olarak bilinir.

Açgözlü Algoritmalar (Greedy Algorithms): Bir problem için mümkün olan en doğru çözümü hedefleyen algoritmalara açgözlü algoritmalar adı verilir.

Açgözlü algoritmalar ile problem çözümündeki temel yaklaşım, problemin küçük bir alt kümesi için çözüm oluşturmak ve bu çözümü problemin geneline yaymaktır. Algoritma içerisinde yapılan bir seçim, o an için doğru olsa bile sonraki seçimlerde olumsuz etki yapabilir

Kaba Kuvvet Algoritmaları (Brute Force Algorithms): Bir problemin çözümü aşamasında, kabul edilebilir bir çözüm elde edene kadar tüm olasılıkları deneyen algoritmalara kaba kuvvet algoritmaları denir.

Kaba kuvvet algoritmaları, genellikle problemin tanımından yola çıkarak en basit çözüm yolunu uygular ve rahatlıkla kodlanır. Fakat bu algoritmalarda çok fazla işlem yapılır ve çözüm yolu optimumdan uzaktır. Problemdeki veri hacmi büyüdükçe, kaba kuvvet algoritması ile çözüm şansı da azalır

Veri Yapıları

Üst düzey programlamada veri içerisinde arama yapmak, veriye hızlı bir şekilde ulaşmak, bilgisayarın işlemcisini verimli kullanmak, aynı anda birçok isteğe cevap verebilmek gibi gereksinimler söz konusudur. Bilgisayar programlarının karmaşıklığı ve programda işlenen veri büyüklüğü arttıkça, verilerin daha sistematik ve verimli yönetilmesi gerekir.

Bilgisayar programlarında verilerin sistematik ve etkili bir şekilde organize edilmesi için veri yapıları kullanılır.

Bir veri yapısı, içerdiği elemanların mantıksal düzeni ve elemanlar üzerinde yapılabilecek işlemler ile tanımlanır.