线性搜索
特点:适用于随机的数据,从头开始,一个个查找。随着数据量增大,查找越耗时。
步骤:
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]}
图
广度优先算法:从起点开始,找到所有与起点直连的顶点作为候补顶点。再找到第一个候补顶点的候补顶点,第二个候补顶点的候补顶点……。遍历完起点的候补顶点后,再往下。
深度优先算法:从起点开始,沿着一条路径不断向下。直到不能往下再返回。