算法初级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 }答案
相关文章推荐
- 求逆序对数的一种时间复杂度为nlgn的算法
- 算法初级笔记(一)认识时间复杂度
- 如何计算一个算法的时间复杂度和空间复杂度
- 夏至日计算公式及“三伏”的日期算法问题
- 算法-计算时间复杂度
- O(n*lgn)时间复杂度的逆序对统计算法实现思想
- 如何计算算法的时间复杂度
- 算法时间复杂度的计算
- 计算一个算法的时间复杂度
- 算法的度量-----时间复杂度问题的计算
- 如何计算一个算法的时间复杂度
- 【算法】算法的时间复杂度计算
- 算法的复杂度包括时间复杂度和空间复杂度分别如何计算?
- 计算算法时间复杂度的主方法的一种较为简洁的记忆方法
- 算法时间复杂度的计算 [整理]
- 简单算法学习之时间复杂度的计算
- 算法的时间复杂度(计算实例)
- 查找与排序01,线性查找,时间复杂度,算法
- 关于大整数的乘法的算法时间复杂度的计算过程推导(纯属个人推测,请高人指正)
- 算法的时间复杂度(计算实例)