程序=算法(解决问题的步骤)+数据结构(合理的持有数据)
如何衡量算法的优劣?
-
1、计算时间
-
long start=System.currentTimeInMills();
-
处理步骤;
-
long end=System.currentTimeInMills();
-
System.out.println("该算法用时"+(end-start)+"ms");
-
2、时间复杂度
-
是一个用于度量一个算法的运算时间的一个描述,本质是一个函数,根据这个函数能在不用具体的测试数据来测试的情况下,粗略地估计算法的执行效率
-
查找一个算法中执行次数最多的部分和算法规模的相互关系–函数
-
常用大O来表述,这个函数描述了算法执行所要时间的增长速度
-
常量阶 O(1)
-
对数阶 O(logn)
-
线性阶 O(n)
-
线性对数阶 O(nlogn)
-
n方阶 O(nⁿ)
-
指数阶 O(2ⁿ)
-
阶乘阶 O(n!)
public class Test1 {
public static void main(String[] args) {
int[] arr = new int[] { 1, 6, 2, 4, 3, 7, 9, 8 };
for (int i = 1; i < arr.length; i++) { // 7
for (int k = 0; k < arr.length - i; k++) { // 7 6 5 ... (n-1)*n/2
if (arr[k] > arr[k + 1]) {
int tmp = arr[k];
arr[k] = arr[k + 1];
arr[k + 1] = tmp;
}
}
}
System.out.println(Arrays.toString(arr));
// 时间复杂度为 n^2/2-n/2 时间和问题规模n成正相关关系
// 使用大O计法时,只保留最高次幂,去掉所有常量O(n^2)
// 折半查找
int target = 6;
int min = 0;
int max = arr.length - 1;
int pos = (min + max) / 2;
while (min <= max) {
pos=(min + max) / 2;
if (arr[pos] > target) {
max = pos - 1;
} else if (arr[pos] < target) {
min = pos + 1;
} else if (arr[pos] == target)
break;
}
System.out.println("位置为:" + pos);
//2^k=n k以2为底n的对数 时间复杂度为O(logN)
}
}