时间复杂度
来源:互联网 发布:淘宝下架的宝贝在哪里找 编辑:程序博客网 时间:2024/06/14 07:44
什么是大O (Big O)
n表示数据规模
O(f(n))表示运算算法所需要执行的指令数
时间复杂度为常量级O(1)
void swapTwoInts(int &a, int&b){int temp=a;a=b;b=temp;}
时间复杂度为O(n)
int sum(int n){int ret=0;for(int i=0;i<=n;i++)ret+=i;return ret;}
时间复杂度为O(n^2)
选择排序
void selectionSort(int arr[],int n){ for(int i=0;i<n;i++){ int minIndex=i; for(int j=i+1;j<n;j++) if(arr[j]<arr[minIndex]) minindex=j; swap(arr[i],arr[minIndex]); }}}
一共要比较(n-1)+(n-2)+(n-3)+…+0
=(0+n-1)*n/2
=1/2*n^2 -1/2*n
=O(n^2)
时间复杂度为O(logn)
二分查找法
int binarySearch(int arr[], int n, int target){ int l = 0, r = n-1; while( l <= r ){ int mid = l + (r-l)/2; if( arr[mid] == target ) return mid; if( arr[mid] > target ) r = mid - 1; else l = mid + 1; } return -1;}
算法规律:
在n个元素中查找
在n/2个元素中查找
在n/4个元素中查找
….
在1个元素中查找
实际上是说:n经过几次[除以2]的操作后,等于1?
经过log2(n)次。
归并排序O(NlogN)
核心思想:分治。
流程:先将一个序列分成很多个不能再分割的子序列,将各个子序列分别排序后再将子序列合并。
举例:5,2,6,7,9,1,3,8
分割:「5,2,6,7」「9,1,3,8」
分割第二次:「5,2」「6,7」「9,1」「3,8」
分割第三次:「5」「2」「6」「7」「9」「1」「3」「8」
合并:「2,5」「6,7」「1,9」「3,8」
合并第二次:「2,5,6,7」「1,3,8,9」
合并第三次:「1,2,3,5,6,7,8,9」
算法思路:
采用递归的方式
void mergesort(int a[], int first, int last, int temp[]) { if (first < last) { int mid = (first + last) / 2; mergesort(a, first, mid, temp); //左边排序 mergesort(a, mid + 1, last, temp); //右边排序 mergearray(a, first, mid, last, temp); //再将二个有序数列合并 } }
对序列进行排序
void mergearray(int a[], int first, int mid, int last, int temp[]) { int i = first, j = mid + 1; int m = mid, n = last; int k = 0; while (i <= m && j <= n) { if (a[i] <= a[j]) temp[k++] = a[i++]; else temp[k++] = a[j++]; } while (i <= m) //如果左边的序列还有剩余,全部加入temp数组 temp[k++] = a[i++]; while (j <= n) //如果右边的序列还有剩余,全部加入temp数组 temp[k++] = a[j++];
整棵二叉树的深度为logN
每一层的排序是O(N)数量级的,
所以时间复杂度为O(NlogN)
阅读全文
0 0
- 时间复杂度,空间复杂度
- 时间复杂度&空间复杂度
- 时间复杂度 & 空间复杂度
- 时间复杂度、空间复杂度
- 时间复杂度 空间复杂度
- 时间复杂度&空间复杂度
- 时间复杂度/空间复杂度
- 时间复杂度+空间复杂度
- 时间复杂度
- 时间复杂度
- 时间复杂度
- 时间复杂度
- 时间复杂度
- 时间复杂度
- 时间复杂度
- 时间复杂度
- 时间复杂度
- 时间复杂度
- java实现单链表
- c++操作符重载与友元函数 单目 双目 左移右移 ==号操作符重载 自定义数组
- virtualbox
- android studio clean project失败时的处理方法
- 在Intellij IDEA上使用Maven构建Spark应用(Scala)
- 时间复杂度
- (回溯法)LeetCode#90. Subsets II
- mybatis入门使用1:mybatis框架搭建和增删改查
- view对象的渲染步骤
- Spring Boot的启动器
- Android的第一次课_上课代码_上课实例_TextView控件_LinearLayout_gravity属性
- 解决jquery选择器id中带点的获取不到
- 设计模式—责任链模式(二十)
- 前端网站资源精编!!