《算法》第4版 讀書筆記 01

基礎

java編程模型、數據抽象、基本數據結構、集合類的抽象數據類型、算法性能分析的方法

解決大型問題或大量小型問題,有效利用時間和空間。

歐幾里得算法的java語言描述(求p和q的最大公約數):

public static int gcd(int p,int q){
  if(q == 0) return p;
  int r = p % q;
  return gcd(q,r);
}

基礎編程模型

java基本結構:原始數據類型、語句(聲明、賦值、條件、循環、調用和返回)、數組、靜態方法、字符串、標準輸入\輸出、數據抽象。

數組實現方陣相乘 a[][] *b[][] = c[][]:

int N = a.length;
double[] [] c = new double[N][N];
for(int i = 0;i < N;i++)
  for(int j = 0;j <N;j++)
    for(int k = 0;k<N;k++)
        c[i][j] += a[i][k] * b[k][j]
}

將一個數組變量賦予另一個變量,那ing個變量會指向同一個數組,想要復制數組要聲明、創建并初始化一個新的數組,然后將元素挨個賦值:

int[] a = new int[N];
a[i] = 1234;
int[] b= a;
b[i] = 5678;   //a[i]的值也為5678

素數判斷:

public static boolean isPrime(int N){
    if(N < 2) return false;
    for(int i = 2; i*i <=N;i++){
        if(N % i == 0) return false;
    }
    return ture;
}

計算平方根(牛頓迭代法)

public  static double sqrt(double c){
  if (c<0) return Double.NaN;
  double err = 1e-15;
  double t = c;
  while(Math.abs(t - c/t) > err * t)
    t = (c/t + t) / 2.0;
   return t;
} 

遞歸最重要的三點:

  1. 總有一個最簡單的情況。
  2. 總是嘗試調用解決一個規模更小的子問題
  3. 父問題和子問題之間不應該有交集
二分查找的遞歸實現:(數組必須是有序的)
public static int rank(int key ,int[] a){
    return rank(key,a,0,a.length-1);
}
public static int rank(int key, int[] a,int low,int high){
    if(low > high)  return -1;
    int mid = low + (high - low) / 2;
    if(key < a[mid]) return rank(key,a,low,mid-1)
    else if(key > a[mid]) return rank(key,a,mid+1,high)
    else return mid; 
}
一般實現:
public static int rank(int key, int[] a){
    int low = 0;
    int high = a.length - 1;
    while( low < high){
    int mid = low + (high - low) / 2;
    if(key < a[mid]) high = mid - 1;
    else if(key > a[mid]) low = mid + 1;
    else return mid;
   }
    return -1;
}

API的目的是將調用和實現分離

Math.abs(-2147483648)   //整數溢出結果為 -2147483648
double初始化為無窮大數 :Double.POSITIVE_INFINITY和Double.NEGATIVR_INFINITY.
1/0除零異常 ,1.0/0.0 值為 Infinity.
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容