• hash表的建立和查找


    (1)冲突处理方法为:顺次循环后移到下一个位置,寻找空位插入。
    (2)BKDE 字符串哈希
    unsigned int hash_BKDE(char *str)
    {
    /* 初始种子seed 可取31 131 1313 13131 131313 etc.. */
    unsigned int seed = 131;
    unsigned int hash = 0;
    while (*str)
    {
    hash = hash * seed + (*str++);
    }
    return (hash & 0x7FFFFFFF);
    }

    选做内容
    每一种西文图书都有一个国际标准图书编号,它是一个10位的十进制数字,若要以它作关键字建立一个哈希表,当馆藏书种类不到10,000时,采用折叠法构造一个四位数的哈希函数。

      1 #include<iostream>
      2 #include<string>
      3 #include<string.h>
      4 #include<stdlib.h>
      5 
      6 #define Datatype string
      7 #define max 5000
      8 using namespace std;
      9 
     10 
     11 typedef struct
     12 {
     13     Datatype data;
     14     bool isnull;
     15 }Hash;
     16 Hash hashTable[max];
     17 
     18 void initHash()
     19 {
     20 
     21     for(int i=0;i<max;i++)
     22     {
     23         hashTable[i].isnull=0;
     24     }
     25     cout<<"call initHash( )
    "<<endl;
     26 
     27 }
     28 unsigned int hash_B(char *str)
     29 {
     30     /**初始种子seed**/
     31     unsigned int seed=131;
     32     unsigned int hash=0;
     33 
     34     while(*str)
     35     {
     36         hash=hash*seed+(*str++);
     37     }
     38 
     39     return (hash&&0x7fffffff);
     40 }
     41 int insertHash(string str)
     42 {
     43     char ch[100];
     44     int index;
     45     strcpy(ch,str.c_str());
     46     index=hash_B(ch);
     47 
     48     if(hashTable[index].isnull == 0)  //没有发生冲突
     49     {
     50         hashTable[index].data = ch;
     51         hashTable[index].isnull = 1;
     52 
     53     }
     54     else    //当发生冲突的时候
     55     {
     56         while(hashTable[index].isnull == 1 && index<max)
     57         {
     58             index++;     //采用线性探测法,步长为1
     59         }
     60         if(index == max)    //Hash表发生溢出
     61             return -1;
     62         hashTable[index].data = ch;
     63         hashTable[index].isnull = 1;
     64 
     65     }
     66    // cout<<"index:  "<<index<<endl;
     67     return 0;
     68     //hashTable[index].data=ch;
     69     //hashTable[index].isnull=1;
     70 }
     71 
     72 bool findHash(string str)
     73 {
     74 
     75     char ch[100];
     76     int index,i;
     77     strcpy(ch,str.c_str());
     78     index=hash_B(ch);
     79     bool flag=0;
     80 
     81     for(i=index;i<max;i++)
     82     {
     83         if(hashTable[i].isnull==0)
     84         {flag=0;break;}
     85         if(str==hashTable[i].data)
     86         {flag=1;break;}
     87     }
     88 
     89 
     90     return flag;
     91 
     92 }
     93 int main()
     94 {
     95     initHash();
     96     int n,m,i,j;
     97     cout<<"输入:"<<endl;
     98     cin>>n;
     99     string str;
    100     for(i=0;i<n;i++)
    101     {
    102         cin>>str;
    103         if(insertHash(str)<0)
    104         {cout<<"溢出"<<endl;break;}
    105     }
    106     cin>>m;
    107     bool e[m];
    108     for(i=0,j=0;i<m;i++,j++)
    109     {
    110         cin>>str;
    111         if(findHash(str))
    112             e[j]=1;
    113         else
    114             e[j]=0;
    115     }
    116     for(j=0;j<m;j++)
    117     {
    118         if(e[j])
    119             cout<<"yes"<<endl;
    120         else
    121             cout<<"no"<<endl;
    122     }
    123     cin>>n;
    124     return 0;
    125 }
    View Code
      1 #include<iostream>
      2 #include<string>
      3 #include<string.h>
      4 #include<stdlib.h>
      5 
      6 #define Datatype string
      7 #define max 10000
      8 #define length 10
      9 #define adr 4
     10 using namespace std;
     11 
     12 
     13 typedef struct
     14 {
     15     Datatype data;
     16     bool isnull;
     17 }Hash;
     18 Hash hashTable[max];
     19 
     20 void initHash()
     21 {
     22 
     23     for(int i=0;i<max;i++)
     24     {
     25         hashTable[i].isnull=0;
     26     }
     27     cout<<"call initHash( )
    "<<endl;
     28 
     29 }
     30 unsigned int hash_B(char *str)
     31 {
     32     int i,j;
     33     int bit[length];
     34     for(i=0;i<length;i++)
     35     {
     36         bit[i]=str[i]-'0';
     37        // cout<<bit[i]<<" ";
     38     }
     39     cout<<endl;
     40 
     41     int ret=0;
     42     int temp=0;
     43     for(i=0;i<adr;i++)
     44         temp=temp*10+bit[i];
     45     ret+=temp;
     46     temp=0;
     47     for(i=adr;i<adr*2;i++)
     48         temp=temp*10+bit[i];
     49     ret+=temp;
     50     temp=0;
     51     for(i=adr*2;i<length;i++)
     52         temp=temp*10+bit[i];
     53     ret+=temp;
     54     temp=0;
     55    ret=ret%10000;
     56    cout<<"ret :"<<ret<<endl;
     57    return ret;
     58 }
     59 int insertHash(string str)
     60 {
     61     char ch[100];
     62     int index;
     63     strcpy(ch,str.c_str());
     64     index=hash_B(ch);
     65 
     66     if(hashTable[index].isnull == 0)  //没有发生冲突
     67     {
     68         hashTable[index].data = ch;
     69         hashTable[index].isnull = 1;
     70 
     71     }
     72     else    //当发生冲突的时候
     73     {
     74         while(hashTable[index].isnull == 1 && index<max)
     75         {
     76             index++;     //采用线性探测法,步长为1
     77         }
     78         if(index == max)    //Hash表发生溢出
     79             return -1;
     80         hashTable[index].data = ch;
     81         hashTable[index].isnull = 1;
     82 
     83     }
     84    // cout<<"index:  "<<index<<endl;
     85     return 0;
     86     //hashTable[index].data=ch;
     87     //hashTable[index].isnull=1;
     88 }
     89 
     90 bool findHash(string str)
     91 {
     92 
     93     char ch[100];
     94     int index,i;
     95     strcpy(ch,str.c_str());
     96     index=hash_B(ch);
     97     bool flag=0;
     98 
     99     for(i=index;i<max;i++)
    100     {
    101         if(hashTable[i].isnull==0)
    102         {flag=0;break;}
    103         if(str==hashTable[i].data)
    104         {flag=1;break;}
    105     }
    106 
    107 
    108     return flag;
    109 
    110 }
    111 int main()
    112 {
    113     initHash();
    114     int n,m,i,j;
    115     cout<<"输入:"<<endl;
    116     cin>>n;
    117     string str;
    118     for(i=0;i<n;i++)
    119     {
    120         cin>>str;
    121         if(insertHash(str)<0)
    122         {cout<<"溢出"<<endl;break;}
    123     }
    124     cin>>m;
    125     bool e[m];
    126     for(i=0,j=0;i<m;i++,j++)
    127     {
    128         cin>>str;
    129         if(findHash(str))
    130             e[j]=1;
    131         else
    132             e[j]=0;
    133     }
    134     for(j=0;j<m;j++)
    135     {
    136         if(e[j])
    137             cout<<"yes"<<endl;
    138         else
    139             cout<<"no"<<endl;
    140     }
    141     cin>>n;
    142     return 0;
    143 }
    View Code
  • 相关阅读:
    SSH 密钥类型的的选择
    VMware 默认的虚拟交换机关系与VMnet设置
    路由器端口映射不生效的解决方法
    优先使用对象组合,而不是类继承
    权限管理系统之软件注册模块
    如何正确安装phpDocumentor
    IE下cookie跨域问题
    Linux下Apache无法解析.php文件
    用 memcache 来存储 session
    windows7 下 phpunit 安装
  • 原文地址:https://www.cnblogs.com/zhenzhenhuang/p/5551234.html
Copyright © 2020-2023  润新知