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

【算法LearnNO.1】算法介绍以及算法的时间复杂度和空间复杂度

目录

一、算法

1、算法概述

2、算法的5个特性

3、设计算法的标准

二、时间复杂度

1、时间复杂度的介绍

2、渐进时间复杂度的求法

3、计算时间复杂度的代码举例(平方阶示例)

4、时间复杂度排序

三、空间复杂度


一、算法

1、算法概述

算法就是解决问题的方法。以数据结构来表示出来对于问题的解决方法。一般算法的表示有三种方法:①自然语言表示②程序代码③类C语言。

2、算法的5个特性

有穷性:算法的实现是通过又穷步就可完成,且每一步都是有穷时间内完成的。

确定性:算法实现的输出结果唯一,对于算法中的所要执行的操作有确切的规定,不会存在二义性。

可行性:所有操作在有限时间内可实现。

输入:一个算法有零个或多个输入。

输出:一个算法有一个或多个输出。

3、设计算法的标准

正确性:不单单是程序语法正确,还要在运行一些能涵盖所有情况的特殊数据后能够准确的得到及结构。

可读性:算法是给人看的,要让读者能够读懂,而不会在阅读中有很多看不明白的地方。多增加注释,在很多变量和语句中增加解释,让算法变得清晰。

健壮性:随机应变能力。当输入非法的数据时,不会乱七八糟的随意输出,而会做出正确的反应或者得到错误提醒的输出语句。

高效性:高效分为时间高效和空间高效。效率高,则时间短,所需空间小。但是有时候时间效率和空间效率是矛盾的,想要时间效率高有时候会消耗很大的空间。

二、时间复杂度

算法时间效率是依据程序在计算机上运行所消耗的时间来度量的。度量方法有事后统计和事前分析两种方法,而人们一般会用后者,在编写程序之前对算法所消耗资源进行估算。

1、时间复杂度的介绍

一个算法的运行时间是=每条语句的执行次数ⅹ该语句执行一次所需要的时间

for(i=0;i<n;i++){           //频度为n+1for(i=0;i<n;i++){       //频度为n*(n+1)k=k*2;}
}

上面代码段的运行时间用含n的函数表示为f(n)=n²+2n+1,

上式函数的同阶函数为n²,

我们用"O"来表示数量级,则T(n)=O(f(n))=O(n²);T(n)即为上述算法的渐进时间复杂度,简称时间复杂度。

2、渐进时间复杂度的求法

大O符号(Big O notation):是用于描述函数渐进行为的数学符号。
推导大O阶方法:

  • 用常数1取代运行时间中的所有加法常数。
  • 在修改后的运行次数函数中,只保留最高阶项。
  • 如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。

3、计算时间复杂度的代码举例(平方阶示例)

    int x=0;y=0;    for(k=1;k<=n;k++){x++;} for(i=1;i<=n;i++){for(j=1;j<=n;j++){y++; }}

对循环语句只需考虑循环体中语句的执行次数,以上程序段中频度最大的语句是第(7)行,其频度为f(n)=n²,所以该算法的时间复杂度为T(n)=O(n²),称为平方阶。

笔者的理解是算法的时间复杂度是由最深层循环内的基本语句的频度f(n)决定的,最深处的语句就是频度最大的语句。

4、时间复杂度排序

时间复杂度T(n)按数量级递增顺序为(从左到右复杂度升高):

三、空间复杂度

时代发展,科技进步,人们都不是很关注空间的占用情况了,因为现在的计算机的存储空间都很大很大。

空间复杂度:算法所需存储空间(寄存器)的量度。

                        记作:S(n)=O(f(n))

算法所占用的空间包括:

①算法本身所占用的空间:输入输出以及定义的变量等所占用的空间。

②算法要使用的辅助空间。

笔者认为计算空间复杂度是注重在于寻找定义,因为变量是在定义的时候才会被分配空间,在程序中寻找总共分配了多少个空间给变量,空间复杂度就是多少,空间复杂度的差异取决于辅助空间的大小分配,辅助空间分配的多少就能间接的体现出来空间复杂度的大小。

值得注意的是:函数运行时所需要的栈空间(存储参数、局部变量、一些寄存器信息等)在编译期间已经确定好了,因此空间复杂度主要通过函数在运行时候显式申请的额外空间来确定。

今天的分享就到这啦😉


如果我的文章对您有帮助,

希望可以 “点赞” “收藏” “关注” 一键三连支持一下哦!

想了解更多知识请前往故里♡927的博客

如果以上内容有什么问题,欢迎留言,大家一起学习,共同进步。


我们下期见😉~~

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

相关文章:

  • 013:Mapbox GL添加marker
  • 智慧工厂可视化合集,推动行业数字化转型
  • 工作流调度系统 Azkaban介绍与安装(一)
  • 【Python基础入门学习】Python工具Pycharm的安装与使用
  • 【版本控制】Github同步Gitee镜像仓库自动化脚本
  • 索引的分类
  • 【整理九】
  • 钢网是SMT生产使用的一种工具,如何制作?
  • 如何创建自己的gym环境
  • 使用Marshaller 将Java对象转化为XML格式和字符串转为xml
  • NumPy 秘籍中文第二版:八、质量保证
  • [ 应急响应篇基础 ] 日志分析工具Log Parser配合login工具使用详解(附安装教程)
  • 什么是MVVM?
  • Java 企业电子招投标采购系统源码:采购过程更规范,更透明
  • 1384:珍珠(bead)
  • 34岁本科男,做了5年功能测试想转行,除了进厂还能干什么?
  • 一文理解Transformer整套流程
  • 04、SpringBoot运维实用篇
  • 3.Java运算符
  • 《RockectMQ实战与原理解析》Chapter4-分布式消息队列的协调者
  • Spring Boot 最适配的 UI 是什么
  • TensorFlow 1.x 深度学习秘籍:6~10
  • 分布式场景下,Apache YARN、Google Kubernetes 如何解决资源管理问题?
  • RK3399平台开发系列讲解(基础篇)POSIX 定时器
  • web小游戏开发:扫雷(三)(完成度90%)
  • 创建菜单栏、菜单、菜单项
  • 专访丨AWS量子网络中心科学家Antía Lamas谈量子计算
  • [ 云计算 | Azure ] Chapter 04 | 核心体系结构之数据中心、区域与区域对、可用区和地理区域
  • 升级长江存储最新闪存,忆恒创源发布新一代企业级NVMe SSD
  • Xcode14:”Failed to prepare the device for development“解决