当前位置: 首页 > 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&…...

Web开发-基础知识扫盲

目录 Web 服务器Web 服务器例子 MVC架构Web 项目运行过程负载均衡和反向代理持久化Java对象JPA Web 服务器 Web 服务器是一种计算机程序&#xff0c;它通过 HTTP 协议接收和响应客户端发送的请求。Web 服务器将 HTML、CSS、JavaScript 和其他资源文件发送给客户端&#xff0c;…...

SpringMVC 学习(四)RestFul 风格

5. RestFul 风格 5.1 简介 概念 Restful就是一个资源定位及资源操作的风格。不是标准也不是协议&#xff0c;只是一种风格。基于这个风格设计的软件可以更简洁&#xff0c;更有层次&#xff0c;更易于实现缓存等机制。 功能 资源&#xff1a;互联网所有的事物都可以被抽象为…...

消息中间件相关知识

1、概述 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能&#xff0c;成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件&#xff0c;如老牌的ActiveMQ、RabbitMQ&#xff0c;炙手可热的Kafka…...

JackJson多态

JsonTypeInfo 处理多态、序列化对象类型_赵丙双的博客-CSDN博客 JsonTypeInfo实现jackson的多态解析_MonkeyKing_sunyuhua的博客-CSDN博客 Java Jackson JsonTypeInfo 多态类型处理 - 简书 JsonTypeInfo 逻辑名称 JsonSubTypes、JsonTypeName_赵丙双的博客-CSDN博客...

孟晚舟最新发声!华为吹响人工智能的号角,发布“全面智能化”战略部署

原创 | 文 BFT机器人 1、华为孟晚舟新发声&#xff0c;华为发布“全面智能化”战略 上周三&#xff08;9月30号&#xff09;上午&#xff0c;华为全联接大会2023正式在上海举行&#xff0c;作为华为副董事长、轮值董事长、CFO的孟晚舟代表华为再次发声&#xff01;在演讲上&am…...

open62541开发:添加sqlite3 历史数据库

历史数据库在OPCUA 应用中十分重要&#xff0c;例如OPCUA 网关和OPCUA 汇聚服务器中都需要历史数据库功能。但是open62541 协议栈中仅包含了基于内存的历史数据库&#xff0c;在实际应用中是不够的。本博文讨论open62541 中添加sqlite3 为基础的历史数据库若干问题。 借鉴 Gi…...

美国零售电商平台Target,值得入驻吗?如何入驻?

Target 是美国最大的零售商之一&#xff0c;在品牌出海为大势所趋的背景下&#xff0c;它在北美电商中的地位节节攀升。Target 商店在众多垂直领域提供各种价格实惠的自有品牌&#xff0c;吸引越来越多的跨境商家入驻&#xff0c;如美妆、家居、鞋服、日用百货等&#xff0c;随…...

docker freeswitch mysql驱动相关

1. docker环境 的freeswitch要连mysql数据库 2. centos版本&#xff1a;7.9 3. mysql版本&#xff1a;mysql8.0 4. odbc版本&#xff1a;适用以下命令查询 rpm -qa | grep -E "unixODBC|mysql-connector-odbc" mysql-connector-odbc-5.2.5-8.el7.x86_64 unixODB…...

Chrome iframe 跨域失败

原因&#xff1a; Chrome 稳定版禁用 document.domain setter 解决方案&#xff08;4种&#xff09;&#xff1a; 1 使用低版本Chrome 缺点&#xff1a;无法保证用户浏览器版本。 2 浏览器设置&#xff1a; 浏览器地址栏输入 chrome://flags/#origin-agent-cluster-default然…...

【Vue】vue-cli一站式搭建SPA项目

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Vue快速入门》。&#x1f3af;&#x1f3af; &…...