1.算法——数据结构学习

news2024/11/24 13:07:42

算法是解决特定问题求解步骤的描述。

从1加到100的结果

# include <stdio.h>  
  
int main(){  
    int i, sum = 0, n = 100;   // 执行1次
    for(i = 1; i <= n; i++){  // 执行n + 1次
        sum = sum + i;    // 执行n次
    }  
    printf("%d", sum); // 执行1次
  
    return 0;  
}

高斯求和

# include <stdio.h>  
  
int main(){  
    int sum = 0, n = 100;   // 执行1次
  
    sum = (1 + n) * n / 2;  // 执行1次
  
    printf("%d\n", sum);  // 执行1次
  
    return 0;  
}

概念

算法的定义

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

算法的特性

  • 输入输出
    • 具有零个或多个输入
    • 至少有一个或多个输出
  • 有穷性
    • 执行有限步骤后会自动结束
    • 每个步骤在可接受的时间内完成
  • 确定性
    • 每一步骤具有确定的含义
    • 无二义性
  • 可行性
    • 每一步都必须是可行的,能在有限步内完成

算法的设计要求

  • 正确性
    • 算法程序没有语法错误
    • 算法程序对于合法的输入数据能够产生满足要求的输出结果
    • 算法程序对于非法的输入数据能够得出满足规格说明的结果
    • 算法程序对于精心选择的,甚至刁难的测试数据都有满足要求的输出结果
  • 可读性
  • 健壮性
  • 时间效率高,存储量低

算法的度量方法

事后统计法

通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。

缺点:

  • 必须依据算法事先编制好程序,需要花费大量时间和精力,若编制出发现是个很糟糕的算法,竹篮打水一场空
  • 时间的比较以来计算机硬件和软件等环境因素,有时会掩盖算法本身的优劣
  • 算法的测试数据设计困难,程序运行时间往往与数据的规模有很大关系,效率高的算法在小的测试数据面前得不到体现

事前分析估算法

在计算机程序编制前,依据统计方法对算法进行估算。

一个用高级程序语言编写的程序在计算机上运行时所消耗的时间取决于:

  1. 算法采用的策略和方法 —> 算法好坏的根本
  2. 编译产生的代码质量 —> 由软件支持
  3. 问题的输入规模
  4. 机器执行指令的速度 —> 硬件性能
    一个程序的运行时间,依赖于算法的好坏和问题的输入规模(输入量)。

两种求和算法

# include <stdio.h>  
  
int main(){  
    int i, sum = 0, n = 100;   // 执行1次
    for(i = 1; i <= n; i++){  // 执行n + 1次
        sum = sum + i;    // 执行n次
    }  
    printf("%d", sum); // 执行1次
  
    return 0;  
}

2n+3次

# include <stdio.h>  
  
int main(){  
    int sum = 0, n = 100;   // 执行1次
  
    sum = (1 + n) * n / 2;  // 执行1次
  
    printf("%d\n", sum);  // 执行1次
  
    return 0;  
}

3次

延展

# include <stdio.h>  
  
int main() {  
    int i, j, x = 0, sum = 0, n = 100;  // 执行一次  
    for(i = 1; i <= n; i++){  
        for (j = 1; j <= n; j++){  
            x++;  // 执行n×n次  
            sum = sum + x;  
        }  
    }  
    printf("%d", sum);  // 执行一次  
  
    return 0;  
}

测定运行时间最可靠的方法就是计算对运行时间有消耗的的基本操作的执行次数。

  • 不计循环索引的递增、循环终止条件、变量声明、打印结果等操作

  • 分析程序的运行时间时,最重要的是把程序看成是独立于程序设计语言的算法或一系列步骤

  • 分析一个算法的运行时间,重要的是把基本操作的数量和输入规模关联起来,即基本操作的数量必须表示成输入规模的函数


函数的渐近增长

给定两个函数f(n)和g(n),若存在一个整数N,使得对于所有n>N,f(n)总是比g(n)大,那么我们说f(n)的增长渐近快于g(n)

  • 可以忽略加减常数
  • 与最高次项相乘的常数并不重要
    判断一个算法的效率时,函数中的常数和其他次要项常常可忽略,而更应该关注最高阶项的阶数。

某个算法,随着n的增大,它会越来越优于另一算法或越来越差于另一算法。


算法的时间复杂度

进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级。

  • 算法的时间复杂度,也就是算法的时间度量,记作T(n)=O(f(n)) —> 大O记法
  • 它随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称:时间复杂度
  • f(n)是问题规模n的某个函数

增长最慢的算法为最优算法。
图片来源:《数据结构 C++版》邓俊辉著

推导大O阶方法

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

常数阶 O(1)

顺序结构的时间复杂度。
执行时间恒定的算法:O(1)的时间复杂度 —> 常数阶

不论常数为多少,都记作O(1)!

对于分支结构而言,无论真假,执行的次数都是恒定的,不会随着n的变大而发生变化,单纯的分支结构 -> 复杂度也为O(1)

线性阶 O(n)

线性阶的循环结构。
要确定某个算法的阶数,常需要确定某个特定语句或某个语句集的运行次数。

分析算法的复杂度,关键就是要分析循环结构的运行情况!

int i;  
for(i = 0; i < n; i++){  
    // 时间复杂度为O(1)的程序步骤序列  
}

对数阶 O(logn)

int count = 1;  
while (count < n){  
    count = count * 2;  
    // 时间复杂度为O(1)的程序步骤序列  
}

每次count乘2后,离n就近一分, 2 x = n , x = log ⁡ 2 n 2^x=n,x=\log_{2}n 2x=n,x=log2n

平方阶 O( n 2 n^2 n2)

int i,j;  
for(i = 0; i < n; i++){  
    for(j = 0; j < n; j++){  
        // 时间复杂度为O(1)的程序步骤序列  
    }  
}

循环的时间复杂度等于循环体的复杂度乘以该循环的次数。

理解大O阶推导不算难,难的是对数列的一些相关运算,更多的是考察数学知识和能力!特别是数列方面的知识和解题能力!

常见时间复杂度表
图片来源:《大话数据结构》程杰著


最坏与平均情况

最坏情况是一种保证,通常我们提到的运行时间都是最坏情况的运行时间。

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


算法空间复杂度

计算公式:S(n)=O(f(n))
n -> 问题的规模,f(n)为语句关于n所占存储空间的函数

一般情况,一个程序在机器上执行时,除了需要存储程序本身的指令、常数、变量和输入数据外,还需要存储对数据操作的存储单元。

通常使用“时间复杂度”指运行时间的需求;使用“空间复杂度”指空间需求。
不用限定词地使用“复杂度”时,通常指:时间复杂度

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

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

相关文章

孙哥Spring源码第26集

第26集、AnnotationAwareAspectJAutoProxyCreator源码 【视频来源于&#xff1a;B站up主孙帅suns Spring源码视频】【微信号&#xff1a;suns45】 26.1、postProcessAfterInitialization分析 26.2、wrapIfNecessary分析 26.3、createProxy分析 26.4、getProxy 26.5、BeanPost…

xxl-job分布式调度框架

课程目标 1、 掌握xxl-job部署以及开发的方式 2、 掌握xxl-job特性以及架构设计 3、 掌握xxl-job运行原理 内容定位 适合已经掌握了Quartz的同学 quartz这节课是本节课的基础&#xff0c;这个要求大家一定掌握&#xff0c;因为xxl-job早期就是使用quartz改造的&#xff0…

使用华为eNSP组网试验⑵-通过端口地址进行静态路由

有了网络模拟器可以对很多网络应用场景进行模拟&#xff0c;既方便学习又有利于实际的网络实施。 之前因为没有用过&#xff0c;用过了才知道eNSP的好处。但是与思科模拟器不同&#xff0c;连接是自动连接&#xff0c;不能确定端口&#xff0c;比如使用指定的光纤端口或者RJ45的…

地球的某一片红薯地中秋圆辉少许《乡村振兴战略下传统村落文化旅游设计》——2023学生旅行季许少辉八月新书想象和世界一样宽广

地球的某一片红薯地中秋圆辉少许《乡村振兴战略下传统村落文化旅游设计》——2023学生旅行季许少辉八月新书想象和世界一样宽广 地球的某一片红薯地中秋圆辉少许《乡村振兴战略下传统村落文化旅游设计》——2023学生旅行季许少辉八月新书想象和世界一样宽广

基于微信小程序的民宿短租酒店预订系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

存储引擎InnoDB与MyISAM

操作引擎 查看存储引擎 show engines;设置系统默认的存储引擎 查看默认的存储引擎 show variables like %storage_engine%;修改默认的存储引擎 set default_storage_engineMyISAM;或者修改my.cnf文件&#xff1a; :::tips default-storage-engineMyISAM #重启服务systemct…

CentOS下安装MySQL 8.1及备份配置

1 卸载原来的MySQL版本 移除之前部署的mysql软链接 # unlink /etc/init.d/mysql # unlink /usr/bin/mysql2 下载最新的MySQL版本 https://dev.mysql.com/downloads/mysql/8.0.html 我这里直接把地址放在这里&#xff1a;https://cdn.mysql.com//Downloads/MySQL-8.1/mysql…

数据结构_链表

查询慢&#xff1a;链表中地址不是连续的&#xff0c;每次查询元素都必须从 头 开始查询增删快&#xff1a;链表结构&#xff0c;增加/删除一个元素&#xff0c;对链表的整体结构没有影响&#xff0c;所以增删快链表中的每一个元素也称为一个 节点一个节点包含了一个数据源&…

汽车电子——产品标准规范汇总和梳理(自动驾驶)

文章目录 前言 一、分级 二、定位 三、地图 四、座舱 五、远程 六、信息数据 七、场景 八、智慧城市 九、方法论 总结 前言 见《汽车电子——产品标准规范汇总和梳理》 一、分级 《GB/T 40429-2021 汽车驾驶自动化分级》 《QC/T XXXXX—XXXX 智能网联汽车 自动驾…

WordPress主题开发( 七)之—— 模版文件继承规则

WordPress主题开发&#xff08; 七&#xff09;之—— 模版文件继承规则 概述模板文件层次结构示例可视化概述层次结构详细信息主页显示首页显示单文章页面单页分类目录标签自定义分类自定义文章类型作者显示日期搜索结果404&#xff08;未找到&#xff09;附件嵌入功能非ASCII…

微PE辅助VMware安装操作系统

文章目录 一、微PE工具下载和安装二、下载系统镜像1.方式一2.方式二 三、安装VMware虚拟机三、使用U盘安装系统1.磁盘分区2.安装操作系统 一、微PE工具下载和安装 微PE工具箱下载地址点我 注意&#xff1a;EFI盘不要动任何文件&#xff0c;而我们自己的U盘就可以当作日常普通…

03 MIT线性代数-矩阵乘法和逆矩阵Multiplication inverse matrices

1. 矩阵乘法 Matrix multiplication 我们通过四种方法讨论如何使矩阵A与B相乘得到矩阵C。其中A为mxn&#xff08;m行n列&#xff09;矩阵&#xff0c;而B为nxp矩阵&#xff0c;则C为mxp矩阵&#xff0c;记cij为矩阵C中第i行第j列的元素 1.1 Regular way 矩阵乘法的标准计算方…

Azure AD混合部署,通过 Intune 管理设备,实现条件访问

一、设备同步到AAD上面 1、配置 AAD Connect 2、选择 3、下一步 4、配置本地 企业管理员 5、配置成功 二、通过 组策略把设备同步到 Intune 上面 1、创建一条组策略 2、设置 &#xff08;1&#xff09;计算机配置 → 管理模板 → Windows 组件 → MDM → 使用默认 Azure AD …

WSL2编译安卓11源码,,刷入pixel设备,并使用asfp查看源码

目录 WSL2编译安卓11源码,&#xff0c;刷入pixel设备源码下载驱动下载编译刷机源码导入Android Studio for platformADB调试 WSL2编译安卓11源码,&#xff0c;刷入pixel设备 aosp编译完成后&#xff0c;刷入手机其实非常简单&#xff0c;但是使用wsl有一个问题&#xff0c;就是…

绝缘子主要尺寸

声明 本文是学习GB-T 1000-2016 高压线路针式瓷绝缘子尺寸与特性. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了高压线路针式瓷绝缘子的结构型式、尺寸、机械特性和电气特性。 本标准适用于标称电压为10 kV 及以下、频率不高于…

【Unity的 Built-in 渲染管线下实现好用的GUI模糊效果_Blur_案例分享(内附源码)】

CGPROGRAM实现好用的GUI模糊效果 实现Blur模糊方式1C#代码如下方式1_Shader代码如下实现Blur模糊方式2方式2_Shader如下实现Blur模糊方式1 其他的模糊效果,在这一篇。 效果如图: 新建一个C#文件,命名为"CommandBlur",打开C#,删除内容,复制粘贴下面的代码:…

TikTok的伦理挑战:虚拟世界与现实世界的交汇

在数字时代&#xff0c;社交媒体平台已经不再只是一个信息传播的工具&#xff0c;它已经深刻地改变了我们的社交行为、价值观和伦理观。 而在这一领域的佼佼者之一&#xff0c;TikTok&#xff0c;正面临着伦理挑战&#xff0c;这是虚拟世界与现实世界交汇的产物。 本文将深入…

GitLab多人开发步骤

目录 一、基于develop创建自己的feature分支二、提交代码格式简易版 三、提交到远程仓库四、提交合并请求 一、基于develop创建自己的feature分支 使用git checkout切换到develop分支 git checkout develop 基于develop分支创建feature分支 格式&#xff1a; git checkout -b …

字符集、IO流(一)

字符集、IO流(一) 各位同学,前面我们已经学习了File类,通过File类的对象可以对文件进行操作,但是不能操作文件中的内容。要想操作文件中的内容,我们还得学习IO流。但是在正式学习IO流之前,我们还需要学习一个前置知识叫做字符集,只有我们把字符集搞明白了,再学习IO流…

全新UI基于Thinkphp的最新自助打印系统/云打印小程序源码/附教程

这是一款全新的基于Thinkphp的最新自助打印系统&#xff0c;最新UI界面设计的云打印小程序源码&#xff0c;带有简单的教程。 下载地址&#xff1a;https://bbs.csdn.net/topics/617324130