[Algorithm]查找
一.查找的算法
1.顺序查找
1 int Search_Seq( SeqList L, ElemType elem )
2 {
3 L.elem[0] = elem;
4 for ( int i = L.length; L.elem[0].key != L.elem[i].key; i-- );
5 return i;
6 }
2.折半查找(二分查找)
1 int Binary_Search( SeqList L, ElemType elem )
2 {
3 int low = 1, high = L.length;
4 while (low <= high)
5 {
6 int mid = ( low + high ) / 2;
7 if ( elem.key == L.elem[mid].key )
8 return mid;
9 else if ( elem.key < L.elem[mid].key )
10 high = mid - 1;
11 else
12 low = mid + 1;
13 }
14 return 0;
15 }
3.折半查找(二分查找)递归
1 int Binary_search_RC( SeqList L, ElemType elem, int low, int high )
2 {
3 if ( low > high ) return 0;
4 int mid = ( low + high ) / 2;
5 if ( elem.key == L.elem[mid] ) return mid;
6 else if ( elem.key < L.elem[mid] ) high = mid - 1;
7 else low = mid + 1;
8 return Binary_search_RC( L, elem, low, high );
9 }
二.字符串匹配
1.简单的模式匹配算法(朴素模式匹配算法)
1 int Index( SString S, SString T )
2 {
3 int i = 1, j = 1;
4 while ( i <= S[0] && j <= T[0] )
5 {
6 if ( S[i] == T[j] ) { i++; j++; }
7 else { i = i - j + 2; j = 1; }
8 }
9 if ( j > T[0] ) return i - T[0];
10 return 0;
11 }
2.KMP算法
算法需要先求出模式串的next值:
1 void get_next( SString T, int next[] )
2 {
3 int i = 1, j = 0;
4 next[1] = 0;
5 while (i<=T[0])
6 {
7 if (j==0||T[i]==T[j] )
8 {
9 i++; j++; next[i] = j;
10 }
11 else j = next[j];
12 }
13 }
也可求出改进后的nextval值:
1 void get_nextval( SString T, int nextval[] )
2 {
3 int i = 1, j = 0;
4 nextval[1] = 0;
5 while ( i <= T[0] )
6 {
7 if ( j == 0 || T[i] == T[j] )
8 {
9 i++, j++;
10 if ( T[i] == T[j] )
11 nextval[i] = nextval[j];
12 else
13 nextval[i] = j;
14 }
15 else j = nextval[j];
16 }
17 }
以下是KMP算法:
1 int KMP( SString S, SString T, int next[], int pos )
2 {
3 int i = pos, j = 1;
4 while ( i<=S[0]&&j<=T[0] )
5 {
6 if ( j == 0 || S[i] == T[j] ) { i++; j++; }
7 else j = next[j];
8 }
9 if ( j > T[0] ) return i - T[0];
10 return 0;
11 }
[Algorithm]查找的更多相关文章
- Sunday算法(字符串查找、匹配)
字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上,KMP算法并不比最简单的 ...
- 文本比较算法三——SUNDAY 算法
SUNDAY 算法描述: 字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上 ...
- 字符串匹配的sunday算法
sunday算法核心思想:启发式移动搜索步长! SUNDAY 算法描述: 字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).这里介 ...
- Sunday字符串匹配算法
逛ACM神犇的博客的时候看到的这个神奇的算法 KMP吧,失配函数难理解,代码量长 BF吧,慢,很慢,特别慢. BM吧,我不会写... 现在看到了Sunday算法呀,眼前一亮,神清气爽啊. 字符串匹配算 ...
- [Data Structure & Algorithm] 七大查找算法
查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找.本文简单概括性的介绍了常见的七种查找算法,说是七种,其实二分查找.插值查找以及斐波那契查找 ...
- STL中algorithm里的查找
首先,选择查找算法时,区间是否排序是一个至关重要的因素.可以按是否需要排序区间分为两组: A. count,find B. binary_search,lower_bound,upper_bound, ...
- 【algorithm】 二分查找算法
二分查找算法:<维基百科> 在计算机科学中,二分搜索(英语:binary search),也称折半搜索(英语:half-interval search)[1].对数搜索(英语:logari ...
- 【Algorithm】二分查找
今天在学习<编程之美>的时候,看到一个二分查找的题目,发现原来我真的不懂二分查找. 二分查找时候注意的事项: 在求二分查找的中间点时没有使用 midIndex = (minIndex + ...
- 《算法C语言实现》————快速-查找算法(quick-find algorithm)
算法基础是一个整型数组,当且仅当第p个元素和第q个元素相等时,p和q时连通的.初始时,数组中的第i个元素的值为i,0<=i<N,为实现p与q的合并操作,我们遍历数组,把所有名为p的元素值改 ...
随机推荐
- (转) 读懂IL
引言 转自园子里的一片关于IL的好文,分享的同时,方便自己今后查阅. 原文链接:http://www.cnblogs.com/brookshi/p/5225801.html ------ 略过作者调侃 ...
- linnx常用命令学习
ll命令就相当于ls -l. [-][rwx][r-x][r--] [-] 代表这个文件名为目录或文件(d为目录-为文件) [rwx]为:拥有人的权限(rwx为可读.可写.可执行) [r-x]为:同群 ...
- CSS JQuyer 元素选择
$(this) 当前 HTML 元素 $("p") 所有 <p> 元素 $("p.intro") 所有 class="intro" ...
- Delphi Help
http://docwiki.embarcadero.com/CodeExamples/Seattle/en/Category:Content_by_Version
- oracle更改编码
背景:win764bit英文操作系统(支持中文) oracle11G默认安装 从ZHS16GBK字符集导入数据库 表现:plsql显示为乱码,所有汉字显示为“靠” 解决:1.查看并更改数据库的编码为Z ...
- html-select
<html><head> <title>select选择标签</title> <meta charset="UTF-8"> ...
- Docker镜像加速 | Docker 中国源 | 仓库
镜像加速 | Docker 中国https://www.docker-cn.com/registry-mirror
- 使用Apache IO库操作IO与文件
--------------siwuxie095 首先到 Apache官网 下载相关的库文件 Apache官网:http://www.apach ...
- Ubuntu18.04创建新的系统用户
目标: 1.为测试学习Docker,在虚拟机OS为18.04里,创建一个系统账号,账号名称:docker 2.在/home下有新建username的文件夹 一.建立账号 1.以root账号登录 2.u ...
- Docker安装和使用Tomcat
1.搜索Tomcat镜像 docker search tomcat 2.下载Tomcat官方镜像 docker p ...