赞
踩
哈希表,也称散列表,可以通过关键词的值进行查询和访问的数据结构。通常通过映射函数将关键字直接对应到表中的某个位置,用来加快查找速度,这个映射函数就是哈希函数,存放记录的数组叫做哈希表。
要实现从包含n个整数的数组中擦护照整数key,以下为普通的方法。
通过循环进行逐一查询,效率低。
- //从包含n个整数的数组中擦护照整数key
- //存在则返回1,不存在返回0
- int find_key(int a[], int key)
- {
- int i =0;
- for(i = 0; i < n; i++)
- {
- if(key == a[i])
- {
- return 1;
- }
- }
- return 0;
- }
- int main(void)
- {
- int a[] = { 2, 43, 2, 7, 8, 12, 9, 21 };//目标key
- int i = 0;
-
- int table[MAX_TABLE_LEN] = { 0 };//哈希表初始化
- create_hash(a, 10, table);
-
- for (i = 0; i < MAX_TABLE_LEN; i++)
- {
- if (table[i] > 0) //当table[i]大于0的时候说明i这个元素在a中出现,出现次数为table[i]
- {
- printf(" % d apper % d times.\n", i, table[i]);
- }
- }
- }
- void create_hash(int a[], int n, int table[])
- {
- int i = 0;
- for (i = 0; i < n; i++)
- {
- table[a[i]]++;
- }
- }
通过以上代码即可实现利用哈希表进行数组元素个数的统计。
- void sort(int a[], int n)
- {
- int table[MAX_TABLE_LEN] = { 0 };
- int i = 0;
- for (i = 0; i < n; i++)
- {
- table[a[i]]++;//哈希函数 记录每个元素出现的次数
- }
- int j = 0;
- int k = 0;
- for (i = 0; i < MAX_TABLE_LEN; i++)
- {
- for (j = 0; j < table[i]; j++)
- {
- a[k++] = i;//用新数组a来从i = 0开始记录i的大小,实现从小到大排序
- }
- }
- }
第一个for循环用来实现 2)中 数据 i 出现的次数,第二个外循环用来遍历table数组,内循环用来将每一个 i 在对应数量内进行遍历,将 i 的值记录在新数组a中,实现排序。
在遇到以上问题时需要使用哈希函数,我们可以将待存储的数据转换为表长范围内的整数,然后再使用数组下表进行访问。
整数类型的哈希函数
可以直接取余表长得到对应哈希值
int int_func(int key)
{
return key % MAX_TABLE_LEN;
}
字符串的哈希函数
最简单的表示为遍历字符串当中的字符,将他们的ASC||码相加得到整数,再用整数取余表长得到哈希值
int string_func(const char* key)
{
int sum = 0;
while (*key)
{
sum += *key;//遍历相加字符串中的字符ASC||
key++;
}
return sum % MAX_TABLE_LEN;//取余表长
}
由于取余的原因,哈希函数可能将不同的数据映射在同一组下标上,这样会使产生冲突,无法正确计算。所以可以使用一些方法来进行避免冲突,如线性探测 ,拉链法。该类方法将会在下一篇中进行讲解,谢谢阅读。
leetcode第349题、两个数组的交集
题目描述:给定两个数组 nums1
和 nums2
,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
- int* intersection(int* nums1, int nums1Size, int* nums2, int nums2Size, int* returnSize)
- {
- int hash1[1000] = { 0 };
- int hash2[1000] = { 0 };
- for(int i = 0; i < nums1Size; i++)
- {
- hash1[nums1[i]]++;
- }
- for(int i = 0; i < nums2Size; i++)
- {
- hash2[nums2[i]]++;
- }
- int a[1000] = { 0 };
- int k = 0;
- for(int i = 0; i < 1000; ++i)
- {
- if((hash1[i] > 0) && (hash2[i] > 0))
- {
- a[k++] = i;
- }
- }
- *returnSize = k;
- int* result = (int*)malloc(k * sizeof(int));
- for(int i = 0; i < k; i++)
- {
- result[i] = a[i];
- }
- return result;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。