簡體   English   中英

如何在 C 中簡化此工作二進制搜索代碼?

[英]How can I simplify this working Binary Search code in C?

大家好,幾周前開始用 C 編程,學習算法,只是想知道如何讓我的代碼更簡單,它只是一個二進制搜索函數。 但唯一的事情是你必須保持論點相同,提前致謝。

bool search(int value, int values[], int n)
{
    int min = values[0];
    int max = values[n-1];
    int average = (min + max) / 2;

    if(average == value)
    {
        return true;
    }

    while (average > value) 
    {
        max = average - 1;
        average = (min + max) / 2;

    }

    while (average < value)
    {
        min = average + 1;
        average = (min + max) / 2;
    }

    if (max < min) 
    {
        return false;
    }
    if (average == value) {
         printf("%i\n", average);
        return true;
    }
    else
    {
        return false;
    }
}

在二分查找中有很多小事情你必須做對:處理 length=0 的情況,確保你測試的位置總是有效的,確保你沒有溢出(即,`(low+high) /2' 不是最好的寫法),確保新的測試位置總是與前一個不同,等等。

在做了一百萬次之后,我寫的每一個二分搜索現在都是這樣完成的:

bool search(int[] array, int length, int valueToFind)
{
    int pos=0;
    int limit=length;
    while(pos<limit)
    {
        int testpos = pos+((limit-pos)>>1);

        if (array[testpos]<valueToFind)
            pos=testpos+1;
        else
            limit=testpos;
    }
    return (pos < length && array[pos]==valueToFind);
}

請注意,我們每次迭代只需要做一次比較,這比大多數可以做 2 的實現要快。而不是在循環內進行相等測試,我們可靠地找到要查找的元素所屬的位置,每次只使用一次比較迭代,然后在最后測試以查看我們想要的元素是否在那里。

我們計算testpos的方式確保pos <= testpos < limit ,即使長度是最大可能的整數值,它也能工作。

這種形式還可以很容易地讀出你想看到的不變量,而不必考慮像high<low這樣奇怪的邊界條件。 當您退出循環時, pos==limit這樣您就不必擔心使用錯誤的等等。

這個循環中的條件也很容易適應不同目的的二進制搜索,比如“找到插入 x 的位置,確保它在數組中已經存在的所有 x 之后”,“找到數組中的第一個x”,“找到數組中的最后一個x”等。

這不是二分查找的正確實現,所有條件都必須在一個循環中,例如: max 必須是 n-1 而不是 values[n-1] 和 min=0 而不是 values[0] 你也應該將 values[average] 與 value 進行比較,而不僅僅是平均變量。

 bool search(int value, int values[], int n){

    int min = 0;
    int max = n-1;
    int average ;

    while(max>=min){
        average = (min + max) / 2;
        if(values[average] == value)
        {
            return true;
        }

        if (values[average] > value) 
        {
            max = average - 1;
            average = (min + max) / 2;

        }

       if (values[average] < value)
        {
            min = average + 1;
            average = (min + max) / 2;
        }

    }

    return false;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM