哈希查找(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] = { 12, 160, 219, 522, 725, 9991}; 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; } |