时间复杂度

算法复杂度

梦想的初衷 提交于 2019-11-27 03:16:30
评估算法时间复杂度的具体步骤是: (1)找出算法中重复执行次数最多的语句的频度来估算算法的时间复杂度; (2)保留算法的最高次幂,忽略所有低次幂和高次幂的系数; (3)将算法执行次数的数量级放入大Ο记号中 在程序段(a)中,语句x=x+1不在任何一个循环体内,则它的时间频度为1,其执行时间是个常量;而(b)中,同一语句被重复执行n次,其时间频度为n;显然在(c)中,该语句的频度为n^2。由此,这三个程序段的时间复杂度为O(1)、O(n)、O(n^2)。分别为常量、线性阶和平方阶。 对于较为复杂的算法,可以将它们分割成容易估算的几个部分,然后利用O的求和原则得到整个算法的时间复杂度。例如,若算法的两个部分的时间复杂度分别为T1(n)=O(f(n))和T2(n)=O(g(n)),则总的时间复杂度为: T(n)= T1(n)+ T2(n)=O(max(f(n), g(n))) 然而,很多算法的运行时间不仅依赖于问题的规模,也与处理的数据集有关。例如,有的排序算法对某些原始数据(如自小至大有序),则其时间复杂度为O(n),而对另一些数据可达O(n^2)。因此,在估算算法的时间复杂度时,均以数据集中最坏的情况来估算。 文章小结 评估算法时间复杂度的要点是:如果一个算法的执行次数是 T(n),那么只保留最高次项,同时忽略最高项的系数后得到函数 f(n),此时算法的时间复杂度就是 O(f(n))

复习之 笔试题知识点总结

依然范特西╮ 提交于 2019-11-27 02:55:30
1. 各种排序算法的优缺点 例题:对序列(12,18,22,38,39,49,79,89)进行排序,最不适合的算法是() 冒泡排序 快速排序 归并排序 插入排序 总结: 冒泡排序:优点:稳定; 缺点:慢,每次只能移动相邻两个数据。时间复杂度:O(n 2 ) 选择排序:优点:移动数据的次数已知(n-1次);缺点:不稳定。时间复杂度:O(n 2 ) 插入排序:优点:稳定,快;缺点:比较次数不一定,比较次数越少,插入点后的数据移动越多。时间复杂度:O(n 2 ) 缩小增量排序/希尔排序:优点:快,数据移动少; 缺点:不稳定,d的取值是多少,应取多少个不同的值,都无法确切知道,只能凭经验来取。时间复杂度:O(nlogn) 快速排序:优点:快,数据移动少; 缺点:不稳定。时间复杂度:O(nlogn) 平均时间, O(n2) 最坏情况; 对于大的、乱序串列一般认为是最快的已知排序算法。 箱排序/桶排序:优点:快;缺点:数据范围必须为正整数并且比较小。时间复杂度:O(n); 需要 O(k) 额外存储空间 堆排序:优点:对于较大的序列,将表现出优越的性能。缺点:小规模的序列中不合适。时间复杂度:O(nlogn) 归并排序 (merge sort)— O(n log n); 需要 O(n) 额外存储空间 https://www.cnblogs.com/zhaoshuai1215/p/3448154

常用排序算法

血红的双手。 提交于 2019-11-27 02:54:45
笔者最近学习算法,学了很久也只弄懂了几个排序算法,在这里晒一下下,作为以后参考之用。 一、 为什么要研究排序问题 许多计算机科学家认为,排序算法是算法学习中最基本的问题,原因有以下几点: l 有时候应用程序本身需要对信息进行排序,如为了准备客户账目,银行需要对支票账号进行排序 l 很多算法将排序作为关键子程序 l 现在已经有很多排序算法,它们采用各种技术 l 排序时一个可以证明其非平凡下界的问题,并可以利用排序问题的下界证明其他问题的下界 l 在实现排序算法是很多工程问题即浮出水面 二、 排序问题的形式化定义 输入:由 n 个数组成的一个序列 <a 1 ,a 2 , …… ,a n > 输出:对输入序列的一个排列(重排) <a 1 ’,a 2 ’, …… ,a n ’>, 使得 a 1 ’ ≤ a 2 ’ ≤……≤ a n ’ 【说明】在实际中,待排序的数很少是孤立的值,它们通常是成为激励的数据集的一个部分,每个记录有一个关键字 key, 是待排序的值,其他数据位卫星数据,它们通常以 key 为中心传递。 三、 相关概念 1. 排序的稳定性: 在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的;若具有相同关键字的记录之间的相对次序发生变化,则称这种排序方法是不稳定的。 A. 稳定排序: 插入排序 、冒泡排序

Python常用算法

梦想与她 提交于 2019-11-27 02:54:21
本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。 一个算法应该具有以下七个重要的特征: ①有穷性(Finiteness):算法的有穷性是指算法必须能在执行有限个步骤之后终止; ②确切性(Definiteness):算法的每一步骤必须有确切的定义; ③输入项(Input):一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输 入是指算法本身定出了初始条件; ④输出项(Output):一个算法有一个或多个输出,以反映对输入数据加工后的结果。没 有输出的算法是毫无意义的; ⑤可行性(Effectiveness):算法中执行的任何计算步骤都是可以被分解为基本的可执行 的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性); ⑥高效性(High efficiency):执行速度快,占用资源少; ⑦健壮性(Robustness):对数据响应正确。 2. 时间复杂度 计算机科学中

数据结构与算法—绪论

不想你离开。 提交于 2019-11-27 02:49:25
前言 重要性 数据结构与算法是程序员内功体现的重要标准之一,而数据结构的也应用在各个方面,更有 程序=数据结构+算法 这个等式存在。各个 中间件开发者 , 架构师 。他们都在努力的优化中间件、项目结构以及算法提高 运行效率 降低 内存占用 。并且数据结构中也是蕴含模型以及面向对象的思想,掌握数据结构对逻辑思维处理抽象能力有很大提升。。 数据结构 概念 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。 个人理解 简言之,数据结构是一系列的存储结构按照一定 执行规则 、配合 一定执行算法 所形成的高效的存储结构。在我们所熟知的关系数据库、非关系数据库、搜索引擎存储、消息队列等都是比较牛的大型数据结构良好的运用。这些数据结构应用不仅仅考虑到内存范围结构设计。还考虑实际os、网络等 其他因素 。 而对于数据结构与算法这个专栏。我们程序员更改掌握的首先是在 内存 中运行的 抽象的数据结构 。是一个相对比较单一的数据结构类型,比如 线性结构 、 树 、 图 等等. 相关术语 用户信息表users id name sex 001 bigsai man 002 smallsai man 003 菜虚鲲 woman users的pojo对象 class users { //略 int id

最好、最坏、平均、均摊时间复杂度分析

[亡魂溺海] 提交于 2019-11-27 02:25:16
前一篇文章 算法复杂度分析 讲述了复杂度的大 O 表示法和几个分析原则,这篇文章我们来讲讲另外几种复杂度,最好情况时间复杂度(best case time complexity)、最坏情况时间复杂度(worst case time complexity)、平均时间复杂度(average case time complexity)和均摊时间复杂度(amortized time complexity)。 一、最好、最坏情况时间复杂度 顾名思义,这两种时间复杂度指的是特殊情况下的时间复杂度。我们看下面的例子: // n 表示数组 array 的长度 int find(int[] array, int n, int x) { int i = 0; int pos = -1; for (; i < n; ++i) { if (array[i] == x) { pos = i; break; } } return pos; } 这段代码实现的功能是,在数组 array 中寻找变量 x 第一次出现的位置,若没有找到,则返回 -1;否则返回位置下标。 用上一篇文章的方法显然是无法分析这段代码的复杂度的。因为,不同情况下的时间复杂度是不同的。当数组中第一个元素就是要找的 x 时,时间复杂度是 O(1);而当最后一个元素才是 x 时,时间复杂度则是 O(n)。 为了表示代码在不同情况下的时间复杂度

【算法之常见的时间复杂度】 -- 2019-08-11 18:41:17

自闭症网瘾萝莉.ら 提交于 2019-11-27 00:04:18
原文: http://106.13.73.98/__/116/ 补充 空间复杂度:用来评估算法占用内存大小的式子。 什么是算法? 算法(Algorithm):一个计算过程,解决文件的方法 时间复杂度 先总结 时间复杂度是用来评估算法运行时间的一个式子(单位)。 一般来说,时间复杂度高的算法比复杂度低的算法慢。 长安的时间复杂度(按效率排序): O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n2logn) < O(n3) 不常见的时间复杂度: O(n!) O(2n) O(nn) 对应的复杂度 下面这张图和上面这张一样,其复杂度不变。 不管for循环内执行多少代码,有x层for循环,复杂度就是O(nx)。 原文: http://106.13.73.98/__/116/ 来源: https://www.cnblogs.com/gqy02/p/11336040.html

计数思想(类似于hash值)

穿精又带淫゛_ 提交于 2019-11-26 23:14:40
//判断数组中是否有重复元素,最直接的思路是用双层循环判断(O(n ^ 2)); //也可以先排序,后比较,但基于比较的排序时间复杂度至少为O(n*logn). //所以,这些思路都不行。根据题目的限制条件,很容易想到用计数排序,时间复杂度为O(n),这当然满足题意,但是,把计数排序用在此处,无疑是大材小用了。 //在计数排序中,有一个关键的步骤是计数,本题就可以利用计数排序中的 计数思想( 有点类似于哈希),程序代码如下: #include<iostream> using namespace std; void print(bool b) { if (b) cout << "yes" << endl; else cout << "no" << endl; } typedef struct Hashtable { int value; int count; }hash; bool hasTheSameNumber(int a[], int n) { int *p = new int[n]; //int *p=new hash[n]; int i; for (i = 0; i < n; i++) //置0 { p[i] = 0; } for (i = 0; i < n; i++) //开始计数 { p[a[i] - 1]++; //p[i].value=a[i]%n; //p[i]

【算法】简单动态规划——三逆数的O(N^2)解法!

泄露秘密 提交于 2019-11-26 20:28:20
问题描述: 三逆数定义:给一个数的序列A[0,1,....N-1]),当i<j<k且A[i]>A[j]>A[k]时,称作ai,aj,ak为一个三逆数。 现在给定一个长度为N的数组,求此数组序列中存在三逆数的总个数。 本人暂时只想到O(N^2)时间复杂度的解法。不知道还没有没更好更快的解法。(谁有更好的解法,欢迎分享~) O(N^3)解法: 这个最直观了,直接三层循环进行统计,即可求和三逆数总和。代码太简单了,就略过了~ O(N^2)解法: 1.进行预处理,先用R[1..N]数组记录,R[i]表示在第i个元素后面比第i个元素小的个数之和,此步为基本的动态规划,时间复杂度为O(N^2)。 for ( int i = 0 ; i< N; ++i) R[i] = 0 ; for ( int i = N- 2 ; i>= 0 ; i-- ) {    for ( int j = i+ 1 ; j <N; ++ j)   {      if (A[i] > A[j]) { R[i] = max(R[i], R[j]+ 1 ); }    } } 2.二层循环枚举每两个元素,并进行累加求总和。 1 for ( int i = 0 ; i< N; ++ i) 2 { 3 for ( int j = i+ 1 ; j< N; ++j ) 4 { 5      ans += (A[j] < A[i])

ccf 201903-5 317号子任务(60分)

匆匆过客 提交于 2019-11-26 19:52:29
看到这题,第一印象,用dijkstra算法求n次单源最短路,时间复杂度O(n^3),超时30分妥妥的。 于是用优先队列优化,O(n*mlogm),快很多,但依然30。 那么不妨换一种思路,题目要求的是任一据点到最近k个行星发动机据点的最短路之和,也就是说我们不必求出所有的最短路,而只需要求出各行星发动机据点到其它据点的最短路。 若行星发动机据点个数为t,则只需求t次最短路,这样一来,时间复杂度变为O(t*mlogm)。 又见子任务:对于60%的数据 保证行星发动机数量和k相同。 于是,有60分的数据时间复杂度可降到O(k*mlogm),大约10^7,这60分算是稳了! 我是用邻接表存储图。然后把每次求出的最短路push进n个优先队列,Dijkstra结束后对n个据点从小到大出栈、求和并输出。 60分代码如下: 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<vector> 6 #include<queue> 7 using namespace std; 8 typedef long long ll; 9 const int inf=0x3f3f3f3f; 10 struct E 11 { 12 int u,v,w; 13 }edge[10000]