Java ile Dizilerde (Array) Eleman Frekansı Bulma: Algoritma ve Çözüm

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

  1. Ana dizimiz ile aynı boyutta, frekansları tutacağımız ikinci bir dizi oluşturulur.
  2. Ziyaret edilen (daha önce sayılan) elemanları işaretlemek için özel bir değişken (örneğin -1 veya çok farklı bir değer) belirlenir.
  3. İç içe iki for dö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.
  4. 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.
  5. 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 for döngüsü bulunmaktadır. Dış döngü n defa çalışırken, iç döngü de n-i defa ç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 frekanslar adında yeni bir dizi oluşturduk. Dizi boyutu n kadar 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 !

Yorum bırakın

Scroll to Top