一 例题:

如何判断一个数字是2的N次方

  1. public class Test01 {
  2. public static boolean is2Power(int i) {
  3. return (i & (i - 1)) == 0;
  4. }
  5. public static boolean is2Power2(int i) {
  6. if (i == 1) {
  7. return true;
  8. }
  9. while (i > 0) {
  10. if (i % 2 == 0 || i % 2 == 1) {
  11. i = i % 2;
  12. break;
  13. }
  14. i = i % 2;
  15. }
  16. return i == 0;
  17. }
  18. public static void main(String[] args) {
  19. int num = 1;
  20. int num2 = 3;
  21. int num3 = 4;
  22. int num4 = 5;
  23. System.out.println(is2Power(num));
  24. System.out.println(is2Power(num2));
  25. System.out.println(is2Power(num3));
  26. System.out.println(is2Power(num4));
  27. System.out.println("=====================");
  28. System.out.println(is2Power2(num));
  29. System.out.println(is2Power2(num2));
  30. System.out.println(is2Power2(num3));
  31. System.out.println(is2Power2(num4));
  32. }
  33. }

二 时间复杂度

1.常见的时间复杂度

1.常数:

O(1)表示常数,O(1000)>=O(1)

2.对数:

O(logN)

  1. int n = Integer.MAX_VALUE;
  2. int i = 1;
  3. while (i <= n) {
  4. i = i * 2;
  5. }

O(n*logN)

  1. int j = n;
  2. for (int i1 = 0; i1 < j; i1++) {
  3. while (i <= n) {
  4. i = i * 2;
  5. }
  6. }

3.线性

O(n)
i是未知的,如果是已知的话,复杂度就是O(1)

  1. int c = 1;
  2. for(int k=0;k<i;k++){
  3. c = c +1;
  4. }

4.平方

O(n*2)

  1. int j = 20;
  2. int a = 10;
  3. for (int i = 1; i < j; j++) {
  4. for (int k = 1; k < i; k++) {
  5. a += a;
  6. }
  7. }

5.N次方

O(n*n)

  1. int j = 20;
  2. int a = 10;
  3. for (int i = 1; i < j; j++) {
  4. for (int k = 1; k < i; k++) {
  5. for(int m = k;m<i;m++){
  6. a += a;
  7. }
  8. }
  9. }

image.png

O(1)>O(logN)>O(N)>O(nlogN)>O(N2)>O(NX)

备注:

1.需要代码中执行次数中最大的一段代码,忽略次数较少的代码。

2.工程代码中寻找有循环的代码,有网络请求的代码,有数据库请求的代码,利用日志,计算耗时时间。

重点看:
链表,排序算法,二叉树,红黑树 B树 B+树

树论+图论