Bölüm 2 Algoritmalar 2.1 Giriş İnsanlar ilk çağlardan beri istek veya arzularını ifade etmek çeşitli yöntemler ile anlatmaya çalışmışlardır. İlk olarak çeşitli şekil ve simgeler daha sonra ise yazının bulunmasıyla bu istek veya arzularını yazı ile ifade etmeye başlamışlardır. Tüm bu çabaların amacı insanlar birbirleri ile iletişim kurmak, anlatmak istediklerini başkalarına aktarmak veya kalıcılığını sağlamak olabilmektedir. Değişik toplumlarda dil farkı olması bazı durumlarda insanları ortak dil arayışı içerisine itmiştir. Fakat bu durum çok fazlar etkili olmamıştır. Günümüzde ortak konuşma ve yazı dili yerini genel kabul görmüş konuşma ve yazı diline bırakmıştır. Bilgisayar dünyasında durum biraz daha farklıdır. İletişim her geçen gün biraz daha fazla gelişmekte ve uygulama alanları değişiklik göstermektedir. Internet ve bilgisayar ağlarının dünyayı sarması, bilgisayar dünyasında bir devrim olarak kabul edilmektedir. Sanayi devriminin modern toplum oluşmasında bir işaret (mihenk) taşı olduğu gibi Internet bilgisayar dünyasındaki gelişimin bir işaret taşıdır. Ortak haberleşme dilinin gelişimi bu aşamada öne çıkmaktadır. Herkes acaba nasıl ortak anlaşabilecekleri bir dili kullanacak ve kabul edecektir. Bu konu ilerdeki bölümlerde ayrıntılı olarak tartışılacaktır. Algoritma kelime anlamı bu günkü Irak doğumlu matematikçi Muhammet ibni Musa El-Harezmi tarafından M.S. 825 yılında aritmetik hesap yöntemlerinin kurallarının ve aşamalarının gösterildiği Kitab el cebr ve l mukabele adlı kitabında bahsedilmiştir. İlk zamanlar Algorizme olarak kullanılan kelime artık günümüzde algoritma olarak telafuz edilmektedir. Algoritmalar bir işi veya yöntemi simgeler yardımıyla açıklamak için kullanılan işaret dili olarak tarif edilebilir. Bilgisayar dünyasında bu işler bir yazılımın uygulanma veya geliştirilmesi aşamasında tarif edilecek bilgileri simgelemektedir. Bir yazılımcı yeni başlayacağı bir projeyi bilgisayar programlama dili ile yazmaya başlamadan önce bu projenin genel çatısını oluşturur. Oluşturulan bu çatı yazınsal bir dil olabildiği gibi bir simgesel olarak 26
da ifade edilebilir. Yazınsal ifadeler kodları, alt programları veya fonksiyonları gösterirken genelde karmaşıklaşabilmektedir. Sade ve anlaşılabilir bir gösterimden yararlanmak isteyebilirler. Bu durumda bilgisayar yazılımı geliştirenler çeşitli şekillerin olduğu ve herkes tarafından benimsenen bir gösterimi kullanmaktadır. Algoritmalar Harezmi den çok önceleri bilinmekteydi. Eski yunan uygarlığında yaklaşık olarak M.Ö. 300 yıllarında Öklid (Euklides) hesap yöntemi olarak bilinen basit bir algoritma şeklinde tanımlanmakta idi. Bu algoritmada yöntem iki sayının en büyük ortak böleninin bulunduğu hesaptır. Öklid (Euklides) algoritması olarak bahsedebileceğimiz bu yöntemde verilen iki sayıyı beraber bölen en büyük sayının bulunmasıdır. Öklid (Euklides) algoritmasını uygulamak istediğimiz iki sayı için şu şekilde yapılır; Adım 1) Büyük sayı A küçük sayı B ye bölünür Adım 2) Küçük sayı B kalan sayı çifti oluşturulur Adım 3) Küçük sayı B kalan sayıya bölünür Adım 4) Tam olarak bölünme sağlanana kadar Adım 2 ye geri dön. Yukarıdan da anlaşıldığı gibi aslında temel bir algoritma işlemini gerçekleştirmektedir. Bu sayı çiftleri arasıda sistematik olarak uygulanabilen kayıtlı ilk hesap yöntemidir. Sayı çiftlerinin değeri ne kadar yüksek olur ise çözüm süresinin de uzayacağı kesindir. Sonsuz büyüklükte iki sayının bile bu yöntem ile sonlu olarak bölünebileceği bilimsel olarak araştırılması gereken önemli bir konudur. Çözüm süresi sayıların büyüklüğü ile çok yakından ilgili olması bu yönteme daha büyük ilgi uyandırmaktadır. Bu algoritmayı sayısal olarak çözmek yerine belirlenen büyüklükte sayılara uygulanabilirliğini akış seması olarak göstermek akılcı bir yaklaşım olacaktır. Öklid (Euklides) algoritması günümüzde matematik dahil bir çok bilim dalında kullanılan yöntemlerin en basitine bir örnek olarak kabul edilebilir. 20. yüzyıla kadar bilinen pek çok yöntemde algoritma yöntemi içerisinde görülmemiştir. 1950 ve sonrasında ise akış diyagramları ve şekilsel anlatımlarında önem kazanması artık algoritmaları şekilse olarak anlatıma ihtiyaç duyulması da akış diyagramlarının önemini arttırmıştır. Akış diyagramları bu ve benzeri bir çok algoritmayı şekilsel olarak ifade etmekte ve anlaşılırlığını kolaylaştırmaktadır. 27
Şekil 2.1. Öklid (Euklides) Algoritmasının Akış Diyagramı Bilgisayar programlama dilleri ile bilgisayar programlamanın zor olduğu bilinmektedir. Bilimsel çalışmalarda ise bu zorluğun derecesi daha da artmaktadır. Örneğin birinci dereceden bir bilinmeyenli bir denklemi çözmek için kullanılan yöntemin basit olduğunu bilinmektedir. Eğer denklemimiz ikinci dereceden ve üç bilinmeyenli olsaydı ne yapmalıyız veya doğrusal olmayan bir fonksiyonun eğrisinin belirli aralıklardaki değerini hesaplamak istiyorsak ne yapmalıyız. Bu durumlarda bilgisayar programlarından yararlanıyoruz fakat bilgisayarlar bu problemleri nasıl çözüyor. Birkaç bilgisayar kodunu ardışık olarak yazmaya kalksak acaba bize sonuç verir mi. Bu sorunun cevabını az çok hepimiz hayır olarak vermekteyiz. Bilgisayarlara karşılaştığımız problemleri belirli bir yöntem ve sıra ile bilgisayarın anlayabileceği kodlar halinde vermeliyiz. Bu kodların verilmesi mantıksal bir süreç izlenerek yapılmaktadır. Bilgisayar programlama dilleri ile problemleri çözmek için iki aşamadan bahsedebiliriz. Birinci aşamada problemin çözümünün el ile yapıldığı (analitik çözüm) aşamasıdır. Bu aşamada problem her zaman çözülemeyebilir veya çözüm süresi çok uzun zaman alabilir. Genelde bu aşama algoritmanın geliştirilmesinden öncedir ve algoritmanın geliştirilmesine bir hazırlık oluşturur. İkinci aşama uygulama aşamasıdır. Burada algoritma 28
geliştirilmiş artık problem çözülmek üzeredir. Problem adımlara ayrılmış ve parçalı olarak çözüm yöntemleri denenmeye çalışılmaktadır. Ele Alınan Problem Problem Çözüm Aşaması Çözümün Algoritma şekline gelmesi Uygulama Aşaması Bilgisayar programlama dili kodları Şekil 2.2 Algoritma Geliştirme Süreci. 2.2 Algoritma Geliştirme Kılavuzu Bu bölümde algoritmalardan bahsedilirken bilgisayar programlama ile ilgili olan algoritmalardan bahsedilecektir. Geliştirilen algoritmalar ise yalnızca bilgisayar programlama dillerine ait olan kodları içeren algoritmalar olacaktır. Algoritmalar geliştirilirken dikkat edilmesi gereken çeşitli durumlar vardır. Bu durumları şu şekilde açıklayabiliriz; i) Geliştirilen bilgisayar programlama algoritmalar şekil olarak basit ve anlaşılabilir olmalıdır. ii) Bilgisayar programlama kodlarını açıkça ifade edebilmelidir. iii) Genel kabul görmüş olan simgesel gösterimler kullanılmalıdır. iv) Birden fazla bilgisayar programlama diline uygulanabilir olmalı. v) Aşamalar halinde gerçekleştirilecek programlama diline ait gösterimleri içermeli. vi) Bilgisayar programlama dillerine uygulanabilmeli. vii) Bilgisayar programlama kodları yenilendiğinde veya değiştirildiğinde algoritmaya ait şekillerde de değişiklik yapılabilmeli. 2.3 Bilgisayar Programlama Dillerinde Kullanılan Algoritma Şekilleri (Akış Diyagramları) Algoritmaların belirlenen özel şekiller ile ifadesine akış diyagramlarının oluşturulması olarak tanımlanabilir. Akış diyagramları geliştirilen bir algoritmayı şekilsel olarak ifade etmekte ve anlaşılabilirliğini kolaylaştırmaktadır.akış diyagramlarını gösterir çeşitli şekiller vardır. Bu şekiller işlevlerin simgesel gösterimidir. Bilgisayar programlama dilinde kullanılan programlama kodları bu şekiller ile basit olarak gösterilerek programı yazan programcı yanı sıra başka bir programcı tarafından incelendiğinde anlaşılabilirliğini kolaylaştırmak veya programcı uzun süre önce yazdığı program kodunu unutmuş ise hatırlamasına yardımcı olmak 29
amacına da sahiptir. Bilgisayar programlama dillerinde kullanılan ortak simgesel ve şekiller programlama dilinin gerçekleştireceği kodlar vardır. Genel olarak bilgisayar programlama dillerinde programlamaya başlarken kodlar yazılmadan önce belirlenen algoritma akış diyagramları ile ifade edilir. Akış diyagramları belirlenen bilgisayar programlarının kaynak kodlaması yapılır. Bu işlem programın kaynak kodlarının geliştirilmesi için gerekli olan öngörü ve işlem kolaylığını sağlar. Akış diyagramı oluşturulan bilgisayar programında algoritmanın nasıl uygulanacağının bilinmesi veya daha kısa bir yolu var ise bu şekilsel olarak görülmesi konusunda yardımcı olmaktadır. Algoritmalar bir iş veya işlemin nasıl yapılacağını gösteren yazı veya şekillerden oluşur. Tablo 2.1 Akış Diyagramları Sembol Açıklama Program üzerinde işlem yapılacak Program karar durumunda, program karar veriyor Programa doküman giriş/çıkışı Programa veri giriş/çıkışı yapılacak Programdaki veriler kaydedilecek veya okunacak Program bilgisayarın iç hafızasından bilgi alacak veya okuyacak Program işaret edilen cihaza çıktı / sonuç gönderecek Programa El ile veri girişi yapılacak 30
Program değişkeleri döngü işlemine tutacak Programa bağlantı yapılacak veya diğer sayfaya geçiş için bağlantı noktası Bilgisayar ile problem çözmek için birden fazla yöntem olması algoritma kullanılmasını zorunluluk haline getirmektedir. Bazı durumlarda yazı ile algoritmanın geliştirilmesi olanaksız olabilmektedir. Bu durumda şekiller ile anlatmak istediğimiz işlemleri sembolize ederek işlevleri anlatırız. Bir bilgisayar programının en basit hali ile akış diyagramlarında gösterimi Şekil 2.3 deki gibidir. Başla Veri gir K:= i*j K > t Sonuç GÖster Dur Şekil 2.3. En Basit Algoritma Gösterimi 31