第二章-算法

news/2024/7/3 20:58:21

第二章-算法

数据结构和算法的关系

  1. 算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。

算法的特性

  • 算法有五个基本特征:输入、输出、有穷性、确定性和可行性。
    1. 输入:算法具有零个或者多个输入。
    2. 输出:算法至少有一个或多个输出。
    3. 有穷性:算法在执行了有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。
    4. 确定性:算法的每一个步骤都具有确定的含义,不会出现二义性。
    5. 可行性:算法的每一步都是必须可行的,也就是说,每一步都能够执行有限次数完成。

算法设计的要求

  1. 正确性
    • 算法的正确性是指算法至少应该具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案。
    • 算法的正确性通常具有四个层次,一般情况下取前三个作为算法是否正确的标准,因为第四个成本很高。
      1. 算法程序没有语法错误。
      2. 算法程序对于合法的输入数据能够产生满足要求的输出结果。
      3. 算法程序对于非法的输入数据能够得出满足规格说明的结果。
      4. 算法程序对于精心选择的、甚至刁难的测试数据都有满足要求的输出结果。
  2. 可读性
    • 算法设计的另一个目的是为了便于阅读、理解和交流。
  3. 健壮性
    • 当输入数据不合法时,算法也能做出相应处理,而不是产生异常或者莫名其妙的结果。
  4. 时间效率高和存储量低
    • 时间效率:算法的执行时间
    • 存储量:算法在执行过程中所需要的最大存储空间。
    • 设计算法应该要尽量满足时间效率高和存储量低的需求。

算法效率的度量方法

  1. 事后统计方法
    • 这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同算法的程序的运行时间进行比较,从而确定算法效率的高低。
    • 但是这种方法有很大的缺陷:
      1. 必须依靠事先编制好程序,这需要花费大量的时间和精力。
      2. 时间的比较依赖计算机的硬件和软件等环境因素,有时会掩盖算法本身的优劣。
      3. 算法的测试数据设计困难,并且程序的运行时间往往跟测试数据的规模有很大关系,效率高的算法在小的测试数据面前往往得不到体现。
  2. 事前分析估算方法
    • 在计算机程序编制前,依据统计方法对算法进行估算。一个用高级程序语言编写的程序在计算机上运行时所消耗的时间取决于以下因素:
      1. 算法采用的测策略、方法。
      2. 编译产生的代码质量。(软件支撑)
      3. 问题的输入规模。
      4. 机器执行指令的速度。(硬件支撑)
    • 抛开软件和硬件有关的因素,一个程序的运行时间,依赖于算法的好坏和问题的输入规模(输入量的多少)。

函数的渐进增长

  • 给定两个函数f(n)和g(n),如果存在一个整数N,使得对于所有的n>N,f(n)总是比g(n)大,那么,我们说f(n)的增长渐进快于g(n)
  • 在计算算法的时间的时候,下面的参数是可以被忽略不计的。
    1. 加法常数
    2. 与最高次项相乘的常数
  • 也就是说,判断一个算法的效率时,函数中的常数和其他次要项常常可以忽略,我们应该关注最高次项的阶数。

算法的时间复杂度

  1. 算法时间复杂度定义

    • 在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。算法的时间复杂度,也就是算法的时间度量,记作:T(n)=O(f(n))。他表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同。
    • 一般情况下随着n增大,T(n)增长最慢的算法为最优算法。
  2. 推导大O阶方法

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

    得到的结果就是大O阶。

  3. 常数阶

    • 大O阶是一个常数
  4. 线性阶

    • 我们要分析算法的复杂度,关键就是要分析循环结构的运行情况。
  5. 对数阶

在这里插入图片描述

  1. 平方阶

常见的时间复杂度

在这里插入图片描述

一般情况下指的是最坏运行时间,平均运行时间固然好,但是一般难以估算。

算法空间复杂度

算法的空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公式记作:S(n)=O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数。


http://www.niftyadmin.cn/n/4924516.html

相关文章

Python-OpenCV中的图像处理-图像阀值

Python-OpenCV中的图像处理-图像阀值 图像阈值单阈值自适应阈值Otsus二值化 图像阈值 单阈值 与名字一样,这种方法非常简单。但像素值高于阈值时,我们给这个像素赋予一个新值(可能是白色),否则我们给它赋予另外一种颜…

实现静态资源访问的几种方法

什么是静态资源? 静态资源是指在服务器端存储的不会变化的文件,如HTML、CSS、JavaScript、图片、音频、视频等文件。这些文件一般不包含动态内容,每次请求时返回的内容都是固定的。 为什么要使用静态资源? 提升网站性能&#xf…

一篇文章教会你什么是Linux进程控制

Linux进程控制 进程创建1.fork函数初识1.1那么fork创建子进程时,操作系统都做了什么呢?1.2 父子进程和CPU中的EIP(指令指针)之间存在一定的关系1.3 fork的常规用法有哪些?1.4 fork调用失败的原因有哪些? 2.…

macbook 安装 Git 和 安装 Homebrew

使用MacBook 时,需要拉取代码,我们需要使用到 Git,但 MacBook 中并没安装,这里我们分享一下安装过程。其他方式可查看参考文献中的方法。 一、使用终端直接安装 在新版的 MacBook 中,可以使用终端直接安装 Git&#…

QT开发异常问题

文章目录 前言一、label或edit显示汉字乱码二、发送的QByteArray中文乱码三、QTcpSocket write多次,接收到的是1个包 前言 本篇记录QT开发过程中遇到的异常问题及解决方案,持续更新… 一、label或edit显示汉字乱码 在项目公共头文件中添加以下代码即可…

常量池-JVM(十九)

上篇文章说gc日志以及arthas。 Arthas & GC日志-JVM(十八) 一、常量池 常量池主要放两大类:字面量和符号引用。 字面量就是由字母、数字等构成的字符串或者数值常量。 符号引用主要包含三类常量。 类和接口的全限定名。字段的名称和…

lab7 proxylab

前情提要,如果看了书本,这个lab难度不高,但是如果不看书,难度还是挺高的,并且这个lab会用到cachelab中学到的东西,需要阅读 第十章:系统编程第十一章:网络编程第十二章:…

【腾讯云 Cloud Studio 实战训练营】使用 Cloud Studio 快速构建 Vue + Vite 完成律师 H5 页面

【腾讯云 Cloud Studio 实战训练营】使用 Cloud Studio 快速构建 Vue Vite 完成律师 H5 页面 前言一、基本介绍1.应用场景2.产品优势 二、准备工作1.注册 Cloud Studio2.进入 Vue 预置开发环境 三、使用 Cloud Studio 快速构建 Vue Vite 完成律师 H5 页面1.安装相关依赖包2.主…