基礎
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;
}
遞歸最重要的三點:
- 總有一個最簡單的情況。
- 總是嘗試調用解決一個規模更小的子問題
- 父問題和子問題之間不應該有交集
二分查找的遞歸實現:(數組必須是有序的)
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.