第四讲. 经典算法之哈希映射
1. 简介
哈希即Hash,一般翻译为散列的意思,简单而言其实就是通过一个函数,将一个值映射成另一个更好的值。
这个更好,是一个比较抽象的概念。可以是把一个很大的数,映射到一个小的区间内,以作为数组索引;也可以是将一个非数值型数据,如字符串等映射成一个数值型数据,以实现更好的索引或者判重;又或者将一段很长的信息加密成一段短小的密文,以实现信息的保密传输等等。
x = H ( k ) x=H(k) x=H(k)这里的 k k k 表示原始值或者哈希键值, H H H 表示映射函数, x x x 表示将哈希键映射后的结果值。
2. 从一个简单例题开始
现在给出 n 个数(a[0],a[1],…,a[n-1]),且每个数的大小都是小于等于 1010 的非负数(0<=a[i]<=1010),现需要统计每个数的出现次数,并从小到大依次输出,且 n 是小于等于 100 的正整数(0<n<=100)。
输入样例:
10
12 116 87 105 12 605 8998 87 12 105
输出样例:
12 3
87 2
105 2
116 1
605 1
8998 1
我想许多人拿到这类题的第一感觉就是,直接利用数组的下标索引标记每个数,然后每次出现 i ,便令 x[i]++ 即可。确实,这样的算法非常灵活地运动了下标,在统计计数地过程中也达到了线性时间复杂度,是最优的算法了,代码如下:
#include <stdio.h>
#define MAX 10000000000
int x[MAX+5] = {
0};
int main()
{
int n