您好,登錄后才能下訂單哦!
今天小編給大家分享的是二分查找算法的兩種實現和缺陷的詳細介紹,相信大部分人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,話不多說,一起往下看吧。
在學習算法的過程中,我們除了要了解某個算法的基本原理、實現方式,更重要的一個環節是分析算法的復雜度。在時間復雜度和空間復雜度之間,我們又會更注重時間復雜度,往往用犧牲空間換時間的方法提高時間效率。
時間復雜度按優劣排差不多集中在:
O(1), O(log n), O(n), O(n log n), O(n2), O(nk), O(2n)
二分查找法主要是解決在“一堆數中找出指定的數”這類問題,而想要應用二分查找法,這“一堆數”必須有一下特征:
存儲在數組中
有序排列
所以如果是用鏈表存儲的,就無法在其上應用二分查找法了。
至于是順序遞增排列還是遞減排列,數組中是否存在相同的元素都不要緊。不過一般情況,我們還是希望并假設數組是遞增排列,數組中的元素互不相同。
二分查找程序實現:
#include<iostream>
using namespace std;
//while循環實現
int Binary_Search2(int array[], int n, int value)
{
int left = 0;
int right = n-1;
while (left <= right)//注意這里是"<="還是"=",若為"=",則循環里改為right = middle
{
int middle = left + ((right - left) >> 2);//直接平均可能會溢位,所以用此算法
if (array[middle] > value)
{
right = middle - 1;
}
else if(array[middle] < value)
{
left = middle + 1;
}
else
{
return middle;
}
}
return -1;
}
//遞歸實現
int Binary_Search3(int array[], int left,int right, int value)
{
if (left > right)//二分查找要有序
{
return -1;
}
int middle = left + ((right - left) >> 2);//直接平均可能會溢位,所以用此算法
if (array[middle] > value)
{
return Binary_Search3(array, left, middle - 1, value);
}
else if (array[middle] < value)
{
return Binary_Search3(array, middle + 1, right, value);
}
else
{
return middle;
}
}
int main()
{
int array[10] = { 1,2,3,5,7,8,9,11,13,45 };
int n = 0, num = 0,ret=0;
n = sizeof(array);
/*int left = 0, right = n-1;*/
cin >> num;
ret = Binary_Search2(array, n, num);
/*ret = Binary_Search3(array, left,right, num);*/
if (ret == -1)
{
cout << "查找失敗!"<< endl;
}
else
{
cout << num << "是第" << ret + 1 << "個數" << endl;
}
system("pause");
return 0;
}
運行結果1:
8
8是第6個數
請按任意鍵繼續. . .
運行結果2:
17
查找失敗!
請按任意鍵繼續. . .
二分查找法的O(log n)讓它成為十分高效的算法。不過它的缺陷卻也是那么明顯的。就在它的限定之上:
必須有序,我們很難保證我們的數組都是有序的。當然可以在構建數組的時候進行排序,可是又落到了第二個瓶頸上:它必須是數組。數組讀取效率是O(1),可是它的插入和刪除某個元素的效率卻是O(n)。因而導致構建有序數組變成低效的事情。
解決這些缺陷問題更好的方法應該是使用二叉查找樹了,最好自然是自平衡二叉查找樹了,高效的(O(n logn))構建有序元素集合,又能如同二分查找法一樣快速(O(log n))的搜尋目標數。
關于二分查找算法的兩種實現和缺陷就分享到這里了,解決問題并不止文章中和大家分析的辦法,不過本文分析的方法準確性是不容置疑的。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。