例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\n",nCount);
41                                for(int i = 0;i<nCount;i++)
42                                {
43                                        printf("123123123\n");
44                                        Value = rand()%50;
45                                        InsertHash(hash,11,Value);
46                                        printf("%d \n",Value);
47                                }
48                                scanf("%d",&Value);
49                                if(SearchHash(hash,11,Value) != -1)
50                                {
51                                                             printf("查找成功,查找值为:%d\n",SearchHash(hash,11,Value));
52                                }
53                                else
54                                {
55                                                             printf("查找失败!\n");
56                                }
57     }
58
59     return 0;
60 }

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

时间: 2024-11-02 23:23:18

例27:哈希查找的相关文章

poj 3349:Snowflake Snow Snowflakes(哈希查找,求和取余法+拉链法)

Snowflake Snow Snowflakes Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 30529   Accepted: 8033 Description You may have heard that no two snowflakes are alike. Your task is to write a program to determine whether this is really true. Y

查找算法系列之复杂算法:哈希查找

眼下为止已经介绍了顺序查找.二分查找.分块查找.二叉排序树.见作者之前的文章: http://blog.csdn.net/u010025211/article/details/46635325 http://blog.csdn.net/u010025211/article/details/46635183 今天这篇博文将介绍哈希查找. 1.为什么要用哈希查找 之前所讲的查找方法都是须要比較待查找元素与线性表或者树中的元素才干实现. 这种时间复杂度为O(n)或者O(log n),那么有没有可能当给

python数据结构与算法 29-1 哈希查找

前面的章节中,我们利用数据集中元素的相对位置信息来提高查找算法的性能. 比方知道列表是有序的,能够使用二分查找.本节我们走得更远一些,创建一个数据结构,使得查找性能提高到O(1).称为哈希查找. 要做到这种性能,我们要知道元素的可能位置.假设每一个元素就在他应该在的位置上,那么要查找的时候仅仅须要一次比較得到有没有的答案,但以下将会看到.不是这么回事. 哈希表是这样一种数据集合,元素的保存的时候就存在easy找到位置上.哈希表表中每个位置,一般称为槽位,每个槽位都能保存一个数据元素并以一个整数命

linux内核哈希查找(1)

在内核中,查找是必不可少的,比如说内核管理这么多用户进程,现在要快速定位某一个进程,这儿需要查找,还有,一个进程的地址空间中有多个虚存区,内核要快速定位进程地址空间的某个虚存区,这儿也需要查找,等等.其中用的最多就是基于树的查找-------->红黑树.和基于计算的查找------->哈希查找.两者的查找的效率高,而且适应内核的情况,而基于线性表的查找-------->二分查找,尽管效率高但不能适应内核里面的情况,现在版本的内核几乎不可能使用数组管理一些数据,这太原始了.而二分查找必须使

9-12-哈希查找表/散列表-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第9章  查找 - 哈希查找表/散列表 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Base.c        相关测试数据下载  链接? 数据包      

2. C#数据结构与算法 -- 查找算法(顺序查找,哈希查找,二分查找(折半),索引,二叉)

1. 顺序查找算法 ===================================================== 算法思想简单描述: 最突出的查找类型就是从记录集的开始处顺次遍历每条记录,直到找到所要的记录或者是 到达数据集的末尾.这就是所谓的顺序查找.顺序查找(也被称为线性查找)是非常容易实现 的.从数组的起始处开始,把每个访问到的数组元素依次和所要查找的数值进行比较.如果找 到匹配的数据项,就结束查找操作.如果遍历到数组的末尾仍没有产生匹配,那么就说明此数 值不在数组内. ==

poj 2526 Center of symmetry 哈希查找

题意: 给n个不同的点,问是否存在一个点使得这n个点关于它两两对称. 分析: 首先确定这个对称中心的坐标,然后对每个点哈希查找它的对称点. 代码: //poj 2526 //sep9 #include <iostream> using namespace std; const int maxN=10024; const int hashlen=1000023; const int mod=40013; struct Point { int x,y; }p[maxN]; struct Node

python 哈希查找

import random INDEXBOX=7 #哈希表元素个数 MAXNUM=13 #数据个数 class Node: #声明链表结构 def __init__(self,val): self.val=val self.next=None global indextable indextable=[Node]*INDEXBOX #声明动态数组 def create_table(val): #建立哈希表子程序 global indextable newnode=Node(val) myhash

python实现顺序查找和哈希查找

顺序查找非常简单,只是个开胃菜,今天主要练习的是哈希查找 先上顺序查找代码: def sequence_search(array, num): for i in range(len(array)): if array[i] == num: return i return False array_0 = [23, 43, 12, 54, 65, 48] print(sequence_search(array_0, 12)) >>> 2 在来看hash查找: 算法思想 哈希的思路很简单,如果