阿里研發工程師一面二面技術

  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)的空間複雜度。

相關文章
相關標籤/搜索