第七章小结

概念梳理:

1、查找表:是由同一类型的数据元素(或记录)构成的集合。

2、关键字:是数据元素(或记录)中某个数据项的值,用它可以标识一个数据元素(或记录)。

主关键字:若此关键字可以唯一地标识一个记录,则称此关键字为主关键字

反之称为次关键字。

3、查找

(1)静态查找表:在查找的同时不对表进行修改操作。

(2)动态查找表:在查找的同时对表做修改操作(如插入、删除)。

4.学了几种查找,主要讲讲二分查找:

代码:

int Search_Bin(SSTable ST,KeyType key)
{//在有序表ST表中折半查找其关键字等于key的数据元素。若找到,则函数值为该元素在表中的位置,否则为0;
   int low = 1 ,high = ST.length;//置查找区间初值。 
   int mid;
   while(low<=high)   
   {
         mid = (low+high)/2;
         if(key==ST.R[mid].key) //找到待查找元素; 
         return mid;
         else
         if(key<ST.R[mid].key) high = mid - 1;//继续在前一子表进行查找; 
         else
           low = mid + 1;//继续在后一子表中进行查找; 
    } 
    return 0; //表中不存在待查元素; 
    
}

  时间复杂度为log2n,大大节省了搜索时间,但仅限于排好序的顺序表。

5.散列表查找代码

#include<iostream>
#include<cmath>
using namespace std;
bool isprime(int Tsize);
int main()
{
    int hash[1000]={},i,j,k=1,Tsize,insize,key[10000],temp,temp1[10000]={},flag=0;
    cin>>Tsize>>insize;
      for(i=0;i<insize;i++)
        cin>>key[i];//输入待存储整数 
    if(!isprime(Tsize))//判断是否素数
    {
    temp=Tsize; 
//    cout<<"1";
    while(!isprime(temp))//寻找大于Tsize的最小素数
        {
            temp=temp+1;
//            cout<<temp<<"a";
            if(isprime(temp))//如果是素数,将其赋值给Tsize 
            {
                Tsize=temp; 
//                cout<<Tsize;
        } 
            }
}
    for(i=0;i<Tsize;i++)
        hash[i]=-1;
    i=0;
    while(i<insize)
    {//求取地址值 
        temp=key[i]%Tsize;
//        cout<<temp<<endl;
        if(hash[temp]==-1)//不发生冲突直接赋值 
        {
            flag=1;
            hash[temp]=key[i];
            if(i==0) cout<<temp;
            else
            cout<<" "<<temp;//用数组存储各个地址数值 
        } 
        else
            while(temp<Tsize)
                {//当发生冲突时,采用二次探测法 
                temp=temp+k*k;
                k++;
                if(hash[temp]==-1&&temp<Tsize)//未赋值并且未超过长度则取其地址 
                    {
                    flag = 1;
                    hash[temp]=key[i];
                   if(i==0) cout<<temp;
            else
            cout<<" "<<temp;
                    break;
                }
            }
        if(flag==0&&i==0)
        cout<<"-";
        else if(flag==0)
        cout<<" "<<"-";
        flag = 0;
        k=1;    
        i++;
    }
//    for(i=0;i<insize;i++)//输出地址值
//    {
//    if(hash[i]!=-1)
//        cout<<" "<<temp1[i];
//    else
//        cout<<" "<<"-";
//            if(hash[i]!=-1)
//        cout<<" "<<hash[i];
//    else
//        cout<<" "<<"-";                                
//}
}
bool isprime(int Tsize)
{
    int k;
    for(k=2;k<=sqrt(Tsize);k++)
        if(Tsize%k==0)
            return false;
    return true;        
}                                                              

debug仍在进行中

posted on 2019-06-02 23:58  AUlikeHER  阅读(125)  评论(2编辑  收藏  举报