零、概念
0.1、掌握
顺序查找
二分查找
// 输出:有符合条件的值,则返回其索引,若不合法输入或没有返回-1
int BinSearch(int data[],int length,int value)
{
if(data == NULL || length<0)
return -1;
int middle = 0,start = 0,end=length-1;
while(start < end)
{
middle = (start+end)/2;
if(data[middle] == value)
return middle;
else if(data[middle] > value)
end = middle-1;
else
start = middle+1;
}
return -1;
}哈希
二叉排序树
0.2、应用
字符串普通查找
KMP算法
一、
二、字符串查找
2.1、普通字符串查找算法
int FindStr(const char *str, const char* des, int index)
{
if(str==NULL || des==NULL || index<0)
return -1;
for(int i=index; str[i]!='\0'; i++)
{
int j=0;
for(; des[j]!='\0' && str[i+j] == des[j];j++);
if(des[j] == '\0')
return i;
}
return -1;
}int FindStr2(const char*str, const char*des, int index)
{
if(str==NULL || des==NULL || index<0)
return -1;
int slen = strlen(str);
int dlen = strlen(des);
for(int i = index; i<slen; i++)
{
int j=0;
for(; j<dlen && des[j] == str[i+j]; j++);
if(j == dlen)
return i;
}
return -1;
}int FindStr3(const char* str,const char* des,int index)
{
if(des == NULL || des == NULL || index<0)
return -1;
int i=index,j=0;
int slen = strlen(str);
int dlen = strlen(des);
while(i<slen && j<dlen)
{
if(str[i+j]==des[j])
++j;
else
{
++i;
j=0;
}
}
if(j>=dlen)
return i;
return -1;
}注:时间复杂的是O(M*N),空间复杂度为O(1)。
2.2、KMP算法
1、KMP的时间复杂度为O(n + m),空间复杂度为O(m)。
2、next数组:
A、求法
(1) next[0] = -1
意义:任何串的第一个字符的模式值规定为-1。
(2) next[j] = -1
意义:模式串T中的下标为j的字符,如果与首字符相同,且j的前面的1-k个字符与开头的1-k个字符不等(或者相等但T[k]==T[j],1<=k
(3) next = k
意义:模式串T中下标为j的字符,如果j的前面k个字符与开头的k个字符相等,且T[j] !=T[k],1<=k
(4) next[j] = 0
意义:除(1)、(2)、(3)的其他情况。
B、举例

next[0] = -1 根据(1)
next[1] = 0 根据(4)
next[2] = -1 根据(2)
next[3] = 0 根据(3)虽T[0]=T[2] 但T[1]=T[3]被划入了(4)
next[4] = 2 根据(3)T[0]T[1]=T[2]T[3] 且T[2]!=T[4]
next[5] = -1 根据(2)
next[6] = 1 根据(3)T[0]=T[5] 且T[1]!=T[6]
next[7] = 0 根据(3)虽T[0]=T[6] 但T[1]=T[7]被划入(4)
next[8] = 2 根据(3)T[0]T[1]=T[6]T[7] 且T[2]!=T[8]
C、实现
void get_nextval(char const *des, int *nextval)
{
if(des == NULL || nextval == NULL)
return;
int i = 0,j = -1;
int plen = strlen(des);
nextval[0] = -1;
while(i < plen)
{
if(j == -1 || des[i] == des[j])
{
++i;
++j;
if(des[i] != des[j])
nextval[i] = j;
else
nextval[i] = nextval[j];
}
else
j = nextval[j];
}
}3、查找实现
int FindStr4(const char*str, const char*des, int index)
{
if(str==NULL || des==NULL || index<0)
return -1;
int slen = strlen(str);
int dlen = strlen(des);
int *next = (int*) malloc(dlen*sizeof(int));
get_nextval(des,next);
int i=index,j=0;
while(i<slen && j<dlen)
{
if(j==-1 || str[i] == des[j])
{
++i;
++j;
}
else
j = next[j];
//当匹配失效时,直接用des[j_next]与s[i]比较
}
free(next);
if(j>=dlen)
return i- dlen;
return -1;
}
转载标明出处:https://blog.evanxia.com/2015/12/344