您的位置:首页 > 其它

算法初级01——认识时间复杂度、对数器、 master公式计算时间复杂度、小和问题和逆序对问题

2018-11-06 15:45 851 查看

虽然以前学过,再次回顾还是有别样的收获~

 

认识时间复杂度

  • 常数时间的操作:一个操作如果和数据量没有关系,每次都是固定时间内完成的操作,叫做常数操作。
  • 时间复杂度为一个算法流程中,常数操作数量的指标。常用O(读作big O)来表示。具体来说,在常数操作数量的表达式中,只要高阶项,不要低阶项,也不要高阶项的系数,剩下的部分如果记为f(N),那么时间复杂度为O(f(N))。
  • 评价一个算法流程的好坏,先看时间复杂度的指标,然后再分析不同数据样本下的实际运行时间,也就是常数项时间。

 

 

例子一

一个简单的理解时间复杂度的例子

 

一个有序数组A,另一个无序数组B,请打印B中的所有不在A中的数,A数组长度为N,B数组长度为M。

 算法流程1:对于数组B中的每一个数,都在A中通过遍历的方式找一下;

 算法流程2:对于数组B中的每一个数,都在A中通过二分的方式找一下;

 算法流程3:先把数组B排序,然后用类似外排的方式打印所有在A中出现的数;

 三个流程,三种时间复杂度的表达...

 如何分析好坏?

 

 

例子二

 对数器的概念和使用

 0,有一个你想要测的方法a,

 1,实现一个绝对正确但是复杂度不好的方法b,

 2,实现一个随机样本产生器

 3,实现比对的方法

 4,把方法a和方法b比对很多次来验证方法a是否正确。

 5,如果有一个样本使得比对出错,打印样本分析是哪个方法出错

 6,当样本数量很多时比对测试依然正确,可以确定方法a已经正确。

1     public static int smallSum(int[] arr) {
2         if (arr == null || arr.length < 2) {
3             return 0;
4         }
5         return mergeSort(arr, 0, arr.length - 1);
6     }
7
8     public static int mergeSort(int[] arr, int l, int r) {
9         if (l == r) {
10             return 0;
11         }
12         int mid = l + ((r - l) >> 1);
13         return mergeSort(arr, l, mid) + mergeSort(arr, mid + 1, r) + merge(arr, l, mid, r);
14     }
15
16     public static int merge(int[] arr, int l, int m, int r) {
17         int[] help = new int[r - l + 1];
18         int i = 0;
19         int p1 = l;
20         int p2 = m + 1;
21         int res = 0;
22         while (p1 <= m && p2 <= r) {
23             res += arr[p1] < arr[p2] ? (r - p2 + 1) * arr[p1] : 0;
24             help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
25         }
26         while (p1 <= m) {
27             help[i++] = arr[p1++];
28         }
29         while (p2 <= r) {
30             help[i++] = arr[p2++];
31         }
32         for (i = 0; i < help.length; i++) {
33             arr[l + i] = help[i];
34         }
35         return res;
36     }
答案

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: