Ⅰ 求分塊查找演算法 最好有代碼和詳細注釋
注意:採用「二分查找」時,初始的數組或其他線性表中的每個元素都必須是按一定的順序排列的(從大到小,或從小到大),
該演算法的基本思想:對一個有序數據序列,總是先把查找目標與該序列的中間的元素進行比較,我們假設該序列是由從小到大排列的,if(key > data[mid]),則key一定在data[mid]的又邊,於是,把mid到序列data[end]分成一塊,此時mid = (mid + end) / 2,依次類推
參考程序:
#include<stdio.h>
#define MAXSIZE 26 //定義索引表的最長長度
typedef char TYPE;
int blksearch(TYPE R[],TYPE K);
void main()
{
int num, i;
TYPE R[N + 1];
TYPE K;
for(i = 0;i<N;i++)
R[i]='a'+i;
printf("\nplease input the key number:\n");
K=getchar();
num=blksearch(R,K);
if(num!=-1)
printf("第%d個是關鍵字\n",num+1);
else
printf("查找失敗!\n");
}
int blksearch(TYPE R[],TYPE K) //分塊查找
{
int low1,mid,high1;
low1=0;
high1=N - 1; //二分查找區間上下界初值
while(low1<=high1)
{
mid=(low1+high1)/2;
if(K < R[mid])
high1=mid-1;
else
if(K > R[mid])
low1=mid+1;
else
return mid; //如果找到key,立即返回key的位置
}
return -1;// 只要上面的return語句沒執行,則原數組中無key,返回-1
}
Ⅱ 索引順序表的查找:編寫利用折半查找確定記錄所在塊的分塊查找演算法,並討論在塊中進行順序查找時使用「監
#include <iostream>
using namespace std;
int s,d,ss,dd;//聲明一些全局變數,方便函數與主函數之間的變數調用。
template <class T>
int BinSearch(T A[],int low,int high,T key)//遞歸實現折半查找
{
int mid;// 初始化中間值的位置
T midvalue;// 初始化中間值
if (low>high)
{
s=A[high];
d=A[low];
ss=high;
dd=low;
return -1;}// 如果low的值大於high的值,輸出-1,並且將此時的low與high的值存儲。
else
{
mid=(low+high)/2;// 中間位置為低位與高位和的一半取整。
midvalue=A[mid];
if (midvalue==key)
return mid;
else if (midvalue < key) //如果關鍵字的值大於中間值
return BinSearch(A,mid+1,high,key);// 遞歸調用函數,搜索下半部分
else
return BinSearch(A,low,mid-1,key);// 否則遞歸調用哦個函數,搜索上半部分
}
}
template <class T>
int shuxuSearch(T A[],int high,T key)// 順序查找
{
int i=0; A[high]=key;// 初始化i,使 A的最高位為key值
while(A[i]!=key)
i++;
return i;// 如果A中有key值,則在i不到n+1時就會輸出,否則,返回high值,說明搜索失敗。
}
int main()
{
int i,key,pos,length,fen,k,j,a,kuai,e;// 定義一些變數
a=0;
k=0;
cout<<"請輸入關鍵字的個數"<<endl;
cin>>length;
int A[length-1]; // 根據輸入關鍵字的個數初始化一個數組進行存儲
cout<<"請輸入要分塊的個數"<<endl;
cin>>fen;
int B[fen-1];
int M[fen-1];
for(i=0;i<fen;i++)
{M[i]=0;}// 初始化兩個數組,一個用來存儲每一塊元素的大小,另一個用來存儲每一塊的中元素的最大值
cout<<"請輸入每個分塊關鍵字的個數"<<endl;
for(i=0;i<fen;i++)
{cin>>B[i];}//使數組B中表示每塊中關鍵字的個數
cout<<"請輸入關鍵字"<<endl;
for(i=0;i<length;i++)
{cin>>A[i];}//輸入所有的關鍵字,存在數組A中
int row,col;
row=fen;
col=length;
int **p2 ;
p2 = new int*[row] ;//聲明一個二維數組
for( i = 0 ; i < row ; i ++ )
p2[i] = new int[col] ;
for( i = 0 ; i < row ; i ++ )
{for( j = 0 ; j < B[i] ; j ++ )
{p2[i][j]=A[k];
k=k+1;}
}//將所有關鍵字,按塊的不同存入二維數組中
cout<<"分塊情況為"<<endl;
for( i = 0 ; i < row ; i ++ )
{
for( j = 0 ;j <B[i] ; j ++ )
{cout<<p2[i][j]<<' ' ;
if(p2[i][j]>=M[i])
M[i]=p2[i][j];
}
cout<<endl;
}//輸出二維數組,檢驗分塊是否為預期
cout<<"每個塊最大元素為"<<endl;
for(i=0;i<fen;i++)
{cout<<M[i]<<endl;}//將每一組的最大元素存入數組M中
cout<<endl<<"請輸入要查找的元素";
cin>>key;//將要查找的關鍵字賦值給key
pos=BinSearch(M,0,length-1,key);//調用折半查找函數,查找關鍵字處於哪個塊中
cout<<"該元素所處的塊是"<<endl;
if (pos!=-1)
{kuai=pos;
cout<<kuai<<endl;
}
else
{kuai=dd;
cout<<kuai<<endl;}//將關鍵字所在的塊輸出。
int *S;
S = new int[kuai] ;
for(i=0;i<B[kuai];i++)
{S[i]=p2[kuai][i];
}//初始化一個一維數組,將 關鍵字所在快的元素重新定義為一個數組S
pos=shuxuSearch(S,B[kuai],key);//在S中順序查找關鍵字
int q=0;
for(i=0;i<kuai;i++)
{q=q+B[i];}
if (pos!=B[kuai])
cout<<"該元素的位置為"<<pos+q<<endl;//如果關鍵字存在,輸出其位置
else
cout<<"不存在該元素"<<endl;//若不存在,輸出"不存在該元素"
cout<<"還要繼續查找嗎?是的話,輸入1,不是的話輸入0"<<endl;
cin>>e; //引入判斷條件,以便多次查找
while ((e!=1)&&(e!=0))
{cout<<"輸入不合法,請重新輸入e"<<endl;
cin>>e;}//保證輸入合法
while (e==1)
{
cout<<endl<<"請輸入要查找的元素";
cin>>key;
pos=BinSearch(M,0,length-1,key);
cout<<"該元素所處的塊是"<<endl;
if (pos!=-1)
{kuai=pos;
cout<<kuai<<endl;
}
else
{kuai=dd;
cout<<kuai<<endl;}
for(i=0;i<B[kuai];i++)
{S[i]=p2[kuai][i];}
pos=shuxuSearch(S,B[kuai],key);
int q=0;
for(i=0;i<kuai;i++)
{q=q+B[i];}
if (pos!=B[kuai])
cout<<"該元素的位置為"<<pos+q<<endl;
else
cout<<"不存在該元素"<<endl;
cout<<"還要繼續查找嗎?是的話,輸入1,不是的話輸入0"<<endl;
cin>>e; //與上面程序一致,通過循環條件保證可以多次進行查找
}
system("pause");
return 0;
}
Ⅲ http://www.baidu .com/
們我現在有一個C++作業題不會做,特向你們求助,懇請你們能給我些幫助!!!下面是問題的題目及要求,謝謝你的幫助!
一、題目:用分塊查找方法解決在資料庫中查找與關鍵字相同記錄的問題
1. 基本要求:
(1)要求用C++模塊化設計的思想來完成程序的設計;
(2)要求各個功能分別使用函數來完成,主函數和各個函數分別存放在不同的.cpp文件中,要求使用頭文件;
(3)程序調試通過後,完成程序文檔的處理,加必要的注釋。
三、設計方法和基本原理
1. 問題描述:
在一組無序數列中查找某個數據,找到則輸出該數據,否則輸出未找到信息。
2. 問題的解決方案:
根據問題的描述,可以按照要求的功能採用結構化的設計思想。
(1) 數列的賦值要求編寫獨立函數實現;
(2) 將無序數列排序為有序數列可以用「拉鋸法」排序法也可以用其他方法實現,並編寫獨立函數;
(3) 分塊查找的演算法用獨立函數實現
四、主要技術問題的描述
根據三的分析,主要問題在於:
1、排序演算法的實現(不限方法)
2、分塊查找方法的實現
分塊查找又索引查找,它主要用於「分塊有序」表的查找。所謂「分塊有序」是指將線性表L(一維數組)分成m個子表(要求每個子表的長度相等),且第i+1個子表中的每一個項目均大於第i個子表中的所有項目。「分塊有序」表應該包括線性表L本身和分塊的索引表A。因此,分塊查找的關鍵在於建立索引表A。
(1)建立索引表A(二維數組)
索引表包括兩部分:關鍵字項(子表中的最大值)和指針項(子表的第一項在線性表L中位置)
索引表按關鍵字有序的。
例如:線性表L(有序)為:1 2 3 4 5 6 7 8 9 10 11 12
分成m=3個子表:{1 2 3 4} {5 6 7 8} {9 10 11 12}
索引表A:二維數組:第一列為每個子表的最大值 ,第二列為每個子表的起始地址
即: 4 0
8 4
12 8
Ⅳ 分塊查找演算法中如何對數據分塊
可以實現確定待查找數據的上限和下限,
然後對該區間等分N塊,
那麼這N塊就可以作為分塊查找的塊,
然後將原數組中的元素按區間插入進去,
當然,這樣劃分不能保證每個塊中的元素個數相等,
但是,分塊查找演算法並不嚴格要求每塊中的元素的個數相等。
Ⅳ 分塊查找(C語言)
i=idx[low1].low是塊中第一個元素的起始位置的值
int blksearch(sqlist r,index idx,find=0,hb;) // bn為塊個數 //
{ int i,;low=1,high1=bn,midl,find=0,hb;
while(low1<=high1&&!find)
{mid=(low1+high1)/2;
if(k<idx[mid1].key)high1=mid-1;
else if(k>idx[mid1],key)low1=mid1+1;
else{
low=mid1;
find=1;
}
到這里是初步鎖定要查的元素在那個塊,找到大的方向後 在塊里進行進一步的搜索
if(low1<bn)//如果low1的值沒有超過塊的總個數
i=idx[low1].low; //i賦值為該塊內第一個元素的起始位置
然後進一步查到元素