一.查找的算法


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]查找的更多相关文章

  1. Sunday算法(字符串查找、匹配)

    字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上,KMP算法并不比最简单的 ...

  2. 文本比较算法三——SUNDAY 算法

    SUNDAY 算法描述: 字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).两个算法在最坏情况下均具有线性的查找时间.但是在实用上 ...

  3. 字符串匹配的sunday算法

    sunday算法核心思想:启发式移动搜索步长! SUNDAY 算法描述: 字符串查找算法中,最著名的两个是KMP算法(Knuth-Morris-Pratt)和BM算法(Boyer-Moore).这里介 ...

  4. Sunday字符串匹配算法

    逛ACM神犇的博客的时候看到的这个神奇的算法 KMP吧,失配函数难理解,代码量长 BF吧,慢,很慢,特别慢. BM吧,我不会写... 现在看到了Sunday算法呀,眼前一亮,神清气爽啊. 字符串匹配算 ...

  5. [Data Structure & Algorithm] 七大查找算法

    查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算,例如编译程序中符号表的查找.本文简单概括性的介绍了常见的七种查找算法,说是七种,其实二分查找.插值查找以及斐波那契查找 ...

  6. STL中algorithm里的查找

    首先,选择查找算法时,区间是否排序是一个至关重要的因素.可以按是否需要排序区间分为两组: A. count,find B. binary_search,lower_bound,upper_bound, ...

  7. 【algorithm】 二分查找算法

    二分查找算法:<维基百科> 在计算机科学中,二分搜索(英语:binary search),也称折半搜索(英语:half-interval search)[1].对数搜索(英语:logari ...

  8. 【Algorithm】二分查找

    今天在学习<编程之美>的时候,看到一个二分查找的题目,发现原来我真的不懂二分查找. 二分查找时候注意的事项: 在求二分查找的中间点时没有使用 midIndex = (minIndex + ...

  9. 《算法C语言实现》————快速-查找算法(quick-find algorithm)

    算法基础是一个整型数组,当且仅当第p个元素和第q个元素相等时,p和q时连通的.初始时,数组中的第i个元素的值为i,0<=i<N,为实现p与q的合并操作,我们遍历数组,把所有名为p的元素值改 ...

随机推荐

  1. tp5操作mongo

    1.通过composer安装 composer require mongodb/mongodb 2.使用 <?php /** * @author: jim * @date: 2017/11/17 ...

  2. composer 的设计原理及其基本用法

    相信有在用PHP的朋友近年来常听到composer这个套件管理工具.它到底是做什么用的?又是为了解决什么问题而存在呢? 要了解这个,得先从历史开始说起…. PHP最早加载类的方法 初学PHP时,最早会 ...

  3. Python——通过斐波那契数列来理解生成器

    一.生成器(generator) 先来看看一个简单的菲波那切数列,出第一个和第二个外,任意一个数都是由前两个数相加得到的.如:0,1,1,2,3,5,8,13...... 输入斐波那契数列前N个数: ...

  4. 科学计算工具Numpy简介

    Numpy(Numerical Python) Numpy:提供了一个在Python中做科学计算的基础库,重在数值计算,主要用于多维数组(矩阵)处理的库.用来存储和处理大型矩阵,比Python自身的嵌 ...

  5. JAVA简单的文件I/O操作实例

    如果只是对文件进行普通的读写,可以不用文件流. 以下是实例: File file = new File("test1.txt"); //向文件写入数据的 PrintWriter p ...

  6. How To Install Git on CentOS 7

    Introduction Version control has become an indispensable tool in modern software development. Versio ...

  7. Delphi.NET

    Delphi.NET Borland.VclDSnap.dll Borland.Vcl.TCustomClientDataSet TFieldType.ftBCD Borland.Vcl.TField ...

  8. 异常:java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path '/app/userInfoMaint/getProvince.do'

    调试代码时出现异常:java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path '/app/user ...

  9. __sync_fetch_and_add系列

    __sync_fetch_and_add系列一共有十二个函数,有加/减/与/或/异或/等函数的原子性操作函数,__sync_fetch_and_add,顾名思义,先fetch,然后自加,返回的是自加以 ...

  10. 算法技巧讲解》关于对于递推形DP的前缀和优化

    这是在2016在长沙集训的第三天,一位学长讲解了“前缀和优化”这一技巧,并且他这一方法用的很6,个人觉得很有学习的必要. 这一技巧能使线性递推形DP的速度有着飞跃性的提升,从O(N2)优化到O(N)也 ...