软考中级软件设计师——数据结构与算法基础学习笔记
软考中级软件设计师——数据结构与算法基本概念
- 什么是数据
- 数据元素、数据项
- 数据结构
- 逻辑结构
- 物理结构(存储结构)
- 算法
- 什么是算法
- 五个特性
- 算法效率的度量
- 时间复杂度
- 空间复杂度
什么是数据
数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。
数据元素、数据项
数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。一个数据元素可由若干数据项组成,数据项是构成数据元素的不可分割的最小单位。
以一个人的成绩单为例,整体成绩单为一个数据元素,而单科成绩是这个数据元素的数据项。
数据结构
数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
逻辑结构
集合:各个元素同属一个集合,别无其他关系
线性结构:数据元素之间是一对一的关系。除了第一个元素,所有元素都有唯一前驱;除了最后一个元素,所有元素都有唯一后继。
树形结构:数据元素之间是一对多的关系
图结构:数据元素之间是多对多的关系
物理结构(存储结构)
链式存储指逻辑上相邻的元素在物理位置上可以不相邻,也就是说是有相邻和不相邻两种情况的
算法
什么是算法
从字面意思上来说,就是用于计算的方法,通过这种方法可以达到预期的计算结果。从专业上来说,算法是一套模型分析的一组可行的,确定的,有穷的规则。简而言之,算法就是一系列的计算步骤,用来将输入数据转化为输出结果。
五个特性
- 有穷性:一个算法必须总在执行有穷步之后结束,且每一步都可在有穷时间内完成。
- 确定性:算法中每条指令必须有确切的含义,对于相同的输入只能得出相同的输出
- 可行性:算法描述中操作都可以通过已经实现的基本运算执行有限次来实现
- 输入:一个算法有0个或多个输入,这些输入取自于某个特定的对象的集合
- 输出:一个算法有一个或多个输出,这些输出是与输入有着某种特定关系的量
算法效率的度量
时间复杂度和空间复杂度通常用大O表示法。
大O表示法:使用O(f(n))来表示时间复杂度,其中n是输入规模(例如数组的长度、图的节点数等),f(n)是一个关于n的函数。大O表示法关注的是随着n的增长,f(n)的增长趋势,即忽略掉常数项和低阶项。
时间复杂度
常见的时间复杂度类型及计算示例
①常数时间复杂度 O (1)
当算法的执行时间不依赖于输入规模时,时间复杂度为 O (1)。例如,访问数组中的一个特定元素:在大多数编程语言中,假设存在一个数组arr,访问arr[3](这里 3 是一个固定的索引),无论数组arr的长度是多少,这个操作都只需要一次查找就能完成。
②线性时间复杂度 O (n)
如果算法的执行时间与输入规模 n 成线性关系,那么时间复杂度为 O (n)。例如,遍历一个数组
int arr[5] = {1,2,3,4,5};for(int i = 0;i < 5;i ++){cout << arr[i] << ' ';}
这里,数组arr的长度为 n(在这个例子中 n = 5),循环会执行 n 次,随着数组长度 n 的增加,操作次数也会线性增加。
③平方时间复杂度 O (n²)
当存在嵌套循环,且内外层循环都与输入规模 n 有关时,通常会得到 O (n²) 的时间复杂度。例如,一个简单的冒泡排序算法:
vector<int> arr = {5, 4, 3, 2, 1}; int n = arr.size(); // 冒泡排序 for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { // 交换元素 int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } }
④对数时间复杂度 O (log n)
当算法每次迭代都将问题规模减半(或者按照某个比例缩小)时,时间复杂度通常为 O (log n)。例如,二分查找算法。在每次循环中,搜索范围都会减半,所以时间复杂度是 O (log n),这里 n 是数组的长度。
⑤线性对数时间复杂度 O (n log n)
这是一种常见于分治算法(如快速排序和归并排序的平均情况)的时间复杂度。例如,归并排序算法:
归并排序将数组不断地分成两半,对每一半进行排序(这部分的时间复杂度是 O (log n),因为每次划分都是将规模减半),然后合并这些子数组(合并操作的时间复杂度是 O (n),因为需要遍历所有元素来合并)。总体时间复杂度就是 O (n log n)。
空间复杂度
常见的空间复杂度类型
①常数空间复杂度 O (1)
当算法运行过程中所占用的额外空间不随输入规模的变化而变化时,空间复杂度为 O (1)。例如,交换两个变量的值。
②线性空间复杂度 O (n)
如果算法运行时所需的额外空间与输入规模 n 成线性关系,那么空间复杂度为 O (n)。例如,创建一个长度为 n 的数组,创建的数组的大小取决于输入规模 n,随着 n 的增加,所需的额外空间也会线性增加。
③平方空间复杂度 O (n²)
当算法需要创建一个二维数组,且二维数组的行和列都与输入规模 n 有关时,通常会得到 O (n²) 的空间复杂度。例如,创建一个 n×n 的二维矩阵。创建的二维矩阵包含 n * n 个元素,随着 n 的增加,所需的额外空间会以 n² 的量级增加。
④对数空间复杂度 O (log n)
在一些递归算法中,如果递归的深度与输入规模 n 的对数成正比,那么空间复杂度为 O (log n)。例如,计算一个数 n 的二进制表示中的最高位 1 的位置(可以通过不断将 n 除以 2 来实现)
空间复杂度 = 递归调用的深度
相关文章:

软考中级软件设计师——数据结构与算法基础学习笔记
软考中级软件设计师——数据结构与算法基本概念 什么是数据数据元素、数据项数据结构逻辑结构物理结构(存储结构) 算法什么是算法五个特性算法效率的度量时间复杂度空间复杂度 什么是数据 数据是信息的载体,是描述客观事物属性的数、字符及所…...

虚幻引擎 | (类恐鬼症)玩家和NPC语音聊天(中)
虚幻引擎 | (类恐鬼症)玩家和NPC语音聊天-CSDN博客 上篇偏重实现步骤,中篇偏重理解校准和降低延迟,下篇加入上下文背景array和设置口音 TTS通用参数 ————————————————————————————————————…...

整流电路的有源逆变工作状态
目录 1. 逆变的概念 2. 有源逆变的条件 3. 电流电路的概念 4. 产生逆变的条件 5. 三相桥式全控整流电路的有源逆变工作状态 6. 逆变角的概念 7. 逆变失败的原因 8. 最小逆变角的限制 整流电路的有源逆变状态是指通过控制整流器,使其将直流电源的能量反向送回…...

Android 签名、空包签名 、jarsigner、apksigner
jarsigner是JDK提供的针对jar包签名的通用工具, 位于JDK/bin/jarsigner.exe apksigner是Google官方提供的针对Android apk签名及验证的专用工具, 位于Android SDK/build-tools/SDK版本/apksigner.bat jarsigner: jarsigner签名空包执行的命令: jar…...
java基础(小技巧)
文章目录 一、日志输出二、字符串拼接三、日期比较四、常用注解五、Lombok的原理 提示:以下是本篇文章正文内容,下面案例可供参考 一、日志输出 之前使用的方式。在要使用的类里面定义日志类: private static Logger logger LoggerFactory…...

Android Studio 安装配置教程(Windows最详细版)
目录 前言 Android Studio 下载 Android Studio 安装 Android Studio 使用 一、创建默认项目(Compose) 二、创建常规项目 三、使用ViewBinding 四、查看Gradle版本、SDK版本、JDK版本 ① Gradle版本 ② SDK版本 ③ JDK版本 前言 Android开发…...
Cesium绘制可编辑线
Cesium 第一章 绘制可编辑线 Screen-2024-09-17-202059的副本 文章目录 Cesium一、绘制线二、编辑线三、使用 一、绘制线 1、方法 //场景相机控制viewer.scene.screenSpaceCameraController.enableRotate false; //cesium相机控制 绘制和编辑时 禁止转动场景// 鼠标样式修改…...

【算法】差分思想:强大的算法技巧
📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…...

微软开源项目 Detours 详细介绍与使用实例分享
目录 1、Detours概述 2、Detours功能特性 3、Detours工作原理 4、Detours应用场景 5、Detours兼容性 6、Detours具体使用方法 7、Detours使用实例 - 使用Detours拦截系统库中的UnhandledExceptionFilter接口,实现对程序异常的拦截 C++软件异常排查从入门到精通系列教程…...
Numba基础
1. Numba 基础 1.1 什么是 Numba? Numba 是一个 JIT 编译器,用于加速数值计算。它通过即时编译技术,将 Python 代码在运行时编译为机器代码,极大地提升执行速度,特别适合循环和矩阵操作等密集型计算。 2. Numba 基本…...

[JAVA]介绍怎样在Java中通过字节字符流实现文件读取与写入
一,初识File类及其常用方法 File类是java.io包下代表与平台无关的文件和目录,程序中操作文件和目录,都可以通过File类来完成。 通过这个File对象,可以进行一系列与文件相关的操作,比如判断文件是否存在,获…...
oracle停止当前运行的JOB或kill会话
在Oracle中,可以使用DBA_SCHEDULER_JOBS视图来查找当前正在运行的作业(job),并使用DBMS_SCHEDULER.STOP_JOB过程来停止它们 SELECT JOB_NAME, STATE FROM DBA_SCHEDULER_JOBS WHERE STATE RUNNING; SELECT * FROM DBA_SCHEDULE…...

SpringBoot 消息队列RabbitMQ 消息可靠性 数据持久化 与 LazyQueue
介绍 在默认情况下,RabbitMQ会将接收到的信息保存在内存中以降低消息收发的延迟 一旦MO宕机,内存中的消息会丢失内存空间有限,当消费者故障或处理过慢时,会导致消息积压,引发MQ阻塞 在消息队列运行的过程中…...

CLIP论文中关键信息记录
由于clip论文过长,一直无法完整的阅读该论文,故而抽取论文中的关键信息进行记录。主要记录clip是如何实现的的(提出背景、训练数据、设计模式、训练超参数、prompt的作用),clip的能力(clip的模型版本、clip…...

sshj使用代理连接服务器
之前我是用jsch连接服务器的,但是没办法使用私钥连接,搜了一下似乎是不支持新版的SSH-rsa,并且jsch很久没更新了,java - "com.jcraft.jsch.JSchException: Auth fail" with working passwords - Stack Overflow 没办法…...

【Leetcode:1184. 公交站间的距离 + 模拟】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...
VRRP 笔记
一、概念: vrrp:Virtual Router Redundancy Protocol 虚拟路由冗余协议,当网关发生故障时,进行主备切换,保证业务连续性 把多台物理机的网关虚拟成一台Virtual Router,称为 VRID VIP:虚拟IP VM…...
【洛谷】P3743 小鸟的设备 的题解
【洛谷】P3743 小鸟的设备 的题解 题目传送门 题解 水一道二分 qaq 刚开始考虑的是动态规划,但是动态规划并不能维护题目所要求的东西。所以我们将思路转向另一种求最值问题的方法:二分答案。 首先,如果一个设备在 t t t 的时间内消耗的…...
算法面经手撕系列(2)--手撕BatchNormlization
BatchNormlization BatchNormlization的编码流程: init阶段初始化 C i n C_in Cin大小的scale向量和shift向量,同时初始化相同大小的滑动均值向量和滑动标准差向量;forward时沿着非channel维度计算均值、有偏方差依据得到均值和有偏方差进…...

mysql-搭建主从复制
文章目录 1、准备主服务器2、准备从服务器3、主库配置3.1、创建MySQL主服务器配置文件: 4、从库配置5、搭建主从&测试5.1、使用命令行登录MySQL主服务器5.2、主机中查询master状态:5.3、从机中查询slave状态:5.4、主机中创建slave用户&am…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...