9.6 哈希查找(杂凑查找)

哈希查找(Hash Searching)也叫杂凑查找:是一种可以让数据的比较次数减少到每次只需查找一次就能找到数据的方法。

散列:要进行哈希查找,就必须构造哈希表(hash table,也叫散列表),通常哈希表的构造实现过程就叫做散列。

哈希函数:用于处理哈希表的函数,哈希函数的构造方法有很多,常用的构造哈希函数的方法有:

1. 直接定址法;

2. 数字分析法;

3. 平方取中法:

4. 折叠法;

5. 除留余数法;  最简单、最常用的构造哈希函数的方法。

6. 随机数法;

 

处理冲突方法:均匀的哈希函数可以减少冲突,但不可避免冲突,如何处理冲突是构造哈希表不可缺少的一方面。通常用的处理冲突的方法有下列几种:

1. 开放定址法;

2. 差值法;

3. 再哈希法;

4. 链地址法;

5. 建立一个公共溢出区;


下面是示例代码(待优化)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/***********************************************************/
// 程序名称:HashSearch.cpp
// 程序目的:设计一个哈希查找的程序,运用余数法做为哈希函数,差值
//                    法解决哈希冲突,设计哈希表
// 程序来源:数据结构与算法分析(C语言版) P-306
// 日期: 2013-8-30 19:09:08 JohnnyHu改进
/***********************************************************/

#include <stdio.h>
#include <stdlib.h>

#define  MAX  6
#define  HASHMAX  5
#define  NotFound  - 1
typedef  int ElementType;

int data[MAX] = { 121602195227259991};
int hashTab[HASHMAX] = { 0};
int counter;

int HashMod( int key);       
int CollisionOffset( int address);
int CreateHashTable( int key);
int HashSearch( int key);

int main( void)
{
    printf( "输出原有数据:\n");
     for ( int i= 0; i < MAX; i++)
        printf( "[%d] ", data[i]);
    printf( "\n\n");

     for ( int i= 0; i < HASHMAX; i++)
        hashTab[i] =  0;

     int index =  0;
     while (index < MAX)
    {
         if (CreateHashTable(data[index]))
            printf( "哈希表创建成功\n\n");
         else
            printf( "哈希表创建失败!\n");

        index++;
    }

    printf( "\n哈希表数据\n");
     for ( int i= 0; i < HASHMAX; i++)
        printf( "[%d] ", hashTab[i]);     // 输出哈希表数据
    printf( "\n");

     int keyValue =  0;    // 欲查找数据
     while (keyValue != - 1)
    {
        printf( "请输入要查找的值(输入-1退出): ");
        scanf( "%d",  &keyValue);

         if (NotFound != HashSearch(keyValue))
            printf( "查找次数:%d \n", counter);
         else 
            printf( "没找到\n");
    }

     return  0;
}

/************************************************************************/
// 哈希函数之余数法
/************************************************************************/

int HashMod( int key)
{
     return key % HASHMAX;    // 键值除以哈希表大小取余数
}

/************************************************************************/
// 差值法解决哈希冲突
/************************************************************************/

int CollisionOffset( int address)
{
     int offset =  3// 差值为3

     return (address + offset) % HASHMAX;
}

/************************************************************************/
// 创建哈希表
/************************************************************************/

int CreateHashTable( int key)
{
     int hashTime;        // 哈希次数
     int collisionTime;   // 碰撞次数
     int address;         // 数据地址

    hashTime =  0;
    collisionTime =  0;   // 调用哈希函数
    address = HashMod(key);

     int index;
     while (hashTime < HASHMAX)
    {
         if ( 0 == hashTab[address])   // 可存储数据
        {
            hashTab[address] = key;
            printf( "key: %d => address %d \n", key, address);

             for (index =  0; index < HASHMAX; index++)
                printf( "[%d]", hashTab[index]);
            printf( "\n");

             return  1;
        }
         else
        {
            collisionTime++;
            printf( "collision %d => address %d \n", collisionTime, address);
            address = CollisionOffset(address);  // 调用碰撞解决法
        }
        hashTime++;
    }

     return  0;
}

/************************************************************************/
// 哈希查找
/************************************************************************/

int HashSearch( int key)
{
     int address;
    address = HashMod(key);

    counter =  0// 全局
     while (counter < HASHMAX)
    {
        counter++;
         if (key == hashTab[address])
             return  1;
         else
            address = CollisionOffset(address);
    }

     return NotFound;
}
输出结果:



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值