算法 概述
2019, Apr 29
算法-概述
1.算法思想
- 穷举法
- 递推法:有明显公式规律
- 递归法
- 分治法:把大问题划分成小问题
- 概率法:将问题转化为面积问题,然后随机撒点
2.常见算法
-
查找算法
-
顺序查找
-
折半查找
int binarySearch(int R[], int low, int high, int k){ int mid = 0; while(low <= high){ mid = (low + high)/2; if (R[mid] == k) return mid; else if (R[mid] > k) high = mid-1; // k位于mid位置的左边,high调整 else low = mid+1; // k位于mid位置的右边,low调整 } return 0; }
-
3.基本数学问题
3.1. 求最大公约数
-
辗转相除法
public int greatestCommonDivisor(int a, int b) { int m, n, r; if (a > b) { m = a; n = b; } else { m = b; n = a; } // 辗转相除 r = m % n; while (r != 0) { m = n; n = r; r = m % n; } return n; // 最大公约数 }
3.2. 求最小公倍数
public int leastCommonMultiple(int a, int b) {
return (a * b) / greatestCommonDivisor(a, b);
}
3.3. 判断素数
素数:大于1,且只能被1和自身整除的数
合数:大于1的非素数
0和1既不是素数也不是合数
-
根据定义判断
public boolean isPrime(int num) { for (int i = 0; i < num; ++i) { if (num % i == 0) { return false; } } return true; }
-
判断从2到sqrt(n)是否存在其约数,时间复杂度O(sqrt(n))
public boolean isPrime(int num) { for (int i = 2; i <= Math.sqrt(num); ++i) { if (num % i == 0) { return false; } } return true; }
扩展:
方式1:判断2之后,就可以判断从3到sqrt(n)之间的奇数了,无需再判断之间的偶数,时间复杂度O(sqrt(n)/2)
方式2:大于等于5的质数一定和6的倍数相邻 ,时间复杂度O(sqrt(n)/3)