阿里研发工程师一面二面技术

  1. kmp最基本的考察java

  2. java序列化怎么实现,本身设计一个面试

  3. 系统调度算法,何时会进行进程切换算法

  4. 线程进程的区别数组

  5. 虚函数 和 重载实现函数

  6. acidurl

  7. 单元最短路径算法,考虑dijkstra在产品中的应用.net

  8. 有一个有超大的集合A,里面存储产品ID,做为用户浏览LOG,可能有重复ID。 还有一个产品库集合B,里面也是产品ID 求B-A。 教你如何迅速秒杀掉:99%的海量数据处理面试题 http://blog.csdn.net/v_july_v/article/details/7382693 相似:给定a、b两个文件,各存放50亿个url,每一个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?线程

一、KMP算法一直不太懂,今天搞懂 【快速模式匹配算法KMP】 应用:文本编辑功能的Ctrl+F,“查找”“替换”和“所有替换”,在文本中查找串 (1)模式匹配 给定两个字符串变量S和P,其中S成为目标串,其中包含n个字符,P成为模式串,包含m个字符,其中m<=n。从S的给定位置(一般是S的第一个位置)开始搜索模式串P。若是找到返回模式串P的位置。若是没有找到,则返回-1。这就是模式匹配的定义。 (2)朴素的模式匹配 (3)快速模式匹配算法KMP 朴素的模式匹配效率不高的主要缘由是进行了重复的字符比较,下次比较可利用上次比较的结果,这就产生了快速模式匹配。 对模式串P处理,用next[j]数组保存P中重复的字符状况; <!-- lang: cpp --> //注意返回结果是一个数组next,保存m个k值的地方,即若next[j]=k //则str[0]str[1]...str[k]=str[j-k]str[j-k+1]...str[j] //这样当des[t+j+1]和pat[j+1]匹配失败时,下一个匹配为des[t+j+1]和pat[next[j]+1]设计

int next[20]={} void Next(char str[ ],int len) { next[0]=-1; for(int j=1;j<len;j++) { int i=next[j-1]; while(str[j]!=str[i+1]&&i>=0)//迭代过程 i=next[i];
if(str[j]==str[i+1]) next[j]=i+1; else next[j]=-1; } } //des是目标串,pat是模式串,len1和len2是串的长度 int kmp(char des[],int len1,char pat[],int len2) { Next(str2,len2); int p=0,s=0; while(p < len2 && s < len1) { if(pat[p] == des[s]) { p++;s++; } else { if(p==0) { s++;//若第一个字符就匹配失败,则从des的下一个字符开始 } else { p = next[p-1]+1;//用失败函数肯定pat应回溯到的字符 } } } if(p < len2)//整个过程匹配失败 { return -1; } return s-len2; }
时间复杂度:   对于Next函数近似接近O(m),KMP算法的时间复杂度为O(n),因此整个算法的时间复杂度为O(n+m)blog

空间复杂度:

  多引入了O(m)的空间复杂度。

相关文章
相关标签/搜索