1. 程式人生 > 其它 >mysql update會自動加鎖嗎_MySQL 這些面試知識點你都會了嗎?

mysql update會自動加鎖嗎_MySQL 這些面試知識點你都會了嗎?

技術標籤:java演算法資料結構資料分析ios

  • 質數只能被1和自己本身整除的數
  • 如:2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97...

方法1:時間複雜度O(n)

  • 最直觀的方法,根據定義,因為質數除了1和本身之外沒有其他約數,所以判斷n是否為質數,根據定義直接判斷從2到n-1是否存在n的約數即可
function  isPrime(num){
      if(num ==2 || num==3)
              return true;
      for (var i = 2;i <= n-1;i++) {
        if(num % i ==0){
          return false;
        }
      }
      return true;
    }

方法2:時間複雜度O(logN)

  • 上述判斷方法,明視訊記憶體在效率極低的問題。對於每個數n,其實並不需要從2判斷到n-1
  • 我們知道,一個數若可以進行因數分解,那麼分解時得到的兩個數,一定是一個小於等於sqrt(n)和一個大於等於sqrt(n)
  • 據此,上述程式碼中並不需要遍歷到n-1,遍歷到sqrt(n)即可,因為若sqrt(n)左側找不到約數,那麼右側也一定找不到約數
    12
    1×12=12
    2×6=12
    3×4=12
    4×3=12
  • 能被2整除的數一定不是素數,所以不用被4、6整除,這樣能減少n/2次執行次數
  • 能被3整除的數一定不是素數,所以不用被6、9整除,這樣能繼續減少執行次數
function  isPrime(num){      
      if(num ==2|| num==3 )
        return true;
      var temp = parseInt(Math.sqrt(num));
      for (var i = 2;i <= temp;i++) {
        if(num % i ==0){
          return false;
        }
      }
      return true;
    }

方法3:時間複雜度

  • 2x,3x,5x肯定不是質數
  • 此時判斷質數可以2個為單元快進,即在迴圈中i++步長加大為2,加快判斷速度
function isPrime(num){
  if(num ==2 || num==3)
        return true;
  if(num % 2 == 0 || num % 3 == 0 || num % 5 == 0)
    return false;				
  var temp = parseInt(Math.sqrt(num));
  for (var i = 7;i <= temp;i=i+2) {
    if(num % i == 0){
      return false;
    }
  }
  return true;
}

方法4:時間複雜度

  • 證明:令x≥1,將大於等於5的自然數表示如下:
  • ······ 6x-1,6x,6x+1,6x+2,6x+3,6x+4,6x+5,6(x+1),6(x+1)+1 ······
  • 可以看到,6的倍數兩側之外的數為6x+2,6x+3,6x+4,由於2(3x+1),3(2x+1),2(3x+2),所以它們一定不是素數,再加上6x本身也不是素數
    • 所以在6的倍數兩側的一定是質數,及:if(num %6!= 1&&num %6!= 5) return false ;
    • 在6的倍數相鄰兩側並不是一定就是質數
  • 此時判斷質數可以6個為單元快進,即在迴圈中i++步長加大為6,加快判斷速度
    • 原因是,假如要判定的數為n,則n必定是6x-1或6x+1的形式,對於迴圈中6i-1,6i,6i+1,6i+2,6i+3,6i+4,其中如果n能被6i,6i+2,6i+4整除,則n至少得是一個偶數,但是6x-1或6x+1的形式明顯是一個奇數,故不成立
    • 另外,如果n能被6i+3整除,則n至少能被3整除,但是6x能被3整除,故6x-1或6x+1(即n)不可能被3整除,故不成立。
    • 綜上,迴圈中只需要考慮6i-1和6i+1的情況,即迴圈的步長可以定為6,每次判斷迴圈變數k和k+2的情況即可,理論上講整體速度應該會是方法(2)的3倍
function isPrime(num){
  //兩個較小數
  if(num == 2 || num == 3 )
      return true ;
  //不在6的倍數兩側的一定不是質數
  if(num%6 != 1 && num%6 != 5){
      return false ;
  }    
  var tmp =Math.sqrt(num);
  //在6的倍數兩側的也可能不是質數
  for(var i = 5;i <= tmp; i+=6 )
      if(num%i == 0 || num%(i+2) == 0)
          return false ;                 
  return true;
}