【数据结构】查找

下列元素存储均从数组下标0开始。

1.顺序查找

思想:从线性表的一端开始,顺序扫描,依次将扫描到的值与定值k比较,若当前扫描的关键字与k相等,则查找成功;若扫描结束仍未发现关键字等于k的记录,则查找失败。
代码

int seqSearch(int a[],int n,int k)
{
	for(int i=1;i<n;i++)
		if(a[i]==k)return i;
	return -1;
}

2.折半查找

思想:对于已按关键字排序的序列,经过一次比较,可将序列分割成两部分,然后只在有可能包含待查元素的一部分中继续查找,并根据试探结果继续分割,逐步缩小查找范围,直至找到或找不到为止。
代码

//仅适用于有序的顺序表
int binSearch(int a[],int l,int r,int k)
{
	while(l<=r){
		int mid=(l+r)/2;
		if(a[mid]==k)return mid;
		else if(a[mid]>k)r=mid-1;
		else l=mid+1;
	}
	return -1;//查找失败返回-1
}

3.哈希(散列)表

思想:它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。散列查找是一种典型的“空间换时间”的算法。

3.1哈希函数的构造方法

3.1.1除留取余法

H ( k e y ) = k e y % p ( p ≤ m ) p 一 般 为 小 于 或 等 于 表 长 的 最 大 质 数 H(key)=key \%p(p\le m) p一般为小于或等于表长的最大质数 H(key)=key%ppmp

3.1.2直接定址法

H ( k e y ) = a × k e y + b H(key)=a \times key+b H(key)=a×key+b

3.1.3平方取中法

取 关 键 字 的 平 方 值 的 中 间 几 位 作 为 散 列 地 址 取关键字的平方值的中间几位作为散列地址

3.1.4数字分析法

选 取 数 码 分 布 较 为 均 匀 的 若 干 位 作 为 散 列 地 址 ( 如 电 话 号 码 等 ) 选取数码分布较为均匀的若干位作为散列地址(如电话号码等) ()

3.2处理哈希冲突的方法

3.2.1链地址法

把 所 有 同 义 词 用 单 链 表 连 接 起 来 把所有同义词用单链表连接起来

3.2.2开放定址法

H i ( k e y ) = ( H ( k e y ) + d i ) % m , d i 为 增 量 序 列 , i 表 示 “ 第 i 次 发 生 冲 突 ” H_i(key)=(H(key)+di) \%m ,di为增量序列,i表示“第i次发生冲突” Hi(key)=(H(key)+di)%m,diii

线性探测法
增 量 序 列 : d i = 0 , 1 , 2 , 3... , m − 1 增量序列:di=0,1,2,3...,m-1 di=0123...m1
平方探测法
增 量 序 列 : d i = 0 2 , 1 2 , − 1 2 , 2 2 , − 2 2 , . . . , k 2 , − k 2 ( k ≤ m 2 ) 增量序列:di=0^2,1^2,-1^2,2^2,-2^2,...,k^2,-k^2 (k\le \frac{m}{2}) di=02121222,22,...k2,k2(k2m)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值