⑴ 在97個記錄的由於順序表中進行二分查找,最大比較次數是
在97個記錄的由於順序表中進行二分查找,最大比較次數是7次。
二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法。但是,折半查找要求線性表必須採用順序存儲結構,而且表中元素按關鍵字有序排列。
根據順序表二分法查找比較次數的計算公式:
(1)順序存儲表實現二分查找擴展閱讀
演算法毀橋要求:
1、必須採用順序存儲結構。
2、必須按關鍵字大小有序排列。
在計算機中用一組地址連續的存儲單元依次存儲線性表的各個數據元素,稱作線性表的順序存儲結構。
由此得到的存儲結構為順序存儲結構,蘆敗通常順序存儲結構是藉助於計算機程序設計語言(例如c/c++)的數組來描述的。
順序存儲結構的主要優點是節省存儲空間,因為分配給數據的存儲單元全用存放結點的數據(不考慮c/c++語言中數組需指定大小纖嘩猛的情況),結點之間的邏輯關系沒有佔用額外的存儲空間。
採用這種方法時,可實現對結點的隨機存取,即每一個結點對應一個序號,由該序號可以直接計算出來結點的存儲地址。
但順序存儲方法的主要缺點是不便於修改,對結點的插入、刪除運算時,可能要移動一系列的結點。
優點:隨機存取表中元素、儲存密度大。
缺點:插入和刪除操作需要移動元素。
⑵ 順序表的順序查找和二分查找
順序查找,二分查找和哈希查找演算法,它們各自的特點是:
1.對比順序查找的特點就是從表的第一個元素開始一個一個向下查找,如果有和目標一致的元素,查找成功;如果到最後一個元素仍沒渣姿有目標元素,則查找失敗。
2.二分野梁畢查找的特點就是從表中間開始查找目標元素。如果找到一致元素,則查找成功。如果中間元素比目標元素小,則仍用二分查找方法查找表的後半部分(表是遞增排列的),反之頌芹中間元素比目標元素大,則查找表的前半部分。
3.哈希演算法的特點是是使用給定數據構造哈希表,然後在哈希表上進行查找的一種演算法。先給定一個值,然後根據哈希函數求得哈希地址,再根據哈希地址查找到要找的元素。是通過數據元素的存儲地址進行查找的一種演算法。
⑶ 基本演算法——二分查找演算法
二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法。但是,折半查找要求線性表必須採用順序存儲結構,而且表中元素按關鍵字有序排列。
1.條件
(1)必須採用 順序存儲結構 。
(2)必須按關鍵字大小有序排列。
2.步奏
(1)首先,假設表中元素是按升序排列,將表中間位置記錄的 關鍵字 與查找關鍵字比較,如果兩者相等,則查找成功;
(2)否則利用中間位置 記錄 將表分成前、後和搏兩個子表,如果中間位置記錄的關鍵字大於查找關鍵字,則進一步查找前一子表,否則進一步查找後一子表;
(3)重復以上過程,直到找到滿足條件的 記錄 ,使查找成功,或直到子表不存在為止,此時查找不成功。
3.舉例
有一組元素{1,2,3,4,5,6,7,8,9},如何查到元素為3。
(1)找到數組中中間元素值5,不等於3,所以把數組分為{1,2,3,4},{5,6,7,8,9};
(2)因告棚衫為5大於3,所以3在前一個數組{1,2,3,4}中查找,中間變數2,3比2大,所以在{3,4}中查詢;
(3)查詢到3=3,成襪腔功。
4.復雜度
最好的情況下,1次查詢成功;最壞的情況下,查詢到最後兩個數或者最後也查不到相等數,時間復雜度為O(log2n)。
⑷ 二分查找演算法實現(圖解)與實例
當我們要從一個序列中查找一個元素的時候,二分查找是一種非常快速的查找演算法,二分查找又叫折半查找。
它對要查找的序列有兩個要求,一是該序列必須是有序的(即該序列中的所有元素都是按照大小關系排好序的,升序和降序都可以,本文假設是升序排列的),二是該序列必須是順序存儲的。
如果一個序列是無序的或者是鏈表,那麼該序列就不芹燃滑能進行二分查找。之所以被查找的序列要滿足這樣的條件,是由二分查找演算法的原理決定的。
二分查找又稱折半查找,優點是比較次數少,查找速度快,平均性能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查找方法適用於不經常變動而查找頻繁的有序列表。
二分查找能應用於任何類型的數據,只要能將這些數據按照某種規則進行排序。然而,正因為它依賴於一個有序的集合,這使得它在處理那些頻繁插入和刪除操作的數據集時不太高效。這是因為,對於插入和操作來說,為了保證查找過程正常進行,必須保證數據集始終有序。相對於查找來說,維護一個有序數據集的代價更高。此外,元素必須存儲在連續的空間中。因此,當待搜索的集合是相對靜態的數據集時,此時使用二分查找段棚是最好的選擇。
二分查找演算法的原理如下:
二分查找之所以快速,是因為它在匹配不成功的時候,每次都能排除剩餘元素中一半嫌臘的元素。因此可能包含目標元素的有效范圍就收縮得很快,而不像順序查找那樣,每次僅能排除一個元素。
二分查找法實質上是不斷地將有序數據集進行對半分割,並檢查每個分區的中間元素。
此實現過程的實施是通過變數left和right控制一個循環來查找元素(其中left和right是正在查找的數據集的兩個邊界值)。
二分查找的時間復雜度取決於查找過程中分區數可能的最大值。對於一個有n個元素的數據集來說,最多可以進行O(㏒₂n)次分區。對於二分查找,這表示最終可能在最壞的情況下執行的檢查的次數:例如,在沒有找到目標時。所以二分查找的時間復雜度為O(㏒₂n)。
參考:
https://www.html.cn/qa/other/23018.html
https://www.cnblogs.com/idreamo/p/9000762.html
⑸ 二分法查找為什麼只適用於順序存儲
舉個例子,在1 2 6 4 5 7 8 9 10中,你要用二分法查找6,你得先把6跟中間的5比較,6很明顯大於5,所以就只能在5 7 8 9 10中查找,這樣很明顯找不到,所以二分法必須要求用於順序排列的數,如果不是順序排列的,二分法就完全沒有意義
⑹ 二分法查找適用於何種存儲方式的有序表
二分法查找是一種效率比較高的查找方法,在進行二分法查找時,線性表節點必須按關鍵碼值排序,且 線性表是以順序存儲方式存儲的。
二分法查找的優點是比較次數少,查找速度快,平均檢索長度小,經過{_loge n次比較就可以完成查找過程。缺點是在查找之前要為建立有序表付出代價,同時對有序表的插人和刪除都需要平均比較和移動表中 的一半元素。一般情況下,二分查找適應於數據相對固定的情況,且二分法查找只適用於線性表的順序存儲。
⑺ 用順序表實現二分查找演算法
#include<iostream>
using namespace std;
int a[100];
int find1(int l,int r,int x)
{
int m=(l+r)/2;
if(l>r)//查找失敗
return -1;
if(x==a[m])//查找成功返輪者回下標
return m;
else if(x>a[m])
find1(m+1,r,x);//查找右邊
else if(x<a[m])
find1(l,m-1,x);//查找左邊
}
int main()
{//折半查找,待查找數列必須有序(升序或降序)
int x,n,num;
cin>>n;//輸出n待查找數列長度
for(int i=0;i<n;i++)
cin>>a[i];//輸入n個數
cin>>x;//輸入查找值
num=find1(0,n,x);//調用折半查找函數臘鋒薯(返回下標)
if(num!=-1)//數組下標0~n-1;返回-1查找失敗
{
cout<<x<<":在數組中的位置 "基旅;
cout<<num<<endl;
}
else
cout<<"查找失敗"<<endl;
return 0;
}
⑻ 在順序存儲表中實現二分查找的演算法
#include<iostream>
using namespace std;
const int size =5;
/舉團/*****
bool find(int num[],int first,int length,int value)
{
if(first < length || length > 0){
if(value == num[(first+length)/2]) return true;
else if( value < num[(first+length)/2]) {find(num,first,(first+length)/2 - 1, value);}
else {find(num,(first+length)/2+1,length, value);}
}
else{
return false;
}
}
//****
int _tmain(int argc, _TCHAR* argv[])
{
int num[size],first=0,length=size,i,value;
cout<<"Input the num : \n";
for(i=0;i<size;++i)
cin>>num[i];
cout<<"The searched number: ";
cin>>value;
if( !find(num,first,length,value) )
cout<<"No found;\n";
else
cout<<"Yes found the number\n";
return 0;
}
// 散列表的!
#include <iostream>
using namespace std;
int HashSearch1(int ht[ ], int m, int k)
{
int j=k%m;
if (ht[j]==k)
return j; //沒有發生判答鬧沖突,比較一次查找成功
int i=(j+1) % m;
while (i!=j)
{
if (ht[i]==k)
return i; //發生沖突,比較若干次查找成功
i=(i+1) % m; //向後探測一個位置
}
if (i==j)
throw "溢出";
else
ht[i]=k; //查找不成功時插入
}
void main()
{
int s[11]={11,0,0,47,0,0,0,7,29,8,0};
cout<<"散列表中的元素有:\n";
for(int i=0;i<11;i++)
{
cout<<s[i]<<"掘罩 ";
}
cout<<"\n"<<"執行查找操作,結果為:\n"; //查找操作
cout<<HashSearch1(s,11,8)<<endl;
}