Merhaba. Tabella’daki ilk yazıma klişe bir cümleyle başlamak istemezdim, fakat hayatta her zaman istediklerimiz olmuyor, bu yüzden: “Teknoloji hayatımızın her yerinde!”, tabii okul müfredatlarımızın dışında. Klavye/fare nedir öğreniyoruz, Office programlarını biliyoruz; peki hiç bilgisayar bilimi dediğimiz bilim (Veya mühendislik, uygulamalı matematik? Daha herkesin kabul ettiği bir tanım yok…) dalı hakkında bir şey öğreniyor muyuz? Bu dal, bilgisayarları nasıl en iyi şekilde problem çözebilmek için kullanabileceğimiz üstüne kurulu, matematiksel bir daldır. Veya fazla kasmadan özetleyecek olursak programlama ve alakalı teorik konseptler. Maalesef ki bunları öğrenmiyoruz. Biyolojide evrim teorisi, kimyada periyodik tablo gibi temel şeyleri öğrenirken, bilgisayar derslerinde algoritma nedir öğrenmiyoruz. Bu yüzden algoritmayla başlayarak Tabella‘da okuyucularımızı temel bilgisayar bilimi konseptleriyle tanıştırmak istiyorum.
Bölüm 1: Algoritma Nedir?
Tabella geleneğine uyarak Türk Dil Kurumu Sözlüğü’nden bir tanımla (veya en azından tanımın işimize yarayan kısmıyla) başlayalım: “İyi tanımlanmış kuralların ve işlemlerin adım adım uygulanmasıyla bir sorunun giderilmesi veya sonuca en hızlı biçimde ulaşılması işlemi…”
Birazcık şaşaalı duyulsa da, en temelinde algoritma sadece bir problemi çözebilmek için uygulanması gereken adımlardır. Bu adımların bilgisayarlarla alakalı olmasına gerek yoktur. Örneğin “bir bardağa su doldurma” problemini çözebilmek için kullanılabilecek bir algoritma yazalım:
- Bulunduğun odadaki objelerin her birine teker teker bak ve bardak olup olmadıklarına karar ver.
- Odadaki objelerden herhangi biri bardak mı?
- Evet:
- Bardağı eline al.
- Eğer bulunduğun odada çeşme yoksa, içinde çeşme olan bir odaya git.
- Bardağı çeşmenin doğrudan altına getir.
- Çeşmeyi aç.
- Bardak dolu mu?
- Evet: Çeşmeyi kapat.
- Hayır: Doldurmaya devam et ve adım 2.1.5’e (Bardak dolu mu?) geri dön.
- Hayır:
- Bulunduğun odayı değiştir.
- Adım 1’e geri dön.
- Evet:
Algoritmanın ilk bakışta gereksiz derecede detaylı olduğunu fark etmişsinizdir: Sadece “bir bardak bul ve eline al” diyemez miydik mesela? Maalesef hayır. Tanımımıza geri bakacak olursak, bir algoritma “iyi tanımlanmış kurallar”a sahip olmalıdır, burada yaptığımız da bu. Bilgisayarlar insanlar gibi değildir; bir insana “bir bardak bul” deyince, o insan bulana kadar evin etrafında dolaşması gerektiğinin ima edildiğini anlayabilir ama bir bilgisayar bunu yapamaz. Bu yüzden her adımın çok iyi tanımlanması lazım.
Bölüm 2: Her Problemi Çözmek İçin Sadece Bir Algoritma mı Vardır?
Kesinlikle hayır. Örneğin 23 işlemini çözecek birbirine denk iki algoritmaya bakalım:
Algoritma 1:
- X = 1
- 3 kere bunu yap:
- X = X * 2
- İşlemin sonucu X değişkeninin değeridir.
Algoritma 2:
- X = 2
- X = X + X
- X = X + X
- İşlemin sonucu X değişkeninin değeridir.
Birinci algoritma 3 kere çarpma işlemini kullanarak sonuca ulaşmayı seçmişken, ikinci algoritma sadece 2 kere toplama yaparak aynı sonuca (8) ulaşır.
Peki aynı problem için birden çok algoritma olmasının nedenleri nelerdir? Bu yazıyı kısa tutmak açısından en bariz nedene bakalım: Performans. Örneğin bu örnekte, algoritma 2 sadece 2 matematiksel işlem gerektirirken algoritma 1 ise 3 işlem gerektirir. Bilgisayar algoritma 2’yi kullanarak sonuca daha hızlı ulaşacaktır.
Bilgisayar bilimi dalında önemli ve yaygın problemleri kısa sürede çözebilen veya belirli bir durumda aranan özelliklere sahip algoritmalar yaratmaya yoğunlaşan bir çok araştırma vardır. Bu araştırmalar genellikle matematiksel kuralları fazlasıyla zeki bir şekilde kullanan algoritmalar üretir. Maalesef algoritmaların basit bir özeti olan bu yazıda bu konulara girmeyeceğiz.
Bölüm 3: Bazı Ünlü ve Önemli Problemler ve Algoritmalar
Her ne kadar bir yazılım mühendisi günlük işinde spesifik olarak üzerinde uğraştığı programla alakalı problemler için algoritmalar tasarlayacak olsa da, bazı problemler o kadar yaygın ve önemlidir ki, bu problemlere en verimli algoritmaları bulmak çok büyük akademik ve profesyonel değer taşır. Bu tür algoritmalar genellikle daha önce bahsettiğim araştırmalarda tasarlanır.
Bilgisayar biliminde muhtemelen en ünlü problemlerden biri “sıralama problemi”dir. Örneğin algoritmaya doğru sırada olmayan bir liste verilirse: [7, 4, 3, 5, 9, 4], algoritma bu listeyi yükselen (veya alçalan) sıraya koyacak ve sonuç olarak [3, 4, 4, 5, 7, 9] verecektir. Bunu yapabilen bir çok algoritma vardır. Her ne kadar çok verimli algoritmalar bulunsa da [Quicksort (Hızlı Sıralama), Mergesort (Birleştirme Sıralaması) ve kısmen daha yeni olan Timsort] bunlar bu yazı için fazla karmaşık olduğu için, sıralama algoritmalarının mantığını anlayabilmek için en basit ve en düşük performanslı algoritmalardan Bubble Sort (Kabarcık Sıralaması) algoritmasına bir bakalım.
Örneğin algoritma daha önce verilen örnekteki listeyi sıralayacaksa, önce listenin ilk iki elementiyle başlar (yani 7 ve 4) ve bu soruyu sorar: İkinci element, birinci elementten daha mı büyük? Eğer cevap evet ise, algoritma bir şey yapmayacak. Eğer cevap hayır ise (bu durumda cevap tabii ki hayırdır), algoritma bu iki elementin listedeki yerini değiştirir. Bu durumda yeni liste böyle olur: [4, 7, 3, 5, 9, 4]
Algoritma sonrasında bütün elementleri bitirene kadar bir sonraki iki elemente geçip aynı işlemi uygular. Örneğin 7 ve 4’ten sonra, 7 ve 3 elementlerine geçilir. Bütün liste elementleri bir kere bu işlemden geçtikten sonra, liste bu hâli alır: [4, 3, 5, 7, 4, 9]
Fark edeceksiniz ki, 9 elementi olması gerektiği sırada, yani son sırada olacaktır. Yukarıda anlatılan adımları bütün liste elementleri için ikinci kez yapınca [3, 4, 5, 4, 7, 9] sonucu alınır. Bu sefer de sondan ikinci element (7) olması gerektiği pozisyondadır. Bu adımlar listedeki element sayısı (6) kere uygulandıktan sonra, bütün liste elementleri doğru sıraya koyulmuş olur ve algoritma durabilir.
Sıralama problemleri dışında, “arama problemi” de önemlidir. Bu problem, bir listede istenilen bir elementin olup olmadığını, ve eğer varsa kaçıncı sırada olduğunu bulur. Mesela [4, 6, 7, 8] listesinde 6 elementi 2. sıradadır. Bu problem için en basit algoritma, her elemente teker teker bakıp aranan element olup olmadığını sormaktır. Daha iyi bir algoritma Binary Search’tür (İkili Arama). Maalesef ki bu yazı fazla uzamaya başladığı için bu algoritmaya girmeyeceğim, fakat eğer algoritmalar ilginizi çekmişse, bu algoritmayı araştırmanızı öneririm.
Umarım bu yazıyı beğenmişsinizdir ve bilgisayar bilimi dışındaki insanların anlayabileceği bir seviyede yazmayı başarabilmişimdir. Bir sonraki yazımda bahsetmemi istediğiniz bir konu varsa, veya algoritmalar hakkında aklınızda başka sorular da varsa yorumlarda bunu yazmanız beni çok mutlu eder.
Merhaba yazınız çok hoş ve açıklayıcı olmuş. C veya Phyton gibi programlama dillerinden de bahsettiğiniz bir yazınızı okumayı da çok isterim 🙂