İçeriğe atla

İkili arama algoritması

İkili arama algoritması
İkili aramayla 7 aranırken algoritmanın izlediği yol
SınıfArama algoritması
Veri yapısıDizi
Zaman karmaşıklığı
En iyi
Ortalama
Alan karmaşıklığı

İkili arama (İngilizceBinary search), sıralı bir dizide, belirli değerin aranmasına yönelik bir algoritmadır. Her adımda, aranan değerin dizinin orta değerine eşit olup olmadığı kontrol edilir. Eşit ise aranan bulunmuştur. Aranan değer orta değerden küçükse, dizinin sıralı olduğu kabulünden, ortanın yukarısına bakmaya gerek kalmaz, arama dizinin başı ve orta değer arasında devam eder. Aranan ortadan büyükse arama orta ile son arasında devam eder. Her adımda dizi ikiye bölünür.

İkili arama N elemanlı bir dizide en kötü durumda karşılaştırma yapar. Buna göre algoritma, 7 elemanlı veride sonuca 3 adımda ulaşır, 7000000 elemanlı veride, arananın yerinden bağımsız olarak, yalnızca 23 adım gereklidir. Eğer kaba kuvvet yöntemiyle dizinin her elemanı tek tek kontrol edilseydi ve aranan 7000000. indiste bulunsaydı (en kötü durum) 7000000 adım gerekli olacaktı. Bu karşın kaba kuvvet yönteminde dizinin sıralı olma şartı yoktur. Dizinin boyu küçük olduğunda doğrusal arama kullanılabilir.

Örnekler

binary-search
Binary Search

Pseudocode:

function binary_search(A, n, T) is
    L := 0
    R := n - 1
    while L ≤ R do
        m := floor((L + R) / 2)
        if A[m] < T then
            L := m + 1
        else if A[m] > T then
            R := m - 1
        else:
            return m
    return unsuccessful

C++:

#include <vector>

int search(const std::vector<int> &data, int target) {
  int left = 0;
  int right = data.size() - 1;

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

    if (data[middle] < target)
      left = middle + 1;
    else if (data[middle] > target)
      right = middle - 1;
    else // target == data[middle]
      return middle;
  }

  return -1;
}

Java:

public class BinarySearch {
  public static int search(int[] data, int target) {
    int left = 0;
    int right = data.length - 1;

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

      if (data[middle] < target)
        left = middle + 1;
      else if (data[middle] > target)
        right = middle - 1;
      else
        return middle;
    }

    return -1;
  }
}

Python:

def binary_search(arr, target):
    left = 0
    right = len(arr) - 1

    while left <= right:
        middle = (left + right) // 2

        if arr[middle] < target:
            left = middle + 1
        elif arr[middle] > target:
            right = middle - 1
        else:
            return middle

    return -1

Kütüphane desteği

Pek çok programlama dili, standard kütüphanelerinde iki arama algoritmasını gerçekler. C++ standard kütüphanesi sıralı veriler üzerinde işlem yapan lower_bound, upper_bound, binary_search gibi pek çok algoritma gerçeklenimi bulundurur:

#include <algorithm>
#include <iostream>
#include <vector>

int main() {
  std::vector<int> numbers{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

  std::cout << std::boolalpha
            << std::ranges::binary_search(numbers, 0)  << '\n'
            << std::ranges::binary_search(numbers, 11) << '\n'
            << std::ranges::binary_search(numbers, 5)  << '\n'
            ;
}

// false
// false
// true

Kaynakça

İlgili Araştırma Makaleleri

<span class="mw-page-title-main">C++</span> bir programlama dili

C++, Bjarne Stroustrup tarafından 1979 yılında Bell Laboratuvarları'nda geliştirilmeye başlanmış, C'yi kapsayan ve çok paradigmalı, yaygın olarak kullanılan, genel amaçlı bir programlama dilidir.

<span class="mw-page-title-main">Bellek yönetimi</span>

Ana belleğin işlemler arasında paylaştırılmasına ana bellek yönetimi ya da bellek yönetimi adı verilir. İşletim sisteminin bu amaçla oluşturulan kesimine de bellek yöneticisi adı verilir.

<span class="mw-page-title-main">PageRank</span>

PageRank, Google tarafından geliştirilen ve web sayfalarının önemini belirlemek için kullanılan bir algoritmadır. İnternet üzerindeki bağlantıların analiz edilmesiyle hesaplanan Pagerank değeri Google Arama sonuçlarında sayfaların sıralanması için kullanılan faktörlerden biridir.

Veri yapısı, bilgisayar ortamında verilerin etkin olarak saklanması ve işlenmesi için kullanılan yapı.

<span class="mw-page-title-main">Birleştirmeli sıralama</span>

Birleşmeli Sıralama, bilgisayar bilimlerinde derecesinde karmaşıklığa sahip bir sıralama algoritmasıdır. Girdi olarak aldığı diziyi en küçük hale gelene kadar ikili gruplara böler ve karşılaştırma yöntemi kullanarak diziyi sıralar.

<span class="mw-page-title-main">Sıralama algoritması</span>

Sıralama algoritması, bilgisayar bilimlerinde ya da matematikte kullanılan, verilen bir listenin elemanlarını belirli bir sıraya sokan algoritmadır. En çok kullanılan sıralama türleri, sayı büyüklüğüne göre sıralama ve alfabetik sıralamadır. Sıralama işleminin verimli yapılması, arama ve birleştirme algoritmaları gibi çalışması için sıralanmış dizilere gereksinim duyan algoritmaların başarımının yüksek olması için önemlidir. Sıralama algoritmaları bilgisayarlarda tutulan verilerin düzenlenmesini ve insan kullanıcı tarafından daha rahat algılanmasını da sağlar.

<span class="mw-page-title-main">Seçmeli sıralama</span>

Seçmeli Sıralama, bilgisayar bilimlerinde kullanılan bir sıralama algoritmasıdır. Karmaşıklığı olduğu için büyük listeler üzerinde kullanıldığında verim sağlamaz ve genel olarak benzeri olan eklemeli sıralamadan daha başarısızdır. Seçmeli sıralama yalın olduğu ve bazı durumlarda daha karmaşık olan algoritmalardan daha iyi sonuç verdiği için tercih edilebilir.

<span class="mw-page-title-main">Eklemeli sıralama</span> sıralama algoritma

Eklemeli Sıralama, bilgisayar bilimlerinde kullanılan ve sıralı diziyi her adımda öğe öğe oluşturan bir sıralama algoritmasıdır. Büyük dizilerle çalışıldığında hızlı sıralama, birleştirmeli sıralama ve yığın sıralaması gibi daha gelişmiş sıralama algoritmalarından daha verimsiz çalışır. Ancak buna karşın bazı artıları da vardır:

<span class="mw-page-title-main">Kabuk sıralaması</span>

Shell sıralaması, bilgisayar bilimlerinde kullanılan bir sıralama algoritmasıdır. Eklemeli sıralama algoritmasının aşağıdaki iki gözlem kullanılarak genelleştirilmiş biçimidir:

<span class="mw-page-title-main">İkili arama ağacı</span>

İkili arama ağacı, verileri organize etmek için kullanılan bir çeşit ikili ağaçtır. İkili ağaçtan temel farkı, verilerin sıralanmış bir şekilde tutulmasıdır, bu sayede ikili arama algoritmasının kullanılmasına imkân verir.

İplik sıralaması bilgisayar bilimlerinde kullanılan bir sıralama algoritmasıdır. Sıralanacak olan dizinin, sıralanmış alt dizilerinin oluşturularak bu alt dizilerin birleştirilmesi yoluyla sonucun oluşturulması mantığına dayanır. Algoritmanın her bir aşamasında ana dizinin üzerinden geçilir ve bu diziden zaten sıralanmış olan bir dizi eleman çıkarılır. Çıkarılan bu eleman dizileri daha sonra birleştirilir.

<span class="mw-page-title-main">Dinamik dizi</span>

Dinamik dizi, tutabileceği eleman sayısının derleme zamanında bilinmesine gerek olmayan dizidir. Dinamik dizi tanımlandığında, kapasitesini belirten bir bellek tahsis edilir ve kullanımda kapasiteye erişildiğinde yeniden bir dinamik bellek tahsisi yapılır. Dinamik diziye elemanlar eklenebilir, diziden elemanlar silinebilir; dizinin boyutu azaltılabilir ve arttırılabilir. Bazı programlama dillerinde vektör adıyla anılan bu yapıyı birçok modern programlama dili kendi kütüphaneleriyle sunmaktadır.

Dizi eşleme algoritmaları olarak da adlandırılan dizi arama algoritmaları, bir ya da birkaç dizinin (örüntü) daha büyük bir dizi ya da metin içindeki yerinin bulunmasını konu edinen önemli bir dizi algoritması sınıfıdır.

<span class="mw-page-title-main">Algoritma analizi</span>

Algoritma analizi veya diğer adıyla algoritma çözümlemesi, bilgisayar biliminde bir algoritmayı çalıştırabilmek için gereken kaynakların miktarının tespitidir. Algoritmaların çoğunluğu, rastgele seçilmiş uzunluktaki girdiler ile çalışmak için tasarlanmıştır. Genellikle, bir algoritmanın verimlilik veya çalışma zamanı, adımların sayısı veya depolama yerleri 'nin girdi uzunluğuyla ilişkili olan işlev olarak ifade edilir.

Bilgisayar programlamada dinamik iletim, altyordam çağrılarının ilişkin altyordam başlangıç adresine dinamik olarak bağlanmasıdır. Bir diğer deyişle, dinamik iletim program metnindeki bir çağrı ile işletilen altyordamın programın çalışması sırasında birbirine bağlanması durumudur. Geri çağrı ve çokbiçimliliğin realize edilmesinde kullanılan bu bağlama yöntemi, yordamsal programlama dillerinde altyordam göstericileriyle gerçekleştirilirken, nesne yönelimli dillerde kalıtlama ve gerçekleştirme ilişkilerinin kullanılmasıyla otomatikman sağlanır. Altyordamların birinci sınıf dil öğesi olarak ele alındığı fonksiyonel programlama dillerinde ise, aynı işlevsellik altyordamların argüman olarak geçirilmesi ile sağlanabilir.

Sayı teorisinde, asal çarpanlara ayırma bir bileşik sayının, çarpıldıklarında yine aynı sayıyı verecek şekilde, bir ve kendisi dışındaki bölenlerine ayrılmasıdır.

Treap ya da tree heap, arama, ekleme, silme gibi temel işlemler için log(n) zamanı garanti eden dinamik bir ikili arama ağacıdır. İkili arama ağacına sıralı şekilde ekleme yapılırsa binary arama ağacı bağlantılı listeye dönüşür ve arama ancak O(n) zamanda yapılabilir. Bu durumu ortadan kaldırmak için treap her düğümde binary arama ağacında kullanılan asıl değere ek olarak bir de rastgele olusturulmus bir anahtar tutar. Treap veri yapısı hem asıl değere göre veri ağacının kurallarına uyularak hem de rastgele anahtar ata düğümden küçük olacak şekilde kurulur.

Medyan bir anakütle ya da örneklem veri serisini küçükten büyüğe doğru sıraladığımızda, seriyi ortadan ikiye ayıran değere denir. İstatistiğin bir alt dalı olan betimsel istatistikde medyan bir merkezsel konum ölçüsü kabul edilir.

C++ Standard Kütüphanesi, C++ programlama dilinde ve C++ ISO Standard'ıyla yazılmış sınıfların ve fonksiyonların koleksiyonudur.

C23, C programlama dilinin açık standard taslağıdır ve ISO/IEC 9899:2024 olarak yayınlanması ve C17'nin yerini alması beklenmektedir. 2016'da gayriresmi olarak C2x ve adıyla üzerinde çalışılmaya başlanmıştır ve Ekim 2024'te yayınlanması beklenmektedir. C23'ün en son taslağı 1 Nisan 2023'te yayınlanmıştır ve genel erişime açıktır. WG14 C2x taslağı için ilk olarak Ekim 2019 toplanmış, 2020'te COVID-19 pandemisi nedeniyle toplantılar sanal olarak uzaktan yapılmış, sonrasında telekonferans toplantıları 2024 boyunca devam etmiştir. Haziran 2024'teki açık standardta 'C23'ün bitiminden sonra, "C2y" olarak adlandırıldığı' belirtilmiştir.