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

数据结构基础(一)

文章目录

  • 1 数据结构基础
    • 1.1 什么是程序?
    • 1.2 数据、数据元素、数据项、数据对象
    • 1.3 基本的逻辑结构
  • 2 算法效率
    • 2.1 时间复杂度
      • 2.1.1 循环执行次数
      • 2.1.2 大O(n)表示法
    • 2.2 空间复杂度

1 数据结构基础

1.1 什么是程序?

​ 程序 = 数据结构 + 算法

  • 数据结构:数据结构就是数据的 “收纳盒”,比如书包的不同夹层帮你快速找到课本、文具。数据结构就是用特定的整理方式,让计算机能快速的存取需要的数据。合理的数据结构能够有效提升数据存取的效率,为算法的高效执行提供基础。
  • 算法:算法就是解决问题的"操作手册",就像菜谱分步教你怎么做菜一样,它用明确的步骤告诉计算机该怎么处理数据、解决问题。所以,算法就是解决问题的具体方法、电脑运算的具体过程。

1.2 数据、数据元素、数据项、数据对象

  • 数据:所有的信息,例如文本、图像、音频、视频等,计算机都会用 “二进制语言”(0和1的组合)记录下来。计算机用 0101 这样的数字记录所有的数据。所以,数据是客观事物的(二进制)符号表示。
  • 数据元素:是数据的基本单位,例如一张图片、一段音频等,在数据结构中,就是链表中的一个节点、树中的一个节点、图中的一个节点。
  • 数据项:是组成数据元素的、有独立含义、不可分割的最小单位,例如一段音频的音高、音量、时间长度等,都是数据项。
  • 数据对象:是有相同性质的数据元素的集合,是数据的一个子集,例如相似的图片,相似风格的音乐等。

​ 举个栗子,以一个学生管理系统为例,将所有学生的信息用 0101 的二进制形式记录下来,这就是数据。而每一个学生就是一个数据元素,数据项就是学生的各种属性,例如学号、姓名、性别等,数据对象就是一堆有相同性质的学生,比如可以按照性别将数据分为男同学数据和女同学数据两种数据对象,所以当数据对象的分类标准不同时,分类结果也就不同了。

​ PS:数据、数据元素、数据项、数据对象这些概念,如果你是需要考试的同学,一定要搞清楚,但在实际的应用中,意义并不大,不必深纠。

1.3 基本的逻辑结构

​ 首先,逻辑结构和存储结构是截然不同的两个概念:

  • 逻辑结构:是指数据元素之间的逻辑关系。
  • 存储结构:是指数据在计算机中的存储形式,即物理上的存储结构。

基本的逻辑结构有以下四种:

在这里插入图片描述

基本的存储结构有以下两种:

在这里插入图片描述

2 算法效率

2.1 时间复杂度

​ 时间复杂度用来表示算法运行时间的长短,用来定性的描述程序的运行时间。

2.1.1 循环执行次数

(1)

for (int i=0; i<n; i++)
{printf("%d\n", i);
}
//该代码段内,for() 语句将被执行 n+1 次,而不是 n 次,当 i=n-1 时,循环正常运行,当 i=n 时,for() 仍需要判断 i<n 条件是否成立,不成立,跳出 for() 循环,最后这一次判断导致 for() 语句的执行次数是 n+1 次,而不是 n 次。//printf()只有在符合 i<n 条件时,才会执行,所以执行次数是 n 次。

(2)

for (int i=0; i<n; i++)
{   for (int j=0; j<n; j++){printf("i:%d,j:%d\n", i ,j);}  
} 
//该代码段内,for()外部循环语句将执行 n+1 次。for()内部循环将被执行 n(n+1) 次。//printf()将执行 n*n 次。

(3)

for (i=1; i<=n; i++)
{   for (j=1; j<=i; j++){for (k=1; k<=j; k++)   {printf("i:%d, j:%d, k:%d \n", i, j , k);  }}  
} 
//该代码段内,从内到外思考 printf() 的循环次数,内部第一层循环执行 j 次,第二层循环,执行次数是 j 分别取值 0~i 的求和。可得 printf() 的执行次数为:

∑ i = 1 i = n ∑ j = 1 j = i j = 1 / 6 n ( n + 1 ) ( 2 n + 1 ) \sum_{i=1}^{i=n}\sum_{j=1}^{j=i} j = 1/6 n(n+1)(2n+1) i=1i=nj=1j=ij=1/6n(n+1)(2n+1)

​ 这里有些小伙伴会疑惑,为什么就成累加了呢?我们只考虑内部的 j 和 k 两层循环,带入具体的值想一下:

​ 假设 j 的最大值是 5,j 会从 1 一直累加到 5 ,那么 j = 1 时,k <= 1,此时 printf 会被执行一次,之后内部循环就不满足循环条件退出了,而外部循环中的 j 就被累加到了 2 ,此时 k <= 2,此时printf会被执行两次,然后跳出循环,以此类推,执行的次数就是 1+ 2 + 3+ 4 + 5。

(4)

for (i=0; i<n; i=i*2)
{printf("Hello World\n");
}
//该代码段内,i=i*2 我们设执行次数为k,所以跳出循环的判断条件可以简化表示为:

2 k − 1 > n 时跳出循环,即 k = l o g 2 ( n + 1 ) 时 2^k-1 > n 时跳出循环,即 k = log_2 (n+1)时 2k1>n时跳出循环,即k=log2(n+1)

2.1.2 大O(n)表示法

(1)对于以上四个循环例子,当 n 趋于无限大时,执行次数的系数和常数项可以忽略不计,因此,以上四个例子的 printf() 语句的时间复杂度用 O(n) 可以表示为:

  1. O ( n ) O(n) O(n)

  2. O ( n 2 ) O(n^2) O(n2)

  3. O ( n 3 ) O(n^3) O(n3)

  4. O ( l o g 2 ( n ) ) O(log_2 (n)) O(log2(n))

简单来看,多项式中有多少 n 相乘,复杂度就是 n 的几次方。

(2)常见的时间复杂度,以及当 n 区域无穷大时的效率:

在这里插入图片描述

(3)在用 O(n) 描述算法的时间复杂度时,我们往往一般说的是平均时间复杂度,除此之外,我们还需要考虑,最差时间复杂度,和最好时间复杂度,具体问题具体分析,才能写出更好的程序。

2.2 空间复杂度

​ 即算法占用内存空间的大小。与时间复杂度不同,我们通常只关注最差空间复杂度。因为内存空间是硬性要求,我们必须确保所有输入的数据都有足够的内存空间。空间复杂度的推算方法与时间复杂度大致相同,只需将统计对象从 “操作数量” 转为 “使用空间大小” 我们举几个例子。

  1. O ( 1 ) :与循环无关的变量 O(1):与循环无关的变量 O(1):与循环无关的变量

  2. O ( l o g 2 ( n ) ) :例如递归树,分治算法 O(log_2 (n)):例如递归树,分治算法 O(log2(n)):例如递归树,分治算法

  3. O ( n ) :例如数组,链表,栈,队列 O(n):例如数组,链表,栈,队列 O(n):例如数组,链表,栈,队列

  4. O ( n 2 ) :例如二维数组 O(n^2):例如二维数组 O(n2):例如二维数组

  5. O ( l o g 2 ( n ) ) :例如二叉树 O(log_2 (n)):例如二叉树 O(log2(n)):例如二叉树

相关文章:

数据结构基础(一)

文章目录 1 数据结构基础1.1 什么是程序&#xff1f;1.2 数据、数据元素、数据项、数据对象1.3 基本的逻辑结构 2 算法效率2.1 时间复杂度2.1.1 循环执行次数2.1.2 大O(n)表示法 2.2 空间复杂度 1 数据结构基础 1.1 什么是程序&#xff1f; ​ 程序 数据结构 &#xff0b; 算…...

⭐算法OJ⭐N-皇后问题 II【回溯剪枝】(C++实现)N-Queens II

⭐算法OJ⭐N-皇后问题【回溯剪枝】&#xff08;C实现&#xff09;N-Queens 问题描述 The n-queens puzzle is the problem of placing n n n queens on an n n n \times n nn chessboard such that no two queens attack each other. Given an integer n, return the num…...

项目管理工具 Maven

目录 1.Maven的概念 1.1​​​​​什么是Maven 1.2什么是依赖管理 1.3什么是项目构建 1.4Maven的应用场景 1.5为什么使用Maven 1.6Maven模型 2.初识Maven 2.1Maven安装 2.1.1安装准备 2.1.2Maven安装目录分析 2.1.3Maven的环境变量 2.2Maven的第一个项目 2.2.1按照约…...

国产编辑器EverEdit - 宏功能介绍

1 宏 1.1 应用场景 宏是一种重复执行简单工作的利器&#xff0c;可以让用户愉快的从繁琐的工作中解放出来&#xff0c;其本质是对键盘和菜单的操作序列的录制&#xff0c;并不会识别文件的内容&#xff0c;属于无差别无脑执行。 特别是对一些有规律的重复按键动作&#xff0c;…...

CODEGEN:一种基于多轮对话的大型语言模型编程合成方法

【摘要】 该论文于ICLR 2023会议上发表,标题为“CODEGEN:用于编程的大型语言模型”,由Salesforce Research团队撰写。论文提出的CODEGEN是一个大型语言模型系列,旨在通过自然语言和编程语言数据进行训练,以实现程序合成。以下是论文的主要贡献和关键发现的总结: 核心贡献…...

利用后缀表达式构造表达式二叉树的方法

后缀表达式&#xff08;逆波兰表达式&#xff09;是一种将运算符放在操作数之后的表达式表示法。利用后缀表达式构造表达式二叉树的方法主要依赖于栈结构。 转换步骤 初始化 创建一个空栈。 遍历后缀表达式 对后缀表达式的每个符号依次处理&#xff1a; 遇到操作数 如果当前符…...

深度学习笔记——基础部分

深度学习是一种机器学习的方式&#xff0c;通过模仿人脑吃力信息的方式&#xff0c;使用多层神经网络来学习数据的复杂模式和特征。 深度学习和机器学习的区别&#xff1a; 在机器学习中&#xff0c;特征提取通常需要人工设计和选择&#xff0c;依赖于领域专家的知识来确定哪些…...

“双碳”背景下,企业应该如何提升能源效率?

在当今竞争激烈的市场环境中&#xff0c;企业不仅需要优化成本&#xff0c;还需积极响应国家的能源政策&#xff0c;减少对环境的影响。提升工业能源效率正是实现这一双重目标的关键。中国近年来大力推进“双碳”目标&#xff08;碳达峰、碳中和&#xff09;&#xff0c;并出台…...

BambuStudio学习笔记:MarchingSquares类

# Marching Squares算法头文件分析## 文件结构概览 cpp #ifndef MARCHINGSQUARES_HPP #define MARCHINGSQUARES_HPP // 包含标准库头文件 // 命名空间定义 namespace marchsq {// 基础数据结构struct Coord;using Ring std::vector<Coord>;// 栅格适配器模板template<…...

重生之我在 CSDN 学习 KMP 算法

深入理解 KMP 算法&#xff1a;高效字符串匹配的利器 一、KMP 算法的由来及其解决的问题 在计算机科学领域&#xff0c;字符串处理是一项极为常见且基础的任务。其中&#xff0c;字符串匹配问题更是频繁出现&#xff0c;例如在文本编辑器中查找特定单词、在生物信息学中搜索 D…...

文献学习——考虑混合储能系统选择的基于改进蜂群算法的热电联产微网多目标经济优化调度

摘要&#xff1a;在考虑混合储能系统模型选择的基础上&#xff0c;基于改进的人工蜂群算法&#xff08;ABC&#xff09;&#xff0c;建立了冷热电联产微电网经济优化的多目标调度模型。为了对以往研究中的单目标模型进行升级&#xff0c;将模型的优化目标设定为微电网的日发电调…...

GPTQ - 生成式预训练 Transformer 的精确训练后压缩

GPTQ - 生成式预训练 Transformer 的精确训练后压缩 flyfish 曾经是 https://github.com/AutoGPTQ/AutoGPTQ 现在是https://github.com/ModelCloud/GPTQModel 对应论文是 《Accurate Post-Training Quantization for Generative Pre-trained Transformers》 生成式预训练Tr…...

nnMamba:基于状态空间模型的3D生物医学图像分割、分类和地标检测

摘要 本文提出了一种基于状态空间模型&#xff08;SSMs&#xff09;的创新架构——nnMamba&#xff0c;用于解决3D生物医学图像分割、分类及地标检测任务中的长距离依赖建模难题。nnMamba结合了卷积神经网络&#xff08;CNN&#xff09;的局部特征提取能力与SSMs的全局上下文建…...

安科瑞新能源充电桩解决方案:驱动绿色未来,赋能智慧能源

安科瑞顾强 引言 在“双碳”目标与新能源汽车产业高速发展的双重驱动下&#xff0c;充电基础设施正成为能源转型的核心环节。安科瑞电气股份有限公司凭借在电力监控与能效管理领域20余年的技术积淀&#xff0c;推出新一代新能源充电桩解决方案&#xff0c;以智能化、高兼容性…...

使用开源OPUS-MT模型进行文本翻译(python)

1. 环境准备 pip install transformers 2. 下载机器翻译模型&#xff1a; 2.1 代码从hugging face平台下载 from transformers import MarianMTModel, MarianTokenizer# 指定模型名称 model_name "Helsinki-NLP/opus-mt-zh-en" # 中译英模型# 下载并保存分词器到…...

通过 Docker openssl 容器生成生成Nginx证书文件

使用 alpine/openssl 镜像生成证书 1. 拉取容器 [rootlocalhost ~]# docker run --rm alpine/openssl version OpenSSL 3.3.3 11 Feb 2025 (Library: OpenSSL 3.3.3 11 Feb 2025)2. 运行 alpine/openssl 生成证书&#xff08;Nginx&#xff09; # 生成1个.key私钥文件&#…...

Elastic如何获取当前系统时间

文章目录 1. 使用 _ingest.timestamp 在 Ingest Pipeline 中获取当前时间2. 使用 Painless Script 获取当前时间3. 使用 now 关键字在查询中获取当前时间4. 使用 date 类型字段的默认值5. 使用 Kibana 的 Dev Tools 查看当前时间6. 使用 date 聚合获取当前时间7. 使用 Elastics…...

MLT媒体程序框架03:滤镜——loudness

EBU R.128协议 引用链接 EBU的全称为European Broadcasting Union &#xff0c;既欧洲广播联盟&#xff0c;为欧洲与北非各广播业者&#xff08;包含广播电台与电视台&#xff09;的合作组织&#xff0c;成立于1950年2月12日,有五十多个正式加盟国,总部位于瑞士日内瓦,目前中国…...

jenkins配置连接k8s集群

jenkins配置连接k8s集群 前言 我这边jenkins是在一个服务器里面&#xff0c;k8s集群在其他服务器&#xff0c;实现连接 首先jenkins下载有k8s插件 进入配置页面 获取k8s-api-server地址 对应k8s服务器执行 kubectl config view --minify -o jsonpath{.clusters[0].cluste…...

如何选择缓存模式?

如何选择缓存模式 当一个系统引入缓存后&#xff0c;最大的挑战之一便是如何确保缓存与后端数据库的一致性。目前&#xff0c;常见的解决方案主要有Cache Aside、Read/Write Throught和Write Back这三种缓存更新策略。 Read/Write Throught策略 读操作方面&#xff0c;如果缓…...

机器学习常见面试题

常见基模型 1. 线性模型&#xff08;Linear Models&#xff09; 特点&#xff1a;通过线性组合特征进行预测&#xff0c;适合处理线性关系。常见类型&#xff1a; 线性回归&#xff08;Linear Regression&#xff09;逻辑回归&#xff08;Logistic Regression&#xff09;岭回…...

网络安全配置截图 网络安全i

网络安全概念及规范 1.网络安全定义 网络安全的概述和发展历史 网络安全 广义的网络安全&#xff1a;Cyber Security&#xff08;网络空间安全&#xff09; 网络空间有独立且相互依存的信息基础设施和网络组成&#xff0c;包括互联网、电信网、计算机系统、嵌入式处理器和控…...

k8s概念及k8s集群部署(Centos7)

Centos7部署k8s集群 部署之前&#xff0c;先简单说下k8s是个啥&#xff1a; 一、k8s简介&#xff1a; k8s&#xff0c;全称&#xff1a;kubernetes&#xff0c;它可以看作是一个分布式系统支撑平台。k8s的作用&#xff1a; 1、故障自愈&#xff1a; k8s这个玩意可以监控容器…...

Manus详细介绍,Manus核心能力介绍

文章目录 前言Manus产品定位与核心理念:Manus产品特性与未来体验战略:Manus商业价值与创新指标:Manus技术特点与竞争优势:Manus用户反馈与展望:Manus市场竞争优势与团队战略:Manus深度总结与启发: 前言 这是一篇关于Manus智能体产品的用户体验评价报告&#xff0c;主要介绍了M…...

Apache XTable:在数据湖仓一体中推进数据互作性

Apache XTable 通过以多种开放表格式提供对数据的访问&#xff0c;在增强互作性方面迈出了一大步。移动数据很困难&#xff0c;在过去&#xff0c;这意味着在为数据湖仓一体选择开放表格式时&#xff0c;您被锁定在该选择中。一个令人兴奋的项目当在数据堆栈的这一层引入互作性…...

Java直通车系列14【Spring MVC】(深入学习 Controller 编写)

目录 基本概念 编写 Controller 的步骤和要点 1. 定义 Controller 类 2. 映射请求 3. 处理请求参数 4. 调用业务逻辑 5. 返回响应 场景示例 1. 简单的 Hello World 示例 2. 处理路径变量和请求参数 3. 处理表单提交 4. 处理 JSON 数据 5. 异常处理 基本概念 Cont…...

36-Openwrt wifi命令工具iwconfig、iwinfo、iwpriv、iwlist

增对wifi的调试命令有很多,这边列出我们常用的命令提供参考,方便查看信息定位问题。 1、iwconfig 查看当前 WIFI 的工作信道以及工作带宽模式: root@openwrt:/# iwconfig ra0 ra0 mt7603e ESSID:"openwrt" Mode:Managed Channel:8 Access Point: DC:4B…...

tauri加载网页处理点击a链接默认浏览器打开问题

添加click事件&#xff0c;当点击了a标签&#xff0c;就阻止默认事件&#xff0c;然后自己处理&#xff0c;在自己窗口中打开这个页面。将这个js注入到页面中就可以了 const hookClick (e) > {console.log(hookClick, e)e.preventDefault()const origin e.target.closest…...

openharmony 软总线-设备发现流程

6.1 设备发现流程 6.1.1 Wi-Fi设备发现 6.1.1.1 Wi-Fi设备发现流程 Wi-Fi设备在出厂状态或者恢复出厂状态下&#xff0c;设备上电默认开启SoftAP模式&#xff0c;SoftAP的工作信道在1&#xff0c;6&#xff0c;11中随机选择&#xff0c;SoftAP的Beacon消息中携带的SSID eleme…...

大白话CSS 优先级计算规则的详细推导与示例

大白话CSS 优先级计算规则的详细推导与示例 答题思路 引入概念&#xff1a;先通俗地解释什么是 CSS 优先级&#xff0c;让读者明白为什么要有优先级规则&#xff0c;即当多个 CSS 样式规则作用于同一个元素时&#xff0c;需要确定哪个规则起作用。介绍优先级的分类&#xff1…...