Algoritma Nedir?
Yazılım ile uğraşanların ya da bir yazılımcı ile azıcık bile olsa sohbet etmiş herkesin duyduğu bir kelimedir algoritma. Peki bu kelimenin anlamı nedir? Ne işe yarar? Yenir mi, içilir mi yoksa üzerine binip gezilir mi?
Tabii ki böyle bir şey değildir. Wikipedia‘da “Belli bir problemi çözmek veya belirli bir amaca ulaşmak için çizilen yol” şeklinde tanımlanıyor. Bu tanım yanlıştır demiyorum elbette ama benim daha güzel bir tanımım var! Algoritma, kendini tanımaktır/anlamaktır (ve gerekiyorsa yeniden yapılandırmaktır). Bu kısa tanım çok açıklayıcı olmadı biliyorum bu yüzden biraz daha açmam gerek.
Algoritma tanımını açmadan önce yazılımın ne olduğundan kısaca bahsedeyim. Yazılım işinin insan (kullanıcı) tarafı ve makine tarafı olmak üzere iki yönü vardır. Konumuz gereği ben şimdi makine yönünden bahsedeceğim. Yazılımın insan yönü ise başka bir makale konusudur.
Yazılımın makine tarafı, özünde tercümanlık işidir. Yani elimizdeki bilgiyi (girdiler, iş akışları, süreçler vb.) yabancı bir dil yardımı ile yabancı bir kimseye (yazılım işinde bu kimse bilgisayardır) anlatma eylemidir. Yazılım işinde bir şeyler anlattığımız kişi, otizmli bir insana benzer. Yapabildiği bazı şeyler (hızlı hesaplama ya da söylediklerinizi harfi harfine aklında tutabilme becerisi gibi) sizde muazzam bir hayranlık oluştururken, anlatımlarınızda bulunan boşlukları kendi kendine dolduramaması, ille de herşeyi net bir biçimde anlatmanızı beklemesi, net olarak anlat(a)madığınız şeyleri yap(a)maması sizi rahatsız eder, hatta zaman zaman çileden bile çıkarabilir. İşimiz yazılım (tercümanlık) gereği karşımızda bulunan bilgisayara (sanki otizmli insana anlatıyormuş gibi) hedeflediğimiz çıktıyı(anlatmamız istenilen) elde etmek için yapılacak işleri uygun bir şekilde anlatmamız gerekir.
İşte algoritma yani kendimizi tanımamız/anlamamız burada devreye girer. İnsan olarak sahip olduğumuz bir çok beceri ve yapabildiğimiz çok fazla şey var ancak çoğu zaman yaptığımız şeyleri üzerinde düşünerek yapmayız. Örnek verecek olursak; Türkçe konuşan herkes herhangi bir kelimeyi hecelerine ayırma becerisine sahiptir. Ama hecelere ayırma işlemini nasıl yapacağımızı düşünerek yapmayız. Sadece heceleriz. Peki, heceleme işlemini, heceleme becerisine/bilgisine sahip olmayan birine nasıl anlatacağız? Bu işi yapmak için önce bilinçsiz şekilde yaptığımız hecele eylemini bilinçli yapabildiğimiz bir hale çevirmeliyiz. Yani kendimizi tanımalı/anlamalıyız.
Bilinçsiz bir şekilde yaptığımız bir şeyi bilinçli hale nasıl çevirebiliriz yani kendimizi daha iyi nasıl anlarız. Eğer deneyimli bir yazılımcı iseniz zaman içinde (deneyim edindiğiniz süreçte) beyninizi, bu işlemleri hızlıca yapacak şekilde yönlendirmişsinizdir/eğitmişsinizdir. Peki yeni başlamış bir yazılımcı iseniz yada yazılımcı bile değilseniz bu süreci nasıl işleteceksiniz?
Gelin bu bilinçli hale çevirme sürecini basitten zora 3 örnekle inceleyelim.
- Çay demleme
Çay demleme işlemi en temel seviye algoritmalardandır. İçinde açıklığa kavuşması gereken bir yöntem yada düşüncemizi yeniden yapılandırmamızı gerektiren bir unsur yoktur. Yapılacak işlemler ve yapılma şartları vardır. Çay demleme işlemi, eylemlerin adımlanması ile halledilir. Bu adımlar aşağıdaki gibidir.
- Mutfağa git
- Dolabın kapağını aç
- Çaydanlığı çıkar
- Çaydanlığın altına su koy
- Ocağı yak
- Çaydanlığı ocağın üstüne koy
- Kaynayana kadar bekle
- Demliğe çay koy
- Demliğe çaydanlığın altındaki kaynar suyu koy
- Alt ve demliği ocağa koy
- 15 dk bekle.
Bu adımlar ile çayımızı demlemiş olduk. Yaptığımız işlem özünde, yapılan işi, anlamlı küçük parçalara ayırıp bir düzen içinde uygulamaktı.
- Batak oyunu kart dağıtımı (İskambil kağıtlarının 4 kişiye dağıtılması)
Bu algoritma bir öncekine göre daha zor bir algoritmadır. Bunun nedeni ise insan olarak kolay yaptığımız bazı işlemlerin makineye anlatımı, yaptığımız kadar kolay değildir. Bu nedenle düşünce yapımızı değiştirmemiz gerekir. Gerçek hayatta, batak oyunu için kartları dağıtma işlemini algoritmaya dökersek;
- Kartları karıştır
- Birinci kişiye bir kağıt ver
- İkinci kişiye bir kağıt ver
- Üçüncü kişiye bir kağıt ver
- Dördüncü kişiye bir kağıt ver
- 2-5 arasındaki işlemleri kartlar bitene kadar tekrar et.
Bu algoritma yanlış bir algoritma değildir ama kartları karıştırma işlemi kendi başına bir algoritmaya sahiptir ki o algoritmayı çözmek ve uygulamak yerine yaklaşık aynı performansta(büyük ihitmalle daha yüksek performansta) çalışacak başka bir algoritma yazmayı tercih ederiz. Bu algoritma ise;
- Rastgele bir kart seç (rastgele, halihazırda (neredeyse) her programlama dilinin içinde bulunan bir komut olduğu için tekrardan keşfetmeden olduğu gibi kullanabiliriz)
- Seçilen kartı birinci kişiye ver
- Rastgele bir kart seç
- Seçilen kartı ikinci kişiye ver
- Rastgele bir kart seç
- Seçilen kartı üçüncü kişiye ver
- Rastgele bir kart seç
- Seçilen kartı dördüncü kişiye ver
- 1-8 arasındaki işlemleri kartlar bitene kadar tekrar et.
Burada yaptığımız insan için kolay ama makineye anlatımı zor olan, “karıştırma” işlemini kullanmaktan kaçınmak için mevcut düşünce yapımızı yani süreci yeniden şekillendirip uygulamak oldu. Bu algoritmayı bir önceki algoritmadan zor kılan şey, bu yeniden yapılandırma işlemimizdir.
- He-ce-le-me
Bu algoritma, üniversite 3. sınıfta yazıdan-sese uygulaması yapmayı denersem nelere ihtiyacım olur diye düşünürken “Türkçe aslında harflerden değil hecelerden oluşan bir dildir. Yani çıkardığımız her ses bir hecedir, dolayısı ile bütün hecelerin, vurguları ile beraber ses aralıkları belirlenirse çok kolay bir şekilde Türkçe yazıdan-sese uygulaması yazılabilir.” çıkarımımdan doğdu. Bu çıkarımın doğruluğu yada etkinliği tartışılır tabii ki ama bu çıkarımı doğru kabul edersek yazıdan-sese uygulaması yapmak şu şekilde olacaktır;
- Cümleyi kelimelere ayır
- Her kelimenin
- Her hecesi için
- İlgili sesi çal
- Her hecesi için
Bu akışta, bir cümleyi kelimelerine ayırma işlemi kolaydır. Boşluklara göre bölerek bir dizi oluşturabiliriz. Ama heceleme işlemine geldiğimiz zaman işimiz zorlaşacak çünkü dilimize en kolay gelen şekilde bir kelimeyi hecelerine ayırırız ama makine, insan diline sahip olmadığı için kendisine kolay gelen şekilde ayırmak gibi bir yeteneğe de sahip değildir. Peki bu zorluk karşısında ne yaptım? Nasıl hecelediğimizin cevabını aradım ve aradığım cevabı istatistik yardımı (dağılım düzeni) ile buldum. Hecelerin içindeki harf miktarları çeşitli olacak şekilde 20-30 kelimeyi hecelerine ayırdım. Sonra bu hecelerde bulunan sessiz harflere “0” sesli harflere “1” dedim. İlk bakışta gördüğüm (ki aslında ilk okul zamanında birçoğumuza öğretildiği şekilde) her hecede yalnızca bir tane “1” olduğu idi. İkinci farkındalığım; sessiz harflerin dağılım şeklinde, tek “0” ile başlayanların ezici bir çoğunluk olduğu idi. “1” ile başlamayan hecelere baktığım zaman ise bu hecelerin ya ilk hece yada “1” ile biten hecenin ardından geldiği idi (Ör: Sa-at). Son tespitim ise birden çok “0” ile başlayan hecelerin yalnızca ilk hece olması idi.
Bu tespitler ışığında şu sonuca ulaştım; “Mümkün olduğu sürece her hece tek sessiz ile başlar.” Bu sonucu ise şu şekilde bir algoritmaya döktüm;
- İlk sesli harfi bul
- Eğer bulamazsan bu bir kelime değildir
- İkinci sesli harfi bul
- Eğer bulamazsan metnin tümü hecedir.
- İki sesli harf arasındaki harf sayısını bul
- Ardışık değerler ise ikinci sesli harfe kadar olan kısım hecedir.
- Diğer durumlarda ise ikinci sesli harfin bir gerisindeki harfe kadar olan kısım hecedir. (Sonucun kullanıldığı işlem)
- İlk heceyi yok sayarak, 1-3 arası adımları bütün 2. adım başarısız olana kadar tekrar et.
Yukarıda anlattığım örneklerde; “yaptığımız işin adımları üzerine düşünüp sıraya koyduk”, “işi yapış şeklimizi daha kolay anlatılabilecek bir formata soktuk” ve son olarak “kurallarına hakim olmadığımız bir düzenin kurallarını netleştirdik”. İşte algoritma dediğimiz şey bu işlemlerin bir yada bir kaçıdır.
Gelecek makale de görüşmek dileği ile.
1 Comment