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

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

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

从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所占存储空间的函数

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

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

相关文章:

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

算法是解决特定问题求解步骤的描述。 从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; }高斯求和…...

信息论基础第二章阅读笔记

信息很难用一个简单的定义准确把握。 对于任何一个概率分布&#xff0c;可以定义一个熵&#xff08;entropy&#xff09;的量&#xff0c;它具有许多特性符合度量信息的直观要求。这个概念可以推广到互信息&#xff08;mutual information&#xff09;&#xff0c;互信息是一种…...

Content-Type的取值

接口发送参数、接收响应数据&#xff0c;都需要双方约定好使用什么格式的数据&#xff0c;例如 json、xml。只有双方按照约定好的格式去解析数据才能正确的收发数据。而 Content-Type 就是用来告诉你数据的格式&#xff0c;这样我们才能知道怎么解析参数。 常见的 Content-Typ…...

【趣味JavaScript】5年前端开发都没有搞懂toString和valueOf这两个方法!

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&#x1…...

Python中的接口是什么?

在Python中&#xff0c;接口是一种约定或协议&#xff0c;用于定义类应该实现哪些方法或属性。接口并不会提供实际的实现&#xff0c;而是只定义了类应该具有哪些方法和属性的签名。 Python中的接口通常通过抽象基类&#xff08;Abstract Base Class&#xff0c;简称ABC&#…...

自学WEB后端01-安装Express+Node.js框架完成Hello World!

一、前言&#xff0c;网站开发扫盲知识 1.网站搭建开发包括什么&#xff1f; 前端 前端开发主要涉及用户界面&#xff08;UI&#xff09;和用户体验&#xff08;UX&#xff09;&#xff0c;负责实现网站的外观和交互逻辑。前端开发使用HTML、CSS和JavaScript等技术来构建网页…...

从C语言到C++:C++入门知识(1)

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关C语言的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数…...

服务器(Windows系统)自建filebrowser网盘服务器超详细教程

需要依赖&#xff08;工具&#xff09; 轻量服务器&#xff08;云服务器&#xff09;一台 —— 环境Windows Server 2019filebrowser安装包&#xff08;https://github.com/filebrowser/filebrowser/releases&#xff09; 下载安装filebrowser 进入链接下载&#xff1a;https:/…...

扩展欧几里得

扩展欧几里得算法 求 a x b y d axbyd axbyd 的一组解&#xff0c; d gcd ⁡ ( a , b ) d \gcd(a,b) dgcd(a,b)。 辗转相除递归求解。 假设已经求出 b x ( b m o d a ) y d bx (b \bmod a)y d bx(bmoda)yd 的一组解。 a x b y b x ′ ( b m o d a ) y ′ b x …...

MySQL 事务介绍 (事务篇 一)

什么是事务&#xff1f; 事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 注意点&#xff1a;默认MySQL的事务是自动提交…...

nvm nodejs的版本管理工具

nvm 全英文名叫 node.js version management&#xff0c;是一个 nodejs 的版本管理工具&#xff0c;为了解决 nodejs 各种版本存在不兼容现象可以通过他安装和切换不同版本的 nodejs。 一、完全删除之前的 node 和 npm 1. 打开 cmd 命令窗口&#xff0c;输入 npm cache clean…...

terraform简单的开始-vpc cvm创建

从网络开始 从创建VPC开始 复用前面的main.tf的代码&#xff1a; terraform {required_providers {tencentcloud {source "tencentcloudstack/tencentcloud"version "1.81.25"}} } variable "region" {description "腾讯云地域"…...

【MySQL】开启 canal同步MySQL增量数据到ES

开启 canal同步MySQL增量数据到ES canal 是阿里知名的开源项目&#xff0c;主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费。示使用 canal 将 MySQL 增量数据同步到ES。 一、集群模式 图中 server 对应一个 canal 运行实例 &#xff0c;对应一…...

密码学概论

1.密码学的三大历史阶段&#xff1a; 第一阶段 古典密码学 依赖设备&#xff0c;主要特点 数据安全基于算法的保密&#xff0c;算法不公开&#xff0c;只要破译算法 密文就会被破解&#xff0c; 在1883年第一次提出 加密算法应该基于算法公开 不影响密文和秘钥的安全&#xff…...

渗透测试中的前端调试(一)

前言 前端调试是安全测试的重要组成部分。它能够帮助我们掌握网页的运行原理&#xff0c;包括js脚本的逻辑、加解密的方法、网络请求的参数等。利用这些信息&#xff0c;我们就可以更准确地发现网站的漏洞&#xff0c;制定出有效的攻击策略。前端知识对于安全来说&#xff0c;…...

SPA项目之登录注册--请求问题(POSTGET)以及跨域问题

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于VueElementUI的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.ElementUI是什么 &#x1f4a1;…...

Spring Cloud Alibaba Gateway全局token过滤、局部过滤访问时间超过50ms日志提示

文章目录 Spring Cloud Alibaba Gateway验证token在前篇的基础上加入依赖在filter包中创建tokenFilter Spring Cloud Alibaba Gateway局部过滤1.继承AbstractGatewayFilterFactory2.仿照AddRequestHeaderGatewayFilterFactory Spring Cloud Alibaba Gateway验证token 基础搭建…...

运算符 - Go语言从入门到实战

运算符 - Go语言从入门到实战 算术运算符 假设A变量等于10&#xff0c;B变量等于20。 运算符描述实例相加A B 输出结果 30-相减A - B 输出结果 -10*相乘A * B 输出结果 200/相除B / A 输出结果 2%求余B % A 输出结果 0⾃增A 输出结果 11–⾃减A-- 输出结果 9 特性&#xf…...

jupyterlab开发环境最佳构建方式

文章目录 背景jupyterlab环境构建运行虚拟环境构建以及kernel映射验证总结 背景 从jupyter notebook切换到了jupyter lab. 这里记录一下本地环境的最佳构建方式. jupyter lab 安装在jupyterlab-local的anaconda 虚拟环境中.建立多个其他虚拟环境安装各种python包实现环境隔离,…...

Qt_C++读写NFC标签Ntag支持windows国产linux操作系统

本示例使用的发卡器&#xff1a;Android Linux RFID读写器NFC发卡器WEB可编程NDEF文本/智能海报/-淘宝网 (taobao.com) ntag2标签存储结构说明 #include "mainwindow.h" #include "./ui_mainwindow.h" #include <QDebug> #include "QLibrary&…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...