1科学方法
- 观察,测量
- 提出假设模型
- 预测未来事件
- 反馈矫正假设模型
1.1计算运行时间的计时器
实现:
/**
* 计时器
* @Author: AZhu
* @Date: 2021/2/6 20:42
*/
public class Stopwatch {
private final long start;//开始时间
public Stopwatch() {
start = System.currentTimeMillis();
}
/**
* 返回对象创建以来所经过的时间
* @return
*/
public double elapsedTime() {
long now = System.currentTimeMillis();
return (now - start) / 1000.0;
}
}
用例:
public static void main(String[] args) {
//创建一个计时器
Stopwatch stopwatch = new Stopwatch();
//核心代码
、、、、、、
//获取时间间隔
double time = stopwatch.elapsedTime();
System.out.println("经过了:" + time + " 秒。");
}
2增长数量级
- 常数级别
- 对数级别
- 线性级别
- 线性对数级别
- 平方级别
- 立方级别
- 指数级别
3设计更快的算法
3.1二分查找
/**
* 实现二分查找的一个类
* @Author: AZhu
* @Date: 2021/2/6 21:01
*/
public class BinarySearch {
/**
* 在一个升序数组中查找给定的数
* @param key 目标数
* @param a 目标数组
* @return 数组索引
*/
public static int rank(int key, int[] a) {
int lo = 0;
int hi = a.length - 1;
while (lo < hi) {
//被查找的数要么不存在,要么存在lo和hi之中
int mid = lo + (hi - lo) / 2;
if (key < a[mid]) {
hi = mid - 1;
} else {
if (key > a[mid]) {
lo = mid + 1;
} else {
return mid;
}
}
}
return -1;
}
}
3.2、2-sum问题
/**
* 快速在一个无序数组中查找“两数和为0”的数对的数目(不重复)
* @Author: AZhu
* @Date: 2021/2/6 20:54
*/
public class TowSumFast {
/**
* 计算和为0的整数对的数目
* @param a 目标数组
* @return 整数对的数目
*/
public static int count(int[] a) {
//归并排序
Arrays.sort(a);
int N = a.length;
int cnt = 0;
for (int i = 0; i < N; i++) {
//查找-a[i]的位置
if (BinarySearch.rank(-a[i], a) > i) {
cnt++;
}
}
return cnt;
}
}
3.3、3-sum问题
/**
* 快速在一个无序数组中查找“三数和为0”的三元组的数目(不重复)
* @Author: AZhu
* @Date: 2021/2/6 21:14
*/
public class ThreeSumFast {
/**
* 计算和为0的三元组的数目
* @param a 目标数组
* @return 三元组的数目
*/
public static int count(int[] a) {
//归并排序
Arrays.sort(a);
int N = a.length;
int cnt = 0;
for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
if (BinarySearch.rank(-a[i] - a[j], a) > j) {
cnt++;
}
}
}
return cnt;
}
}
4倍率实验
- 计算每次实验和上一次实验的运行时间的比值
- 反复运行直到该比值趋近于极限 2^b
两个注意:
- 评估程序解决大型问题的可行性
- 评估使用更快的计算机做产生的价值
5注意事项
- 大常数
- 非决定性的内循环
- 指令时间
- 系统因素
- 不分伯仲
- 对输入的强烈依赖
- 多个问题参量
6处理对于数据输入的依赖
- 输入模型
- 对最坏的情况下的性能的保证
- 随机化算法
- 操作序列
- 均摊分析
7注意内存
- 对象
- 链表
- 数组
- 字符串对象