簡單總結下幾個算法

  

第一個問題,查找出1000萬數據中最大的100萬條。算法

   對這個問題的第一反應就是利用排序算法,排序有不少種。其中以快排用的最多。只需屢次paration獲得前100萬便可。數組

   還有一種思路就是創建一個100萬大小的堆,而後再不斷的對進來的數據進行堆調整。當查找出的數據越小的時候,優點會特別明顯。好比100萬變成100的時候,用堆將是最好選擇。dom

 

第二個問題,對最大數爲1000萬的100萬條數據進行排序,且數據無重複。ide

   這個其實也能夠用堆排序,快速排序進行處理。可是還能夠用位圖的方式進行處理。位圖的時間複雜度是N,快於他們,只不過須要開闢100萬/8個字節而已。spa

   若是把題目改爲,999999(100萬-1)條數據中是由1-100萬組成,且無重複,查找出那個缺失的數據。用位圖的優點將會越加體現。比其餘排序方法好不少。code

 

第三個問題,100萬+1條數據中都是兩兩重複的,只有一條是單着的。blog

   固然,咱們能夠用排序。可是用這些數據所有與&,會快不少。因此位操做有時候很重要。排序

 

第四個問題,查找一本書中是否存在某個單詞。字符串

   這個問題,能夠有不少種查找方式,好比說排序,經過基排序的方式,而後二分查找,這個很好,可是感受效率仍是不是很高。get

  或者用hash對書中全部單詞進行hash,再比較。

  我認爲最好的方式是創建字典樹tire,這個很快很快。

 

第五個問題,隨機產生1--N中M個數。

  若是能夠產生重複的數,那麼很簡單,直接rand(N) m次便可。可是若是不可重複呢?

  1,利用隨機的思想,開一個N大的數組,而後for i=1...M;每次產生一個隨機數k,若是k>i,交換數組中的數,不然不交換,重複M次。

  2,利用機率的思想,第一個數在M個數裏面的機率是m/N,則隨機產生一個數k,(1...N)若是k小於m,則添加到m裏面,同時m=m-1,對第二個數2,進行處理,此時2添加到數組中的機率應該是(m)/N-1....後面同理

  原本不想粘貼代碼,仍是粘一下吧「

 1 public static void getM(int n,int m){//等機率的取出其中m個數
 2         for(int i=0;i<n;i++){  3             Random random=new Random();  4             int k=random.nextInt(10000);  5             
 6             if(m>0&&k%(n-i)<m){  7                 System.out.print(":"+i+" ");  8                 m--;  9                 if (m==0) { 10                     break; 11  } 12  } 13  } 14     }
View Code

 

第六個問題,對於兩個字符串,如何獲得其中相同的子串呢?(不是子序列)子序列可不連續,可是子串必須連續。

   第一反應用動態規劃的思想求解。(暴力法時間複雜度過高)

   第二,能夠經過創建後綴數組的方式求解,後綴數組,排序。比較,獲得答案。複雜度要比動態規劃好。只不過是空間換時間罷了。代碼就不貼了。

 

第七個問題,一堆單詞集合M,一個字符串S。求出S能夠在M中找到多少個單詞。好比M={good,thank, you,are,do},S="goodoayouk".能到找到的單詞是good,do,you.三個。

   能夠暴力法,硬匹配;

   一種比較好的方法應該是利用AC自動機搜索。這個挺好,快!

 第八個問題,求一個字符串中是否包含另一個子串。

    BF暴力法能夠解決,動態規劃也能夠解決。複雜度都是平方級的。

   其實能夠用KMP來解決,他的複雜度下降了,只不過要建一個next數組。用來保存主串的內在聯繫。到時候減小匹配次數。

   貼個代碼吧。沒有check,可能有bug.

 1 int KMP(char S[],char des[],int* next){
 2     int i=0,j=0;
 3     while (i<strlen(S)&&j<strlen(des))
 4     {
 5         if (j==-1||S[i]==des[j])
 6         {
 7             i++;j++;
 8         }else{
 9             j=next[j];
10         }
11     }
12     if (j>=strlen(des))
13     {
14         return i-strlen(des);
15     }
16     else return 0;
17 }
18 void getNext(char S[],int* next){
19     int i=0,j=-1;
20     next[0]=-1;
21     while(i<strlen(S)){
22         if (j==-1||S[i]==S[j])
23         {
24             i++,j++;
25             next[i]=j;
26         }else{
27             j=next[j];
28         }
29     }
30 }
View Code

 

(本文只用做本身總結,故沒有展開來講,相關細節能夠搜索其餘文章,排版也不是個人長項,因此你們將就吧。)

未完待續。。。

 

    版權全部,歡迎轉載,可是轉載請註明出處:瀟一

相關文章
相關標籤/搜索