四、搜索算法

线性搜索

特点:适用于随机的数据,从头开始,一个个查找。随着数据量增大,查找越耗时。
步骤:
1. i<n时进行查找
2. 找到break跳出循环,找不到i++
3. 循环结束时,i<n则i是下标,i=n则没找到

二分搜索

特点:适用于已经排好序的数据,找到中间数据,通过比较判断数据在中间数据的哪一边,再将剩下的数据分为两半,不停查找(查找范围缩小一半)
步骤:
1. 当查找数据大于1时进行查找
2. 当等于中间数据时,找到break跳出循环
3. 当小于中间数据时,查找左边的数据
4. 当大于中间数据时,查找右边的数据

插值查找

特点:假设数据是平均分布的,每个数据的差距接近(类似等差数列),利用公式预测数据所在的位置,再用二分搜索逼近
公式:mid=low + ((key - data[low])/(data]height]-data[low]))*(heigh-low)

简单字符搜索
步骤:
1. i=0
2. 当i+substr<str时循环
3. j=0
4. 当j<substr时,数值不相等则break,进入下一轮循环。数值相等,则i++,j++
当j=substr,i=i-j
当j<substr, i=i-j+1

哈希表搜索

特点:根据哈希函数计算数据对应的地址

1. 除留余数法
数据除以常数获得余数,用余数作为索引。哈希表是连续的,没有用到的索引对应的数据是空
除数一般是质数,索引范围是0-质数
2. 平方取中法
先数据平方,再取其中的几位作为索引值
3. 折叠法
把数据拆成几部分,再把这几部分累加,作为索引值
4. 数字分析法
检查数据的相对位置和分布情况,提取随机度高的其中几位作为索引值

溢出:哈希表存储数据的位置满了(对应的索引的存储位置已经存有数据),
1. 线性探测法:往后查找空位置(类似环形结构)
2. 平方探测法:溢出发生时查找的是f(x)+i2 mod B ,再找f(x)-i2 mod B,(i=0,1,2……)
3. 再哈希法:溢出则再使用第二种哈希函数,再溢出则使用第三种哈希函数,一直到成功

kmp字符串搜索

特点:利用已经匹配的字符串中,不一致的位置开始匹配,(已经匹配的没有重复字符】)

bm字符串搜索
特点:从子串的后面向前开始比较,根据字符串信息和适配的位置跳过字符串比较位置

最小生成树(无向图)

特点:以最少的边连通图中的所有顶点,且不造成回路。加权图中寻找最小生成树:无相连通图,用贪婪法则
1. prim算法
步骤:
a. 对一个加权图G=V,E),设V={1,2,n},U={1},
b. 求U-V 的差集,V中与U不相交的部分中找到一个顶点,该顶点能和U中顶点形成最小成本的边,且不会造成回路。然后将x加入U集合中
c. 循环b,直到U=V
2. kruskal算法
步骤:
a. 各边按权重从小到大排序
b. 从权志最小的边开始开始建立最小生成树,如果加入后造成回路,则不用
c. 循环b,直到加入n-1个边

有向图最短路径

1. dijkstra迪克斯特拉算法
特点:从起点出发,计算与起点直连的顶点的权重,找到最小那个作为新起点,再次计算与它直连的顶点(不包括走过的那个顶点)的权重,再找到最小那个……
步骤:
	a. G=(V,E)  V所有顶点的集合,E所有边的集合,V={1……N}
	b. D[K] = A[F,K}  (k=1….N)  顶点F到K的距离
	c. S={F} 所有顶点的集合,初始值F
	d. 从V-S中找到顶点x,使得D(x)的值最小,把x放入S中
	D[i]=min{D[i],D[x]+A[x,i]}  ,i是指x相邻各顶点的值
2. A*(dijkstra算法改进版)
特点:需要计算起点和各个顶点之间的距离,还要预估各个顶点到终点的推测权重,减少不必要的查找
推测权重:
	a. 曼哈顿距离:D=|x1-x2|+|y1-y2|
	b. 切比雪夫距离:D=max(|x1-x2|,|y1-y2|)
	c. 欧式几何平面距离:D=sqrt|x1-x2|2+|y1-y2|2
步骤与dijkstra算法类似,起点到顶点的权重+顶点到终点的推测权重,找到最小值
3. Floyd
特点:求任意两点或多点之间的距离。一个加权图有n个顶点,必须执行n次循环

A0[i][j]=cost[i][j] A0为i,j之间的距离的矩阵
An[i][j]                An为I,j之间的最短距离的矩阵
AK[i][j] = min{AK-1[i][j], AK-1[i][k]+AK-1[k][j]},K>=1
AK[i][j]为I,j之间,经过k顶点的最短距离

举例:经过顶点1的最短距离
A1[1][2]=min{A0[1][2].A0]1][1]+A0[1][2]}
A1[1][3]=min{A0[1][3].A0]1][1]+A0[1][3]}
A1[2][1]=min{A0[2][1].A0]2][1]+A0[1][1]}

广度优先算法:从起点开始,找到所有与起点直连的顶点作为候补顶点。再找到第一个候补顶点的候补顶点,第二个候补顶点的候补顶点……。遍历完起点的候补顶点后,再往下。
深度优先算法:从起点开始,沿着一条路径不断向下。直到不能往下再返回。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值