• 例27:哈希查找


    哈希查找本身听着很是高端,然后呢,听着感觉很难的样子,但是其原理也是非常简单,其实他的意思就是说通过一个函数,直接把值的地址与值本身之间关联起来,成为一个地址 = F(值)的函数,所以这种方式的查找速度为O(1),是一种很快的查找方式。

    1.在查找之前首先先建立哈希表,其实就是按照 地址=F(值) 函数给出值所应存储的地址。常用的哈希函数有五种:直接定址法,除数取余法,数字分析法,平方取中法,折叠法。具体方法此处不详细介绍了,读者可以上网搜索一下,很多介绍很详细的。

    2.如果此地址已经保存了某个值,那么可以用解决冲突的方法解决,常用方法有开放地址法和链地址法。同样,此处不详细介绍,文末结束处会放个链接,大家可以看一下这篇介绍哈希查找的文章,大多方法都有介绍。

    3.我们采用的是除数取余法(题目中给定H(key) = key%11),和开放地址法(“采用线性探测再散列”)的方法。

    代码如下:

     1 #include<stdio.h> 
     2 #include<time.h>
     3 #include<stdlib.h>
     4 #include<string.h>
     5 
     6 void InsertHash(int hash[],int nCount,int Value)
     7 {
     8      int hashAddress = Value%nCount;
     9      while(hash[hashAddress] != 0)
    10      {
    11                              hashAddress = (++hashAddress)%nCount;
    12      }
    13      hash[hashAddress] = Value;
    14 }
    15 
    16 int SearchHash(int hash[],int nCount,int Value)
    17 {
    18      int hashAddress = Value%nCount;
    19      while(hash[hashAddress] != Value && hash[hashAddress] != 0)
    20      {
    21                              hashAddress = (++hashAddress)%nCount;
    22      }
    23      if(hash[hashAddress] == 0)
    24      {
    25                           return -1;
    26      }
    27      else 
    28      {
    29           return hashAddress;
    30      }
    31 }
    32 
    33 int main()
    34 {
    35     int hash[11],nCount,Value,Address;
    36     while(~scanf("%d",&nCount) && nCount)
    37     {
    38                                memset(hash,0,sizeof(hash));
    39                                srand((unsigned long)time(0));
    40                                printf("nCount: %d
    ",nCount);
    41                                for(int i = 0;i<nCount;i++)
    42                                {
    43                                        printf("123123123
    ");
    44                                        Value = rand()%50;
    45                                        InsertHash(hash,11,Value);
    46                                        printf("%d 
    ",Value);
    47                                }
    48                                scanf("%d",&Value);
    49                                if(SearchHash(hash,11,Value) != -1)
    50                                {
    51                                                             printf("查找成功,查找值为:%d
    ",SearchHash(hash,11,Value));
    52                                }
    53                                else
    54                                {
    55                                                             printf("查找失败!
    ");
    56                                }
    57     }
    58     
    59     return 0;
    60 }

    另外文章地址:http://blog.csdn.net/xiaoping8411/article/details/7706376

  • 相关阅读:
    python struct使用
    pythonunittest(1)
    python os.path模块学习(转)
    pythonunittest(2)
    主机+虚拟机Ubuntu+开发板互相ping通
    wince 外部中断调用可安装ISR错误(data abort)
    wince firstboot.nb0 的大小的问题解决
    wince 串口索引超过10个解决方法
    wince uboot 启动 wince
    zigbee 天线的设计
  • 原文地址:https://www.cnblogs.com/FWFC/p/6292570.html
Copyright © 2020-2023  润新知