数据结构和算法(01)--- 算法复杂度

文章目录

    • 算法时间复杂度

算法时间复杂度

要判断算法的好坏,可以从时间方面进行分析。算法运行的越快,所用的时间越短则算法越好。但是同一个算法在不同的平台上的运行时间不同。那么又该如何进行评判呢?我们采用时间复杂度进行衡量。

1.算法时间复杂度定义
  在进行算法分析时, 语句总的执行次数T(n)T(n)是关于问题规模nn的函数,进而分析T(n)T(n)随nn的变化情况并确定T(n)T(n)的数量。算法的时间复杂度。也就是算法的时间量度,记做:T(n)=O(f(n))T(n)=O(f(n))。它表示随问题规模nn的增大,算法执行时间的增长率和f(n)f(n)的增长率相同,称作算法的渐近时间复杂度,简称为时间复杂度。 其中f(n)f(n)是问题规模nn的某个函数。

个人理解:由于不同的机器指令执行的速度不一样,而我们的代码又常常是跑在多台不同机器上的,为了找出与机器无关但又可以说明代码效率的量标,于是就选择时间复杂度只与代码的执行次数有关,即:T(N)。一般情况下,随着N不断增大,T(N)增长缓慢的算法时间复杂度越低,算法越好

2.如何分析一个算法的时间复杂度:

  • 顺序结构,时间复杂度等于每步相加;选择分支结构,时间复杂度等于最大时间复杂度的那个分支;循环结构,时间复杂度每个循环体相乘
  • 用常数1取代运行时间中的所有加法常数;只保留阶数最高的那一项;高阶项前面的系数可以直接用1替代。

时间复杂度为O(1)

int a = 1 , b = 3 , sum = 0;  //执行1次
sum = a + b;   //执行1次
cout<<"the sum is :"<<sum<<endl; //执行1次     // 1+1+1 = 3 --> O(1)

时间复杂度为O(N)

//执行N次   
for(i=0;i<=n;i++){printf("the data is %d\n",i)    
}    //  N * 1 = N   --->   O(N)

时间复杂度为O(N^2)

//执行N次   
for(j=0;j<=n;j++){    //执行N次for(i=0;i<=n;i++){   //执行N次printf("the data is %d\n",i)  }  
}                        //N * N = N^2  ----->   O(N^2)

时间复杂度为O(logN)

//执行N/2次   
while(i<n){count<<"the data is :<<i<<endl;i = i*2;   
}                     

常用的时间复杂度所耗费的时间从小到大依次是:
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)

3.最坏情况:

  • 最坏情况运行时间是一种保证,那就是运行时间将不会再坏了。一般在没有特殊说明的情况下,都是指最坏时间复杂度。

4.平均情况

  • 平均运行时间是所有情况中最有意义的,因为它是期望的运行时间。

5.递归算法的时间复杂度的计算

  • 在算法的分析中,当一个算法中包含递归调用时,其时间复杂度的分析会转化成为一个递归方程的求解。而对递归方程的求解,方法多种多样,目前主流的方法:代入法,迭代法,公式法,母函数法,差分方程法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445484.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构课上笔记12

二叉树的存储结构 顺序存储结构 完全二叉树&#xff1a;用一组地址连续的 存储单元依次自上而下、自左至右存 储结点元素&#xff0c;即将编号为 i 的结点元 素存储在一维数组中下标为 i –1 的分量中。 一般二叉树&#xff1a;将其每个结点与完 全二叉树上的结点相对照&…

kaggle(01)-泰坦尼克号问题

经典又兼具备趣味性的Kaggle案例泰坦尼克号问题 大家都熟悉的『Jack and Rose』的故事&#xff0c;豪华游艇倒了&#xff0c;大家都惊恐逃生&#xff0c;可是救生艇的数量有限&#xff0c;无法人人都有&#xff0c;副船长发话了『lady and kid first&#xff01;』&#xff0c…

数据结构课上笔记13

树存储结构 父节点表示法 数据域&#xff1a;存放结点本身信息。 双亲域&#xff1a;指示本结点的双亲结点在数组中的位置。 对应的树&#xff1a; /* 树节点的定义 */ #define MAX_TREE_SIZE 100typedef struct{TElemType data;int parent; /* 父节点位置域 */ } PTNode;type…

数据结构课上笔记14

图是一种&#xff1a; 数据元素间存在多对多关系的数据结构 加上一组基本操作构成的抽象数据类型。 图 (Graph) 是一种复杂的非线性数据结构&#xff0c;由顶点集合及顶点间的关系&#xff08;也称弧或边&#xff09;集合组成。可以表示为&#xff1a; G&#xff1d;(V, V…

kaggle(03)-自行车租赁预测问题(基础版)

文章目录问题描述&#xff1a;问题解决分析问题&#xff1a;解决问题第一步&#xff1a;读取原始数据第二步&#xff1a;观察原始数据第三步&#xff1a;原始数据的可视化第四步&#xff1a;数据的预处理时间属性的分解第五步&#xff1a;数据的特征提取特征生成特征选择第六步…

二叉树序列化/反序列化

二叉树被记录成文件的过程&#xff0c;为二叉树的序列化 通过文件重新建立原来的二叉树的过程&#xff0c;为二叉树的反序列化 设计方案并实现。 &#xff08;已知结点类型为32位整型&#xff09; 思路&#xff1a;先序遍历实现。 因为要写入文件&#xff0c;我们要把二叉树…

机器学习总结(17)-XGBoost

文章目录lecture17&#xff1a;XGBoost(eXtreme Gradient Boosting)目录1. XGBoost的基本信息2. XGBoost与GBDT的异同点3. XGBoost的原理3.1定义树的复杂度3.2 分裂节点3.3 自定义损失函数4. XGBoost的使用lecture17&#xff1a;XGBoost(eXtreme Gradient Boosting) 目录 1. …

C++基础学习(01)--(介绍,环境配置,基本语法,注释)

文章目录目录一. c介绍二. c开发环境到的配置三. c基本语法四. c注释目录 一. c介绍 C 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言&#xff0c;支持过程化编程、面向对象编程和泛型编程。 C 被认为是一种中级语言&#xff0c;它综合了高级语言和低…

《Head First设计模式》读书笔记_第一章

策略模式 例&#xff1a;设计一个模拟鸭子游戏&#xff0c;游戏中有各种鸭子&#xff0c;一边戏水一边嘎嘎叫。 所以学习设计模式前&#xff0c;我们最先想到的就是设置一个超类&#xff0c;并让其他子类去继承这个类&#xff0c;UML图如下&#xff1a; * * 但是&#xff0…

根据数组建立平衡二叉搜索树

它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1&#xff0c;并且左右两个子树都是一棵平衡二叉&#xff08;搜索&#xff09;树。 二分&#xff1a;用有序数组中中间的数生成搜索二叉树的头节点&#xff0c;然后对数组的左右部分分别生成左右子树即可&#xff08;重复…

C++基础学习(02)--(数据类型,变量类型,变量作用域,常量,修饰符类型)

文章目录目录一. 数据类型C 中的数据类型typedefenumeration枚举类型c中变量类型二.变量作用域三.常量四.修饰符类型目录 一. 数据类型 C 中的数据类型 使用编程语言进行编程时&#xff0c;需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着&a…

commons-lang常用方法

maven引入 <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.9</version></dependency> 跟java.lang这个包的作用类似&#xff0c;Commons Lang这一组API也是提供一些基…

c++基础学习(03)--(存储类,运算符,循环,判断)

文章目录目录一.存储类二.运算符三.循环whilefor四.判断目录 一.存储类 可见static存储类修饰之后&#xff0c;i的值没有从头开始&#xff0c;而是从上一次的结果中保留下来 #include <iostream>using namespace std; class Data { public:Data(){}~Data(){}void show()…

皇后问题

八皇后问题是一个以国际象棋为背景的问题&#xff1a;如何能够在 88 的国际象棋棋盘上放置八个皇后&#xff0c;使得任何一个皇后都无法直接吃掉其他的皇后&#xff1f;为了达到此目的&#xff0c;任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的…

c++基础学习(04)--(函数、数字、数组、字符串)

文章目录目录1.函数2.数字3.字符串4.数组目录 1.函数 #include <iostream> #include <limits>using namespace std;void swap(int *x , int *y);int main(){int a 100 , b200;cout<<"交换前:"<<"a is :"<<a<<"…

【精品计划0】蓝桥杯 摔手机

原题描述&#xff1a; x星球的居民脾气不太好&#xff0c;但好在他们生气的时候唯一的异常举动是&#xff1a;摔手机。 各大厂商也就纷纷推出各种耐摔型手机。x星球的质监局规定了手机必须经过耐摔测试&#xff0c;并且评定出一个耐摔指数来&#xff0c;之后才允许上市流通。 …

数据结构课上笔记15

图的存储 多重链表&#xff1a;完全模拟图的样子&#xff0c;每个节点内的指针都指向该指向的节点。 节点结构内指针数为度 缺点&#xff1a;浪费空间、不容易操作 数组表示法&#xff08;邻接矩阵表示法&#xff09; 可用两个数组存储。其中一个 一维数组存储数据元素&#…

c++基础学习(05)--(指针,引用)

文章目录目录1.指针2.引用目录 1.指针 #include <iostream>using namespace std;int main () {int var1;char var2[10];cout << "var1 变量的地址&#xff1a; ";cout << &var1 << endl;cout << "var2 变量的地址&#xff…

由旅行商问题认识何为状态压缩

动态规划 动态规划(dynamic programming)是运筹学的一个分支&#xff0c;是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时&#xff0c;提出了著名的最优化原理(pri…

c++基础学习(06)--(时间,输入输出,数据结构)

文章目录目录1.时间2.输入输出数据结构目录 1.时间 当前日期和时间 下面的实例获取当前系统的日期和时间&#xff0c;包括本地时间和协调世界时&#xff08;UTC&#xff09;。 #include <iostream> #include <ctime>using namespace std;int main( ) {// 基于当前…