
Java ile Dizilerde (Array) Eleman Frekansı Bulma: Algoritma ve Çözüm – Öğrenci Yazılım sitemizin Algoritma ve Programlama kategorisinde, özellikle bilgisayar mühendisliği ve yazılım bölümü öğrencilerinin sınavlarında sıkça karşılaştığı temel mantık problemlerini çözmeye devam ediyoruz. Bir önceki yazımızda döngüler ve metotlar üzerine durmuştuk. Bugün ise bir tık daha ileri giderek vize, final ve bütünleme sınavlarının vazgeçilmez konularından biri olan Java dizi (array) algoritmalarını inceliyoruz.
Bu rehberimizde, “Bir dizideki elemanların her birinin kaç kez tekrar ettiğini (frekansını) bulan algoritma” üzerinde duracağız. Soruyu çözerken diziler (arrays), for döngüleri, koşul yapıları ve static metot kullanımının mantığını adım adım kavrayacaksınız.
Problemin Tanımı: Dizi Eleman Frekansı Bulmak Ne Demek?
Programlamada veri kümeleri üzerinde analiz yapmak en temel becerilerden biridir. Elimizde sayılardan oluşan rastgele bir dizi olduğunu düşünelim. Amacımız, bu diziyi tarayarak hangi sayının dizide kaç defa geçtiğini ekrana yazdırmaktır.
Örnek Senaryo: Elbette ki girdi olarak şu diziyi alalım: {10, 20, 20, 10, 10, 20, 5, 20}
Programımızın vermesi gereken çıktı şu olmalıdır:
- 10 sayısı 3 kez tekrar edildi.
- 20 sayısı 4 kez tekrar edildi.
- 5 sayısı 1 kez tekrar edildi.
Bu problemi çözerken aynı sayıyı tekrar tekrar saymamak için bir “ziyaret edildi” (visited) mantığı kurmamız gerekecek.
Algoritmanın Çalışma Mantığı (Adım Adım)
Kodu yazmaya başlamadan önce, her zaman yaptığımız gibi algoritmanın sözde kod (pseudocode) mantığını kurmalıyız:
Java ile Dizilerde (Array) Eleman Frekansı Bulma
- Ana dizimiz ile aynı boyutta, frekansları tutacağımız ikinci bir dizi oluşturulur.
- Ziyaret edilen (daha önce sayılan) elemanları işaretlemek için özel bir değişken (örneğin
-1veya çok farklı bir değer) belirlenir. - İç içe iki
fordöngüsü kurulur:- Dış döngü: Dizinin ilk elemanından son elemanına kadar sırayla gezer. Sayacı 1 olarak başlatır.
- İç döngü: Dış döngünün tuttuğu elemandan bir sonraki elemandan başlar ve dizinin sonuna kadar giderek aynı elemanın başka var olup olmadığını kontrol eder.
- Eğer eşleşme bulunursa, sayaç 1 artırılır ve aynı sayıyı daha sonra tekrar saymamak için o indeks “ziyaret edildi” olarak işaretlenir.
- Son olarak, işaretlenmemiş elemanların ve sayaçlarının bulunduğu frekans dizisi ekrana yazdırılır.
Java Kod Çözümü: İç İçe Döngüler ve Statik Metot Kullanımı
Java ile Dizilerde (Array) Eleman Frekansı Bulma
Aşağıdaki kod parçacığında, çözümü ana metoda yığmak yerine, kod okunabilirliğini ve tekrar kullanılabilirliğini artırmak için ayrı bir static metot tanımladık.
public class DiziFrekansBulucu {
// Dizideki elemanların frekansını bulan statik metot
public static void frekansBul(int[] dizi) {
// Frekansları tutacak olan aynı boyutta yeni bir dizi
int[] frekanslar = new int[dizi.length];
// Ziyaret edilen elemanları işaretlemek için kullanılacak değer
int ziyaretEdildi = -1;
// Dizinin tüm elemanlarını tarayan dış döngü
for (int i = 0; i < dizi.length; i++) {
int sayac = 1; // Her yeni eleman için sayacı 1'den başlat
// Sıradaki elemanı dizinin geri kalanıyla karşılaştıran iç döngü
for (int j = i + 1; j < dizi.length; j++) {
if (dizi[i] == dizi[j]) {
sayac++; // Eşleşme varsa sayacı artır
// Daha sonra tekrar saymamak için dizinin o indeksini işaretle
frekanslar[j] = ziyaretEdildi;
}
}
// Eğer o anki eleman daha önce sayılmadıysa, frekansını diziye kaydet
if (frekanslar[i] != ziyaretEdildi) {
frekanslar[i] = sayac;
}
}
// Sonuçları Ekrana Yazdırma Bölümü
System.out.println("Eleman | Frekans");
System.out.println("-------------------------");
for (int i = 0; i < frekanslar.length; i++) {
if (frekanslar[i] != ziyaretEdildi) {
System.out.println(" " + dizi[i] + " | " + frekanslar[i]);
}
}
}
public static void main(String[] args) {
// Test için kullanılacak ana dizimiz
int[] sayilar = {10, 20, 20, 10, 10, 20, 5, 20};
// Metodu çağırarak işlemi başlatıyoruz
frekansBul(sayilar);
}
}
Kodun Önemli Noktalarının Analizi
Java ile Dizilerde (Array) Eleman Frekansı Bulma
1. Neden static Metot Kullandık?
Kodlama yaparken frekansBul metodunu tanımlarken public static void anahtar kelimelerini kullandık. Java’da static olarak tanımlanan metotlar, sınıftan (class) bir nesne (object) türetilmesine gerek kalmadan doğrudan çağrılabilir. main metodu da bellekte statik olarak tutulduğu için, içerisinden direkt olarak frekansBul(sayilar); şeklinde çağırım yapmamızı sağladı.
2. Ziyaret Edildi (Visited) Mantığı
Dizideki 10 sayısını ilk indeks için saydığımızda toplam 3 buluyoruz. Döngü devam edip ilerideki indekslerde tekrar 10 gördüğünde onu baştan saymaması gerekir. Bu yüzden saydığımız ve eşleşen elemanların iz düşümü olan frekanslar dizisindeki indekslerine -1 atıyoruz. Yazdırma aşamasında ise if (frekanslar[i] != ziyaretEdildi) koşulu ile sadece işaretlenmemiş, yani ilk kez sayılmış benzersiz elemanları ekrana basıyoruz.

Algoritmanın Karmaşıklık Analizi (Time and Space Complexity)
Bu bölüm, algoritma analizinin temellerini atan mühendislik öğrencileri için çok önemlidir.
- Zaman Karmaşıklığı (Time Complexity): O(n^2) Kodumuzda iç içe geçmiş iki adet
fordöngüsü bulunmaktadır. Dış döngündefa çalışırken, iç döngü den-idefa çalışmaktadır. En kötü senaryoda (worst-case), her bir eleman tüm diğer elemanlarla karşılaştırılacağı için zaman karmaşıklığı O(n^2) olarak hesaplanır. Küçük diziler için sorunsuz çalışır ancak devasa veri setlerinde yavaşlamaya neden olabilir. - Alan Karmaşıklığı (Space Complexity): O(n) Algoritmayı çözerken, ana dizi ile aynı uzunluğa sahip
frekanslaradında yeni bir dizi oluşturduk. Dizi boyutunkadar arttıkça, bellekte kaplayacağı alan da doğrusal olarak artar. Bu nedenle alan karmaşıklığı O(n)’dir.
Daha gelişmiş veri yapıları öğrenildiğinde, bu problem Java’daki HashMap sınıfı kullanılarak zaman karmaşıklığı açısından O(n) seviyesine düşürülebilir. Ancak temel programlama mantığını, for döngülerini ve dizi indekslemeyi kavramak için iç içe döngü yapısı en iyi antrenmandır. Daha fazla Java dokümantasyonu ve sınıf bilgisi için Oracle resmi Java referansını da inceleyebilirsiniz.
Daha fazla bilgi için sitemizi ziyaret etmeyi unutmayın !


