C# Searching (Arama) Algoritmaları ve Örnekleri

Searching (Arama) Algoritmaları Nedir?

Arama (Searching) algoritmaları, bir veri yapısı içinde belirli bir değeri bulmak için kullanılan algoritmalardır. Veri yapısı, bir dizi, liste, ağaç veya benzeri bir yapı olabilir. Arama algoritmaları, veri yapısının boyutuna ve özelliklerine bağlı olarak farklı yöntemler kullanır ve farklı performans karakteristiklerine sahiptir.

 

- Sıralı Arama (Linear Search)

Sıralı arama, elemanları sıralanmış bir listede, aranan elemanı baştan sona tarayarak bulma işlemidir. Bu algoritma, listenin her bir elemanını kontrol eder ve eşleşme bulduğunda aranan elemanın indeksini döndürür.

public int LinearSearch(int[] array, int target)
{
    for (int i = 0; i < array.Length; i++)
    {
        if (array[i] == target)
        {
            return i;
        }
    }
    return -1; // Aranan eleman bulunamadı.
}

- İkili Arama (Binary Search)

İkili arama, sıralı bir listede hızlı bir şekilde arama yapmak için kullanılan bir algoritmadır. Listenin ortasındaki elemanı kontrol ederek aranan elemanı bulmaya çalışır. Eğer ortadaki eleman aranan elemandan küçükse, listenin ikinci yarısında arama yapar; eğer ortadaki eleman aranan elemandan büyükse, listenin ilk yarısında arama yapar. Bu işlem, aranan elemanı bulana kadar tekrarlanır.

public int BinarySearch(int[] array, int target)
{
    int left = 0;
    int right = array.Length - 1;

    while (left <= right)
    {
        int mid = (left + right) / 2;

        if (array[mid] == target)
        {
            return mid;
        }
        else if (array[mid] < target)
        {
            left = mid + 1;
        }
        else
        {
            right = mid - 1;
        }
    }
    return -1; // Aranan eleman bulunamadı.
}

- Hash Tablosu (Hash Table)

Hash tablosu, anahtar-değer çiftlerini depolamak ve hızlı bir şekilde erişim sağlamak için kullanılan bir veri yapısıdır. Anahtarlar bir karma işleminden geçirilerek benzersiz bir indeks elde edilir. Bu indeks kullanılarak değerlere erişilir. C# dilinde Dictionary<TKey, TValue> sınıfı, hash tablosu uygulaması için kullanılabilir.

 

Dictionary<string, int> dictionary = new Dictionary<string, int>();
dictionary.Add("Ahmet", 25);
dictionary.Add("Mehmet", 30);
dictionary.Add("Ayşe", 28);

int age = dictionary["Ahmet"];
Console.WriteLine(age); // 25

- İkili Arama Ağacı (Binary Search Tree)

İkili arama ağacı, sıralanmış bir ağaç yapısıdır. Her düğüm, sol alt ağacındaki düğümlerden daha küçük ve sağ alt ağacındaki düğümlerden daha büyük olan bir anahtar değerine sahiptir. İkili arama ağacı, veri ekleme, arama ve silme işlemlerini hızlı bir şekilde gerçekleştirmek için kullanılır.

public class Node
{
    public int Data;
    public Node Left;
    public Node Right;

    public Node(int data)
    {
        Data = data;
        Left = null;
        Right = null;
    }
}

public class BinarySearchTree
{
    private Node root;

    public BinarySearchTree()
    {
        root = null;
    }

    public void Insert(int data)
    {
        root = InsertRecursive(root, data);
    }

    private Node InsertRecursive(Node root, int data)
    {
        if (root == null)
        {
            root = new Node(data);
        }
        else if (data < root.Data)
        {
            root.Left = InsertRecursive(root.Left, data);
        }
        else if (data > root.Data)
        {
            root.Right = InsertRecursive(root.Right, data);
        }

        return root;
    }

    public bool Search(int data)
    {
        return SearchRecursive(root, data);
    }

    private bool SearchRecursive(Node root, int data)
    {
        if (root == null)
        {
            return false;
        }

        if (data == root.Data)
        {
            return true;
        }
        else if (data < root.Data)
        {
            return SearchRecursive(root.Left, data);
        }
        else
        {
            return SearchRecursive(root.Right, data);
        }
    }
}

- HashSet

HashSet, bir koleksiyon içerisinde benzersiz değerlerin depolanmasını sağlayan bir veri yapısıdır. Elemanlar, hash işlemi kullanılarak bir anahtar değere dönüştürülerek depolanır. Bu sayede hızlı bir şekilde eşleştirme ve arama işlemleri gerçekleştirilebilir.

HashSet<int> set = new HashSet<int>();
set.Add(5);
set.Add(10);
set.Add(15);

bool contains = set.Contains(10);
Console.WriteLine(contains); // true

- Lineer Hashlama

Lineer hashlama, bir dizi üzerinde verilerin depolanmasını ve erişimini sağlayan bir yöntemdir. Eğer bir hücre zaten doluysa, bir sonraki boş hücreye geçilir ve bu şekilde sıralı bir şekilde depolama yapılır.

public class LinearProbingHashTable
{
    private const int Size = 10;
    private int[] hashtable;
    
    public LinearProbingHashTable()
    {
        hashtable = new int[Size];
    }
    
    public void Add(int key)
    {
        int hash = HashFunction(key);
        int index = hash % Size;
        
        while (hashtable[index] != 0)
        {
            index = (index + 1) % Size;
        }
        
        hashtable[index] = key;
    }
    
    public bool Contains(int key)
    {
        int hash = HashFunction(key);
        int index = hash % Size;
        
        while (hashtable[index] != 0)
        {
            if (hashtable[index] == key)
            {
                return true;
            }
            
            index = (index + 1) % Size;
        }
        
        return false;
    }
    
    private int HashFunction(int key)
    {
        return key % Size;
    }
}

// Kullanım örneği
LinearProbingHashTable hashTable = new LinearProbingHashTable();
hashTable.Add(5);
hashTable.Add(15);
hashTable.Add(25);

bool contains = hashTable.Contains(15);
Console.WriteLine(contains); // true
contains = hashTable.Contains(10);
Console.WriteLine(contains); // false

 

Bu örnekler, C# programlama dilinde sıklıkla kullanılan arama algoritmalarının nasıl uygulanabileceğini göstermektedir. Her bir algoritma, farklı zaman karmaşıklıklarına sahip olabilir, bu yüzden kullanım senaryonuza ve ihtiyaçlarınıza bağlı olarak en uygun olanı seçebilirsiniz.

Kendinize iyi bakın, tekrar görüşmek dileğiyle..

Yorumlar kapalı