一 例题:
如何判断一个数字是2的N次方
public class Test01 {public static boolean is2Power(int i) {return (i & (i - 1)) == 0;}public static boolean is2Power2(int i) {if (i == 1) {return true;}while (i > 0) {if (i % 2 == 0 || i % 2 == 1) {i = i % 2;break;}i = i % 2;}return i == 0;}public static void main(String[] args) {int num = 1;int num2 = 3;int num3 = 4;int num4 = 5;System.out.println(is2Power(num));System.out.println(is2Power(num2));System.out.println(is2Power(num3));System.out.println(is2Power(num4));System.out.println("=====================");System.out.println(is2Power2(num));System.out.println(is2Power2(num2));System.out.println(is2Power2(num3));System.out.println(is2Power2(num4));}}
二 时间复杂度
1.常见的时间复杂度
1.常数:
O(1)表示常数,O(1000)>=O(1)
2.对数:
O(logN)
int n = Integer.MAX_VALUE;int i = 1;while (i <= n) {i = i * 2;}
O(n*logN)
int j = n;for (int i1 = 0; i1 < j; i1++) {while (i <= n) {i = i * 2;}}
3.线性
O(n)
i是未知的,如果是已知的话,复杂度就是O(1)
int c = 1;for(int k=0;k<i;k++){c = c +1;}
4.平方
O(n*2)
int j = 20;int a = 10;for (int i = 1; i < j; j++) {for (int k = 1; k < i; k++) {a += a;}}
5.N次方
O(n*n)
int j = 20;int a = 10;for (int i = 1; i < j; j++) {for (int k = 1; k < i; k++) {for(int m = k;m<i;m++){a += a;}}}

O(1)>O(logN)>O(N)>O(nlogN)>O(N2)>O(NX)
备注:
1.需要代码中执行次数中最大的一段代码,忽略次数较少的代码。
2.工程代码中寻找有循环的代码,有网络请求的代码,有数据库请求的代码,利用日志,计算耗时时间。
重点看:
链表,排序算法,二叉树,红黑树 B树 B+树
树论+图论
