×

kmp算法 算法

KMP算法的原理及其应用?常用的加密算法有哪些

admin admin 发表于2022-06-16 06:05:59 浏览103 评论0

抢沙发发表评论

KMP算法的原理及其应用


KMP算法是通过分析子串,预先计算每个位置发生不匹配的时候,所需GOTO的下一个比较位置,整理出来一个next数组,然后再上面的算法中使用。
  讲解一下:
  当我们分析一个子串时,例如:abcabcddes. 需要分析一下,每个字符x前面最多有多少个连续的字符和字符串从初始位置开始的字符匹配。然后+1就行了(别忘了,我们的字符串都是从索引1开始的)当然,不要相同位置自己匹配,默认第一个字符的匹配数是0。
  定义如下:设字符串为 x1x2x3...xn ,其中x1,x2,x3,... xi,... xn均是字符,设ai为字符xi对应的整数。则a=m,当且仅当满足如下条件:字符串x1x2...xm equals 字符串x(i-m+1)...xi-1 xi 并且x1x2...xm x(m+1) unequals x(i-m) x(i-m+1)...xi-1 xi。
  举例如下:
  abcabcddes
  0111234111
  |----------------------默认是0
  --| | |-----------------不能自己相同字符匹配,所以这里者能认为是没有所以是0+1 =1
  ------| | |-----------前面的字符和开始位置的字符相同,所以是2,3,4
  -----------| | | |-------不匹配只能取1。
  希望能明白的是,如果开始字符是 Ch1的话,那么我们就是要在串中第2个Ch1后面的位置开始自己和自己匹配,计算最大的吻合度。
  程序写出来就是:
  void GetNext(char* T, int *next)
  {
  int k=1,j=0;
  next=0;
  while( k〈 T ){
  if (j ==0 || T[k] == T[j])
  {
  ++k;
  ++j;
  next[k] = j;
  }
  else j= next[j];
  }
  }
  但是这个不是最优的,因为他没有考虑aaaaaaaaaaaaaaaaaaab的情况,这样前面会出现大量的1,这样的算法复杂度已经和最初的朴素算法没有区别了。所以稍微改动一下:
  void GetNextEx(char *T, char *next)
  {
  int i=k,j=0; next = 0;
  while(k 《 T)
  {
  if (j == 0 || T[k] == T[j])
  {
  ++k; ++j;
  if (T[k] == T[j])
  next[k] = next[j];
  else
  next[k] = j;
  }
  else j = next[j];
  }
  }
  现在我们已经可以得到这个next字符串的值了,接下来就是KMP算法的本体了:
  相当简单:
  int KMP(char* S, char* T, int pos)
  {
  int k=pos, j=1;
  while (k){
  if (S[k] == T[j]){ ++k; ++j; }
  else j = next[j]
  }
  if (j》T) return k-T;
  else return 0;
  }
  和朴素算法相比,只是修改一句话而已,但是算法复杂度从O(m*n) 变成了:O(m)

常用的加密算法有哪些


对称加密算法(秘密钥匙加密)和非对称加密算法(公开密钥加密)。

对称加密算法用来对敏感数据等信息进行加密,常用的算法包括:
DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合。
3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高。
AES(Advanced Encryption Standard):高级加密标准,是下一代的加密算法标准,速度快,安全级别高;
AES
常见的非对称加密算法如下:
RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的;
DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准);
ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学。

KMP算法中的next数组如何计算


next[i]表示的是:
在第i个字符前面的i-1个字符里面,
从开头开始的1个字符与最后1个字符是否相等,若不是,则next[i]=0,否则继续看下面;
从开头开始的2个字符与最后2个字符是否相等,若不是,则next[i]=1,否则继续看下面;
从开头开始的3个字符与最后3个字符是否相等,若不是,则next[i]=2,否则继续看下面;
……
就是这样的判断取值。
它的意思就是如果到了某个字符不匹配的情况时候,你就可以直接把模式串拖到从开头开始的那next[i]个字符等于当前字符的前next[i]个字符的地方,这样就少了很多重复的无效的比较和移动。
-kmp算法