Üniforma ikili arama - Uniform binary search

Üniforma ikili arama klasik bir optimizasyon ikili arama tarafından icat algoritması Donald Knuth ve Knuth'un verilen Bilgisayar Programcılığı Sanatı . Bu kullanan arama tablosu yerine bir üst ve her tekrarında bir alt sınır orta noktası alarak daha, tek bir dizi indeksi güncelleştirmek için; bu nedenle, (örneğin, Knuth olarak mimariler için optimize edilmiştir MIX üzerine)

  • Bir tablo arama bir ekleme ve bir kayma genellikle daha hızlıdır ve
  • Birçok arama aynı dizi üzerinde gerçekleştirilir, veya aynı uzunlukta birçok diziler üzerinde olacak

C uygulaması

Üniforma ikili arama algoritması uygulanan zaman, şuna benzer C .

#define LOG_N 4

static int delta[LOG_N];

void make_delta(int N)
{
    int power = 1;
    int i = 0;
    do {
        int half = power;
        power <<= 1;
        delta[i] = (N + half) / power;
    } while (delta[i++] != 0);
}

int unisearch(int *a, int key)
{
    int i = delta[0]-1;  /* midpoint of array */
    int d = 0;

    while (1) {
        if (key == a[i]) {
            return i;
        } else if (delta[d] == 0) {
            return -1;
        } else {
            if (key < a[i]) {
                i -= delta[++d];
            } else {
                i += delta[++d];
            }
        }
    }
}

/* Example of use: */
#define N 10
int main(void)
{
    int i, a[N] = {1,3,5,6,7,9,14,15,17,19};
    make_delta(N);
    for (i=0; i < 20; ++i)
      printf("%d is at index %d\n", i, unisearch(a, i));
    return 0;
}

Referanslar

Dış bağlantılar