当前位置: 首页 > news >正文

数据结构---算法的时间复杂度

文章目录

  • 前言
  • 计算机重要存储
    • 数据结构与算法
      • 数据结构概念
      • 算法
    • 数据库
      • 概念
  • 算法的复杂度
  • 时间复杂度
    • 概念
    • 为什么有时间复杂度
    • 大O渐进表示法
    • 时间复杂度实例
      • 实例1:时间复杂度:O(N)
      • 实例2:这里输入参数是不确定的所以 时间复杂度为O(M+N)

前言

计算机重要存储

  • 重要存储分为俩种:内存硬盘

数据结构与算法

数据结构概念

数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。

*简述
对内存进行数据管理

算法

算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结果。

简述

对数据进行处理

数据库

概念

*简述
对硬盘进行数据管理

算法的复杂度

算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源。
因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。时间复杂度主要衡量一个算法的运行快慢,而空间复杂度主要衡量一个算法运行所需要的额外空间。在计算机发展的早期,计算机的存储容量很小。所以对空间复杂度很是在乎。但是经过计算机行业的迅速发展,计算机的存储容量已经达到了很高的程度。所以我们如今已经不需要再特别关注一个算法的空间复杂度。

时间复杂度

概念

时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。但是我们需要每个算法都上机测试吗?是可以都上机测试,但是这很麻烦,所以才有了时间复杂度这个分析方式。一个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。

即:找到某条基本语句与问题规模N之间的数学表达式,就是算出了该算法的时间复杂度

为什么有时间复杂度

时间复杂度能让我们了解当前思路的执行程序次数。 当一个问题拥有几个解决的思路算出解决思路的时间复杂度,可知最优的解决思路

大O渐进表示法

大O渐进表示法:

是用于描述函数渐进行为的数学符号。
估算出来的时间复杂度
推导大O阶方法:
1、用常数1取代运行时间中的所有加法常数。
2、在修改后的运行次数函数中,只保留最高阶项。
3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。

有些时间复杂度分为多种情况:例如: 最好 - 平均 - 最坏

能让算法的时间复杂度在预估计的执行范围内

时间复杂度实例

实例1:时间复杂度:O(N)

// 计算Func2的时间复杂度?
void Func2(int N)
{int count = 0;for (int k = 0; k < 2 * N ; ++ k) 这里执行2N次{++count;}int M = 10;while (M--) 执行10{++count;}printf("%d\n", count);
}

实例2:这里输入参数是不确定的所以 时间复杂度为O(M+N)

void Func3(int N, int M)
{int count = 0;for (int k = 0; k < M; ++ k) 执行M次{++count;}for (int k = 0; k < N ; ++ k) N次{++count;}printf("%d\n", count);}

实例3:输入参数与执行次数无关 执行常数次 所以是 O(1)

void Func4(int N)
{int count = 0;for (int k = 0; k < 100; ++ k){++count;}printf("%d\n", count);
}

实例4
这里从一个字符串中寻找一个字符 寻找的情况分为
最好:1-前几个找到
平均:在中间前后范围找到
最坏:最后一找到 or 没有找到
时间复杂度取最坏情况:所以是O(N)

// 计算strchr的时间复杂度?
const char * strchr ( const char * str, int character );
{while(*str){if(*str==character)return str;else++str;}}

实例5:
计算时间复杂度最好是按思路计算 数循环不能正确算出所有的时间复杂度
排序:将数据按升序或降序排列
冒泡排序的思想:一组数据 从第一个和第二个比较,按升序排列如果后一个小于前一个交换数值,否则不交换,接着第二个和第三个比较,直至比较到最后一个和前一个相比较,最后最大值交换到最后一项,下一趟只需比较到最后一项的前一个选出次大的。
第一次的执行次数为n-1次,因为一次俩俩比较,比较到最后
例如俩俩比较一共5个数据,执行总数据个数-1次
下一趟选出次大的,执行总数据-2次
一直到不足两个数据结束。
在这里插入图片描述

((1+n-1)*(n-1))/2 时间复杂度:O(N^2)

Void BubbleSort(int* a, int n)
{assert(a);for (size_t end = n; end > 0; --end){int exchange = 0;for (size_t i = 1; i < end; ++i){if (a[i-1] > a[i]){Swap(&a[i-1], &a[i]);exchange = 1;}}if (exchange == 0)break;}
}

http://www.lryc.cn/news/265057.html

相关文章:

  • 后缀为.vue是什么文件
  • 前端微信小程序AES加密解密踩坑
  • 代码随想录算法训练营第五十八天| 739 每日温度 496 下一个更大元素 |
  • 配置自定义RedisTemplate 解决redis序列化java8 LocalDateTime
  • 华为---登录USG6000V防火墙---console、web、telnet、ssh方式登录
  • css图片属性,图片自适应
  • 【Python百宝箱】数据科学的黄金三角:数据挖掘和聚类
  • 【数据结构和算法】最大连续1的个数 III
  • AngularJS
  • 初级数据结构(七)——二叉树
  • 对比学习综述
  • R语言【cli】——cli_warn可以更便捷的在控制台输出警告信息
  • 从零开始创建GPTs 人人都可以编写自己的ChatGPT产品
  • 人工智能对网络安全的影响
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TextInput输入框组件
  • 【C++入门到精通】互斥锁 (Mutex) C++11 [ C++入门 ]
  • 安全狗云原生安全-云甲·云原生容器安全管理系统
  • Python 学习路线:介绍、基础语法、数据结构、算法、高级主题、框架及异步编程详解
  • 基于Java+SpringBoot+Mybaties-plus+Vue+ElementUI+Vant 电影院订票管理系统 的设计与实现
  • 轻量级购物小程序H5产品设计经典样例
  • final, finally, finalize 的区别?
  • 4.使用 Blazor 构建 Web 应用程序
  • CentOS操作学习(二)
  • OpenCV技术应用(9)— 视频的暂停播放和继续播放
  • C#时间戳转换
  • Postgresql源码(118)elog/ereport报错跳转功能分析
  • Python Selenium中的强大等待设置详解
  • ACL实现固定时间访问资源——项目
  • 前端学习——关于前端框架的思考
  • 大创项目推荐 深度学习+opencv+python实现车道线检测 - 自动驾驶