哈希表(散列表)的基本原理:使用一个下标范围比较大的数组来存储元素,一般通过设计一个函数(哈希函数,即散列函数),使得每个元素的关键字都与一个函数值(即数组下标)相对应,然后用该数组单元来存储对应元素。
下面介绍用两道题目介绍一下hash表的用法:
题目描述:给你n个整数,请按从大到小的顺序输出其中前m大的数。
Input
每组测试数据有两行,第一行有两个数n,m (0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。
Output
对每组测试数据按从大到小的顺序输出前m大的数。
这个问题我们可以看到数据量很大而且整数处于[-500000,500000]之间,那么我们就可以用一个大的数组进行hash,然后进行统计。
1
#include
"
stdio.h
"
2
#include
"
memory.h
"
3
int
a[
1000001
];
4
int
main()
5
{
6
int
n,m;
7
int
tmp;
8
int
i;
9
int
count;
10
int
flag
=
0
;
11
while
(scanf(
"
%d%d
"
,
&
n,
&
m)
!=
EOF)
12
{
13
count
=
0
;
14
memset(a,
0
,
sizeof
(a[
0
])
*
1000001
);
15
for
(i
=
0
;i
<
n;i
++
)
16
{
17
scanf(
"
%d
"
,
&
tmp);
18
a[tmp
+
500000
]
=
1
;
19
}
20
flag
=
0
;
21
for
(i
=
1000000
;i
>=
0
;i
--
)
22
{
23
if
(a[i]
!=
0
)
24
{
25
if
(
!
flag)
26
{
27
printf(
"
%d
"
,i
-
500000
);
28
flag
=
1
;
29
}
30
else
31
{
32
printf(
"
%d
"
,i
-
500000
);
33
}
34
count
++
;
35
}
36
37
if
(count
==
m)
38
break
;
39
}
40
printf(
"
"
);
41
}
42
return
0
;
43
44
}