Algoritma nedir sorusunun cevabı aslında oldukça basittir: algoritma, bir problemi çözmek için izlenen, adım adım tanımlanmış ve net talimatlar dizisidir. Yazılım dünyasında karşılaştığımız her program, arka planda çalışan bir veya birden fazla algoritmanın belirli bir programlama dilinde ifade edilmiş hâlidir. Bu yazıda algoritmanın ne olduğunu, hangi temel özellikleri taşıması gerektiğini, algoritmaların hangi veri yapıları üzerinde çalıştığını ve bu kavramları Python ile Java gibi dillere nasıl bağlayabileceğinizi sade bir dille ele alacağız.
Algoritma ve veri yapısı kavramlarını birbirinden ayrı düşünmek mümkün değildir; biri "ne yapılacağını", diğeri "verinin nerede ve nasıl tutulacağını" belirler. İkisini birlikte anlamak, kod yazarken sadece çalışan değil, aynı zamanda verimli ve sürdürülebilir çözümler üretmenin ilk adımıdır.
Algoritma Nedir? Gerçek Hayattan Bir Örnekle Başlayalım
Algoritma kavramını en iyi anlamanın yolu, onu günlük hayattan bir örnekle somutlaştırmaktır. Bir yemek tarifini düşünün: "Suyu kaynat, makarnayı ekle, on dakika bekle, süz, sosla karıştır." Bu talimatlar sırasıyla uygulandığında her zaman aynı sonuca, yani pişmiş bir makarnaya ulaşırsınız. Talimatların sırası değişse veya bir adım atlansa sonuç da değişir. İşte bu adım adım, belirli bir sırayla uygulanan talimat dizisi, algoritmanın gerçek hayattaki en net karşılığıdır.
Benzer şekilde bir yol tarifi de algoritmatik bir yapıya sahiptir: "Ana caddeden düz git, üçüncü sokaktan sağa dön, ikinci binada dur." Bu talimatları takip eden herkes, doğru uygulandığında aynı hedefe ulaşır. Yazılım dünyasında da durum tamamen benzerdir. Bir problemi çözmek istediğimizde önce o problemi çözecek adımları kafamızda ya da kağıt üzerinde sıralarız; bu sıralanmış adımlar bütünü algoritmadır. Algoritma, bir problemi çözmek için izlenen adım adım, net talimat dizisidir ve bu talimatlar herhangi bir programlama diline bağlı değildir; kavramsal düzeyde vardır.
Peki program ile algoritma arasındaki fark nedir? Program, algoritmanın belirli bir programlama dilinde -örneğin Python, Java, C# veya başka bir dilde- yazıya dökülmüş, çalıştırılabilir hâlidir. Yani önce algoritmayı tasarlarsınız, sonra bu algoritmayı seçtiğiniz dilin söz dizimiyle (syntax) ifade edersiniz. Aynı algoritma Python'da birkaç satırla, Java'da farklı bir yapıda yazılabilir; ama arkasındaki mantık, yani çözüm adımları aynı kalır. Bu nedenle iyi bir yazılımcı olmak, önce bir dilin kurallarını ezberlemek değil, problemi doğru adımlara bölebilmek, yani algoritmik düşünebilmektir. Bir tarifte olduğu gibi, yazılımda da adımların sırası, açıklığı ve tekrarlanabilirliği sonucu doğrudan belirler.
Bir Algoritmanın Taşıması Gereken Temel Özellikler
Her adım adım talimat dizisi, teknik anlamda bir algoritma sayılmaz. Bir sürecin gerçek anlamda algoritma olarak kabul edilebilmesi için belirli özellikleri taşıması gerekir. Bu özellikleri sırasıyla inceleyelim.
Girdi (input): Bir algoritma, işleyeceği veriyi dışarıdan alır. Makarna tarifinde girdi; su, makarna ve tuzdur. Bir sıralama algoritmasında girdi, sıralanacak sayılar listesidir. Girdisi olmayan bir süreç genellikle işlenecek bir şey içermez.
Çıktı (output): Algoritma, girdiyi işleyerek anlamlı bir sonuç üretmelidir. Tarifte çıktı pişmiş makarnadır; sıralama algoritmasında çıktı, sıralanmış listedir. Bir sonuç üretmeyen adımlar dizisi amacına ulaşmamış demektir.
Sonluluk: Bir algoritma, sonlu sayıda adımda tamamlanmalı, yani bir noktada bitmelidir. Tarifte "on dakika bekle" adımı belirli bir sürede sona erer. Eğer bir süreç "sürekli tekrar et" der ama hiçbir bitiş koşulu tanımlamazsa, bu bir algoritma değil, sonsuz döngüye giren hatalı bir tasarımdır. Yazılımda bu tür bir hata, programın donmasına veya sistem kaynaklarının tükenmesine yol açar.
Kesinlik: Her adım, yorum gerektirmeyecek kadar açık ve tek anlamlı olmalıdır. "Suyu biraz ısıt" ifadesi belirsizdir; "suyu 100 derecede kaynat" ifadesi kesindir. Bir tarifte "biraz tuz ekle" gibi muğlak bir adım, kişiden kişiye farklı sonuçlar doğurur; bu da o sürecin güvenilir bir algoritma sayılmasını zorlaştırır. Yazılımda kesinlik ilkesi, kodun her koşulda öngörülebilir çalışmasını sağlar.
Verimlilik: Bir algoritma doğru sonucu üretse de bunu mümkün olan en az kaynakla (zaman ve bellek) yapabilmelidir. Aynı hedefe iki farklı yoldan gidilebiliyorsa, daha az adım gerektiren ve daha az kaynak harcayan yol tercih edilir. Bu kavramı ileride Big O notasyonuyla daha detaylı ele alacağız. Özetle, girdisi belirsiz, çıktısı olmayan, sonsuza uzayan veya adımları yoruma açık bir süreç, ne kadar mantıklı görünse de teknik anlamda bir algoritma adayı olmaktan öteye geçemez.
Temel Veri Yapıları: Algoritmaların Çalıştığı Zemin

Algoritmalar boşlukta çalışmaz; verinin bellekte nasıl tutulduğu, algoritmanın hızını ve karmaşıklığını doğrudan belirler. Bu noktada devreye veri yapıları girer. Veri yapısı, verilerin düzenlenme, saklanma ve erişilme şeklidir; doğru veri yapısını seçmek, çoğu zaman doğru algoritmayı yazmaktan daha belirleyici olabilir.
En temel veri yapılarından biri dizi (array)'dir; bellekte art arda dizilmiş, sabit sıralı elemanlardan oluşur. Bağlı liste ise her elemanın bir sonraki elemanın adresini tuttuğu, dinamik olarak büyüyüp küçülebilen bir yapıdır. Yığın (stack), son giren elemanın önce çıktığı (LIFO) bir yapıyken; kuyruk (queue) ilk giren elemanın önce çıktığı (FIFO) mantıkla çalışır. Ağaç yapıları, verileri hiyerarşik ilişkilerle organize eder; hash tablosu ise anahtar-değer eşlemesiyle veriye çok hızlı erişim sağlar.
| Veri Yapısı | Kullanım Alanı | Avantaj/Dezavantaj |
|---|---|---|
| Dizi (Array) | Sabit boyutlu koleksiyonlarda hızlı indeksli erişim (örn. bir sınıftaki not listesi) | Erişim hızlı; ancak boyut değiştirmek maliyetlidir |
| Bağlı Liste | Sık ekleme/silme yapılan dinamik listeler (örn. müzik çalma sırası) | Ekleme/silme kolay; rastgele erişim yavaştır |
| Yığın (Stack) | Geri alma (undo) işlemleri, fonksiyon çağrı takibi | Basit ve hızlı; sadece en üstteki elemana erişilir |
| Kuyruk (Queue) | Sıraya alınan görevler, yazıcı iş sırası | Adil sıralama sağlar; ortadan erişim zordur |
| Ağaç | Dosya sistemleri, hiyerarşik veri (klasör yapıları) | Hızlı arama sağlar; dengesiz büyürse performans düşer |
| Hash Tablosu | Anahtar-değer eşlemeleri (örn. kullanıcı adı-şifre kontrolü) | Erişim çok hızlıdır; bellek kullanımı fazla olabilir |
Bu yapılardan hangisinin ne zaman kullanılacağını bilmek, sadece teorik bir bilgi değil, pratik bir karar verme becerisidir. Öğrendiğiniz kavramları ne kadar içselleştirdiğinizi görmek isterseniz algoritma bilgi testi ile kendinizi kısa sürede sınayabilirsiniz. Bir sonraki bölümde, algoritma ile veri yapısının birlikte nasıl çalıştığını somut örneklerle inceleyeceğiz.
Algoritma ve Veri Yapısı Birlikte Nasıl Çalışır?
Bir algoritma yazarken attığın en kritik karar, çoğu zaman algoritmanın kendisi değil, üzerinde çalışacağı veri yapısıdır. Aynı problemi iki farklı veri yapısıyla çözdüğünde sonuç genellikle birbirinin aynısıdır; aradığın eleman bulunur, listeleme yapılır, sıralama tamamlanır. Ama bu iki çözüm arasında gözle görülmeyen, sistemin büyüklüğü arttığında ise fazlasıyla hissedilen bir performans farkı oluşur.
Somut bir örnekle düşünelim: 10.000 öğrenci numarası içeren bir listede belirli bir numarayı arıyorsun. Eğer bu veriler sıradan bir dizi (array) içinde tutuluyorsa, algoritma numarayı bulana kadar listeyi baştan sona, sırayla kontrol etmek zorunda kalır. En kötü senaryoda 10.000 karşılaştırma yapılır. Aynı veriyi bir hash tablosu içinde tutsaydın, arama işlemi teorik olarak tek bir adımda, sabit sürede sonuçlanabilirdi; çünkü hash tablosu veriyi konumuna göre değil, bir anahtar üzerinden hesaplayarak doğrudan erişime izin verir. İki yöntem de "numarayı bul" görevini yerine getirir, ancak biri saniyenin çok küçük bir kesrinde biterken diğeri veri büyüdükçe fark edilir şekilde yavaşlar.
Bu fark, algoritma öğreniminin neden sadece "kod yazmak" değil, "doğru yapıyı seçmek" olduğunu gösterir. Bir bağlı liste, sıraya eleman eklemek ve çıkarmak için diziden daha esnek olabilir; bir yığın (stack), geri alma işlemlerinde doğal bir çözüm sunar; bir kuyruk (queue) ise sırayla işlenmesi gereken görevler için idealdir. Hangi yapının hangi problemde daha avantajlı olduğunu görmek, zamanla deneyimle gelişen bir sezgi haline gelir.
Bu noktada kendine dürüstçe sorman gereken soru şu: Bir problemle karşılaştığında hangi veri yapısını seçeceğini ne kadar hızlı fark edebiliyorsun? Bu sezgini ölçmek istersen ücretsiz kodlama bilgisi testi ile mevcut seviyeni görebilir, hangi konularda daha fazla pratiğe ihtiyacın olduğunu net biçimde tespit edebilirsin.
Zaman ve Alan Karmaşıklığı: Big O Notasyonunu Basitçe Anlamak

Big O notasyonu, karmaşık bir matematik formülü değil, aslında çok basit bir soruya cevap veren bir dildir: "Veri miktarı büyüdükçe bu algoritma ne kadar yavaşlayacak?" Bu soruyu cevaplamak, bir algoritmanın küçük bir veri setinde nasıl çalıştığından çok, gerçek dünyadaki büyük veri setlerinde nasıl davranacağını öngörmek için gereklidir.
Bu notasyonu günlük hayattan tanıdık örneklerle somutlaştırmak en kolay yoldur:
- O(1) — Sabit zaman: Telefonunun kısayol tuşuna basıp aradığın kişiyi anında araman gibidir; veri ne kadar büyürse büyüsün işlem süresi değişmez.
- O(n) — Doğrusal zaman: Bir telefon rehberinde soyadı sırasız yazılmış binlerce kişi arasında istediğin ismi bulmak için baştan sona her sayfayı tek tek kontrol etmen gibidir; kişi sayısı iki katına çıkarsa arama süren de yaklaşık iki katına çıkar.
- O(log n) — Logaritmik zaman: Alfabetik sıralanmış bir rehberde ismi ortadan ikiye bölerek aramak gibidir; her adımda aranacak alan yarıya düşer, bu yüzden veri büyüse de adım sayısı çok az artar.
- O(n²) — Karesel zaman: Bir sınıftaki her öğrencinin diğer tüm öğrencilerle bir kez tokalaşması gibidir; öğrenci sayısı arttıkça gereken işlem sayısı çarpımsal olarak büyür.
Big O yalnızca zamanı değil, aynı zamanda alan karmaşıklığını da ifade edebilir. Alan karmaşıklığı, algoritmanın çalışırken ne kadar ek bellek (RAM) kullandığıyla ilgilidir. Bazı algoritmalar hızlı çalışmak için daha fazla bellek harcar, bazıları ise bellekten tasarruf ederken biraz daha yavaş çalışır. İyi bir geliştirici, bu iki kaynak arasındaki dengeyi probleme göre bilinçli şekilde kurar; her zaman "en hızlı" çözüm değil, o an için "en uygun" çözüm aranır.
Python ile Basit Bir Arama Algoritması Yazalım
Teoriyi somutlaştırmanın en etkili yolu, önceki bölümde bahsedilen O(n) mantığını gerçek bir kodda görmektir. Aşağıdaki örnek, bir dizide belirli bir değeri arayan klasik doğrusal arama (linear search) algoritmasını gösterir:
def dogrusal_arama(dizi, aranan):
for index in range(len(dizi)):
if dizi[index] == aranan:
return index
return -1
sayilar = [12, 45, 7, 89, 23, 56]
sonuc = dogrusal_arama(sayilar, 89)
if sonuc != -1:
print(f"Değer {sonuc}. index'te bulundu.")
else:
print("Değer listede bulunamadı.")
Bu kod, listedeki her elemanı sırayla kontrol eder ve aranan değeri bulduğunda işlemi durdurur. En kötü senaryoda, yani aranan değer listenin son elemanıysa veya listede hiç yoksa, algoritma tüm elemanları tek tek gezmek zorunda kalır. İşte bu yüzden doğrusal arama tam olarak O(n) karmaşıklığına sahiptir; liste eleman sayısı arttıkça en kötü durumdaki adım sayısı da doğrudan orantılı biçimde artar.
Bu kadar kısa bir kod parçasının arkasında bile zaman karmaşıklığı, döngü mantığı ve koşul kontrolü gibi birçok temel kavramın aynı anda çalıştığını görmek, algoritma öğreniminin neden pratikle desteklenmesi gerektiğini açıkça gösterir. Bu tür örnekleri kendi başına yazıp farklı veri boyutlarıyla test etmek, konunun kâğıt üzerinde kalmasını önler. Bu pratiği sistemli ve rehberli bir şekilde yapmak isteyenler için 1-1 özel Python dersleri kapsamında algoritma mantığı, adım adım kod yazımıyla birlikte pekiştirilir.
Yeni Başlayanların Algoritma Öğrenirken Yaptığı Yaygın Hatalar
Algoritma öğrenme sürecinde neredeyse herkesin düştüğü belirli tuzaklar vardır. Bu hataların çoğu, konunun zor olmasından değil, öğrenme sırasının yanlış kurulmasından kaynaklanır. Kendi kodunu yazmaya başlamadan önce bu yaygın hataları tanımak, boşa harcanan saatleri önemli ölçüde azaltır.
- Ezbere kod kopyalama: İnternette bulunan bir sıralama veya arama kodunu anlamadan kopyalayıp yapıştırmak, kısa vadede işe yarar görünse de kalıcı bir öğrenme sağlamaz. Kod çalışsa bile mantığı içselleştirilmediği için, aynı problem farklı bir bağlamda karşımıza çıktığında çözüm üretilemez.
- Kağıt üzerinde düşünmeden direkt koda geçme: Adımları önce kabaca kâğıda dökmeden editöre geçmek, çoğu zaman yarı yolda takılıp kalmaya yol açar. Algoritmanın mantığı netleşmeden yazılan kod, sürekli deneme-hata döngüsüne girer ve hata ayıklama süresi gereksiz yere uzar.
- Veri yapısı seçimini görmezden gelme: Her problemi tek bir veri yapısıyla (genellikle dizi) çözmeye çalışmak, performans sorunlarının en sık nedenidir. Sık ekleme-çıkarma yapılan bir senaryoda dizi kullanmak, bağlı liste veya kuyruk kullanmaya göre gereksiz yavaşlığa neden olabilir.
- Karmaşıklığı hiç düşünmeme: Kod çalışıyor diye algoritmanın verimli olduğu sonucuna varmak yanıltıcıdır. Küçük veri setlerinde fark edilmeyen bir zaman karmaşıklığı sorunu, veri büyüdüğünde ciddi performans problemlerine dönüşür.
- Sadece teoriyle yetinme: Kavramları okuyup anladığını düşünmek ile o kavramı sıfırdan koda dökebilmek arasında büyük bir fark vardır. Uygulama yapılmadan geçilen teori bilgisi, ihtiyaç anında hatırlanmaz.
Bu hataların ortak çözümü basittir: az sayıda problemi derinlemesine çözmek, çok sayıda problemi yüzeysel geçmekten daha değerlidir. Her çözdüğünüz problemde "neden bu veri yapısını seçtim, karmaşıklığı ne oldu" sorusunu kendinize sormak, alışkanlığı kalıcı hâle getirir. Düzenli pratik yapmak isteyenler için algoritma ve yazılım konularını işleyen blog içerikleri hem kavramları tazelemek hem de farklı örneklerle pekiştirmek için iyi bir başlangıç noktası olabilir.
Algoritma ve Veri Yapılarını Bir Dile Bağlamak: Öğrenme Yol Haritası
Algoritma ve veri yapılarını öğrenmek, doğru sırayla ilerlendiğinde sanıldığından daha yönetilebilir bir süreçtir. Konuyu dağınık şekilde değil, aşamalı bir yol haritasıyla ele almak, hem kavramların birbirine oturmasını hem de öğrenilenlerin kalıcı olmasını sağlar.
- Temel sözdizimini öğrenmek: Değişkenler, döngüler, koşullar ve fonksiyonlar gibi bir programlama dilinin temel yapı taşlarını (Python veya Java üzerinden) öğrenmeden algoritma yazmak mümkün değildir; bu adım tüm sürecin zeminidir.
- Basit algoritmalarla pratiğe başlamak: Sayı bulma, en büyük eleman arama, basit sıralama gibi küçük problemlerle algoritmik düşünmeyi alışkanlık hâline getirmek gerekir.
- Temel veri yapılarını tanımak: Dizi, bağlı liste, yığın, kuyruk ve hash tablosu gibi yapıların ne zaman ve neden kullanıldığını örneklerle görmek, algoritma seçimlerini anlamlı kılar.
- Karmaşıklık analizini öğrenmek: Yazılan çözümün zaman ve alan açısından ne kadar verimli olduğunu Big O notasyonuyla değerlendirebilmek, "çalışan kod" ile "iyi kod" arasındaki farkı görmeyi sağlar.
- Gerçek problemlerle pratik yapmak: Öğrenilen kavramları küçük projelerde veya problem setlerinde tekrar tekrar uygulamak, bilgiyi kısa süreli ezberden kalıcı beceriye dönüştürür.
Bu beş adım, tek bir dille derinlemesine ilerlendiğinde çok daha etkili sonuç verir. Python'un okunabilir sözdizimi kavramlara odaklanmayı kolaylaştırırken, Java'nın daha katı yapısı nesne yönelimli düşünmeyi güçlendirir; hangisi seçilirse seçilsin, önemli olan düzenli ve rehberli bir ilerleyiştir. Bu noktada canlı ve etkileşimli yazılım eğitimi gibi yapılandırılmış bir öğrenme ortamı, adımların atlanmadan ve doğru sırayla ilerlemesine yardımcı olabilir. Ayrıca ilerleme sürecinde kişiye özel alıştırmalar ve düzenli tekrar imkânı, kavramların unutulmadan üst üste inşa edilmesini kolaylaştırır.
Sık Sorulan Sorular
Algoritma ile program aynı şey midir?
Hayır, ikisi farklı kavramlardır. Algoritma, bir problemi çözmek için izlenen adımların soyut bir tarifidir; program ise bu tarifin belirli bir programlama dilinde yazılmış hâlidir. Aynı algoritma Python'da veya Java'da farklı şekillerde koda dökülebilir, ama arkasındaki mantık değişmez.
Veri yapısı olmadan algoritma yazılabilir mi?
Çok basit algoritmalar tek bir değişkenle çalışabilir, ancak gerçek dünya problemlerinin büyük çoğunluğu veriyi bir şekilde organize etmeyi gerektirir. Bu nedenle veri yapıları, algoritmaların üzerine kurulduğu pratik bir zemin görevi görür ve ikisi genellikle birlikte düşünülür.
Hangi veri yapısını ne zaman seçmeliyim?
Seçim, yapılacak işlemin türüne göre değişir. Sık erişim gerekiyorsa dizi, sık ekleme-çıkarma gerekiyorsa bağlı liste, sıralı işlem gerekiyorsa yığın veya kuyruk, hızlı arama gerekiyorsa hash tablosu genellikle daha uygun bir tercihtir.
Big O notasyonu neden önemlidir?
Big O notasyonu, bir algoritmanın veri büyüdükçe ne kadar yavaşlayacağını veya ne kadar bellek kullanacağını göstermenin standart yoludur. Bu sayede iki farklı çözüm arasında hangisinin daha verimli olduğunu, küçük test verisiyle değil, mantıksal olarak karşılaştırabilirsiniz.
Algoritma öğrenmeye hangi programlama diliyle başlamalıyım?
Python, sade sözdizimi sayesinde algoritmanın mantığına odaklanmayı kolaylaştırdığı için çoğu yeni başlayan için iyi bir giriş noktasıdır. Java ise nesne yönelimli düşünmeyi ve daha katı bir yapı disiplinini öğretir; her iki dil de algoritma temellerini öğrenmek için sağlam bir zemin sunar.
Algoritma ve veri yapılarını öğrenmek ne kadar sürer?
Bu süre kişinin önceki deneyimine, ayırdığı zamana ve pratik yoğunluğuna göre değişir. Temel kavramları kavramak haftalar sürebilirken, bu bilgiyi karmaşık problemlerde rahatça kullanabilmek düzenli pratikle aylar alabilir; önemli olan sürekliliktir.
Kendi kendime algoritma öğrenmek mümkün mü?
Evet, disiplinli çalışan biri kendi kendine de ilerleyebilir; ancak geri bildirim almadan ilerlemek, hataların fark edilmeden alışkanlığa dönüşmesine yol açabilir. Rehberli bir öğrenme süreci veya düzenli pratik ortamı, bu riski azaltarak ilerlemeyi hızlandırır.
Algoritma ve veri yapıları, yazılım geliştirmenin görünmeyen ama her satır kodu şekillendiren temelidir; bu temeli sağlam kurmak, ileride öğrenilecek her yeni kavramı daha kolay anlamayı sağlar. Öğrendiklerinizi ne kadar içselleştirdiğinizi görmek isterseniz algoritma bilgi testi ile kendinizi ücretsiz olarak sınayabilirsiniz.