1 顺序查找(编程简单,但效率低,要查找的数小于10000条)
2 二分法查找(必须是有序表)
3 分块查找(块间有序,块内无序) 块间可以用顺序或二分法查找,块内只能顺序查找
有一个索引表(记录了块间间隔点,和每块的最大值)
4 hash表(哈希表,散列表)
哈希表
关键字 根据 一个算法求出 一个位置(此关键字保存的位置)
算法(哈希函数)
直接地址法
平方取中法
叠加法
顺序查找 二分法查找 分块查找 哈希查找
按 从快 到慢 排序
哈希 > 二分 > 分块 > 顺序
哈希表查找:
质数除余法: 1) 选取小于表长的最大质数(例: 表长20----> 19 表长15---> 13),
2) 每个关键字对 19取余,求出位置
装填因子: 元素个数 / 实际表长 (11 / 15 = 0.75)
一般都选 0.75 或者 0.5
表长如何设计? 通过元素个数 和 装填因子求出表长: 元素个数 / 装填因子 (11 / 0.75 = 15)
线性探查法: 如果将要存入数据的位置有数,那么存入+1位置,如果还有+2, +3 ....
4 质数除余法
练习: 用 保留余数法存 k={23,34,14,38,46,16,68,15,07,31,26} 数据,
采用 线性探查解决冲突(一旦冲突往 +1, +2, +3, +...位置存)
#include <stdio.h>
int hash_fun(int x)
{
return x % 13;
}
int find_by_hash(int *p, int x)
{
int pos = hash_fun(x);
while(p[pos] != x && p[pos] != 0)
{
pos++;
pos = pos % 15;
}
if(p[pos] == 0)
return -1;
else
return pos;
}
void save_by_hash(int *p, int x)
{
int pos = hash_fun(x);
while(p[pos] != 0) //只要有数据,就说明冲突,继续向下找
{
pos++;
pos = pos % 15;
}
p[pos] = x;
}
int main()
{
//1 定义原始数据
int n, i, a[] = {23, 34, 14, 38, 46,