软考中级软件设计师——数据结构与算法基础学习笔记

news2024/12/30 2:14:59

软考中级软件设计师——数据结构与算法基本概念

    • 什么是数据
    • 数据元素、数据项
    • 数据结构
      • 逻辑结构
      • 物理结构(存储结构)
    • 算法
      • 什么是算法
      • 五个特性
      • 算法效率的度量
        • 时间复杂度
        • 空间复杂度

什么是数据

数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。

数据元素、数据项

数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。一个数据元素可由若干数据项组成,数据项是构成数据元素的不可分割的最小单位
在这里插入图片描述

以一个人的成绩单为例,整体成绩单为一个数据元素,而单科成绩是这个数据元素的数据项。

数据结构

数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
在这里插入图片描述

逻辑结构

在这里插入图片描述
集合:各个元素同属一个集合,别无其他关系
在这里插入图片描述

线性结构:数据元素之间是一对一的关系。除了第一个元素,所有元素都有唯一前驱;除了最后一个元素,所有元素都有唯一后继。
在这里插入图片描述

树形结构:数据元素之间是一对多的关系

在这里插入图片描述

图结构:数据元素之间是多对多的关系

在这里插入图片描述

物理结构(存储结构)

在这里插入图片描述
链式存储指逻辑上相邻的元素在物理位置上可以不相邻,也就是说是有相邻和不相邻两种情况的

算法

在这里插入图片描述

什么是算法

从字面意思上来说,就是用于计算的方法,通过这种方法可以达到预期的计算结果。从专业上来说,算法是一套模型分析的一组可行的,确定的,有穷的规则。简而言之,算法就是一系列的计算步骤,用来将输入数据转化为输出结果。

五个特性

  • 有穷性:一个算法必须总在执行有穷步之后结束,且每一步都可在有穷时间内完成。
  • 确定性:算法中每条指令必须有确切的含义,对于相同的输入只能得出相同的输出
  • 可行性:算法描述中操作都可以通过已经实现的基本运算执行有限次来实现
  • 输入:一个算法有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 来实现)

在这里插入图片描述

空间复杂度 = 递归调用的深度

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

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

相关文章

树莓派提示:error: externally-managed-environment 树莓派安装虚拟环境,树莓派flask报错

错误信息 raspberryraspberrypi:~ $ pip install flask error: externally-managed-environment脳 This environment is externally managed 鈺扳攢> To install Python packages system-wide, try apt install python3-xyz, where xyz is the package you are trying to i…

C语言 | Leetcode C语言接雨水II

题目&#xff1a; 题解&#xff1a; typedef struct{int row;int column;int height; } Element;struct Pri_Queue; typedef struct Pri_Queue *P_Pri_Queue; typedef Element Datatype;struct Pri_Queue{int n;Datatype *pri_qu; };/*优先队列插入*/ P_Pri_Queue add_pri_que…

硬件工程师笔试面试——开关

目录 11、开关 11.1 基础 开关原理图 开关实物图 11.1.1 概念 11.1.2 常见的开关类型及其应用 11.2 相关问题 11.2.1 开关的工作原理是什么? 11.2.2 在设计一个电子系统时,如何选择最适合的开关类型? 11.2.3 不同类型的开关在实际应用中有哪些优势和局限性? 11.…

自己建网站怎么建

自己建立一个网站可能听起来有点复杂&#xff0c;但实际上&#xff0c;有很多简单且免费的方法可以实现。下面将介绍一些基本步骤&#xff0c;帮助你开始自己建立一个网站。 首先&#xff0c;你需要明确你的网站目的是什么。是个人博客、商业网站&#xff0c;还是其他类型的网…

设计模式 组合模式(Composite Pattern)

组合模式简绍 组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端可以用一致的方式处理单个对象和组合对象。这样&#xff0c;可以在不知道对象具体类型的条…

如何在webots中搭建一个履带机器人

前期准备 下载webotswebots基本知识 a. 官方文档:Webots documentation: Track b. B站教程:webots-超详细入门教程(2020)_哔哩哔哩_bilibili搭建流程 搭建履带机器人主要使用到了webots中的track节点,这个节点是专门用来定义履带的相关属性,模拟履带运动的 首先,创建一个…

MyBatis操作数据库-XML实现

目录 1.MyBatis的简单介绍 2.MyBatis操作数据库的步骤 2.1 添加依赖 2.2 配置文件 2.3 写持久层代码 2.4 方法测试 3.MyBatis操作数据库(增删查改) 3.1 CRUD标签 3.2 参数传递 3.3 Insert-新增 3.4 Delete-删除 3.5 Update-修改 3.6 Select-查询(映射问题) 1.MyB…

PAT甲级-1055 The World‘s Richest

题目 题目大意 输入给出富人的总数以及富人的姓名、年龄、财富&#xff0c;接下来的k行给出需要排序的个数&#xff0c;每个排序要求输出m个富人&#xff0c;并且限制了年龄段&#xff0c;[Amin, Amax]。要求输出所有的排序。如果满足年龄段的人数为0&#xff0c;就输出None。…

VSCode 离线安装中文语言包

1.插件市场 Extensions for Visual Studio family of products | Visual Studio Marketplace 输入&#xff1a; language 在version history里面下载相应的版本&#xff0c;若没有就下载最新的 在下面安装 安装完重启就可以了。 可能会提示的失败&#xff1a; Unable to ins…

整数二分算法和浮点数二分算法

整数二分算法和浮点数二分算法 二分 现实中运用到二分的就是猜数字的游戏 假如有A同学说B同学所说数的大小&#xff0c;B同学要在1~100中间猜中数字65&#xff0c;当B同学每次说的数都是范围的一半时这就算是一个二分查找的过程 二分查找的前提是这个数字序列要有单调性 基…

浅谈树形结构——特殊的树——二叉树

文章目录 一、什么是二叉树&#xff1f;二、二叉树的特点三、二叉树的性质四、两种特殊的二叉树4.1、满二叉树4.2、完全二叉树 五、一些关于二叉树特性的习题六、二叉树的存储[代码实现]6.1、链式存储6.2、顺序存储 七、二叉树的遍历7.1、关于二叉树遍历的选择题练习 一、什么是…

Linux系统终端中文件权限的10位字符是什么意思

Linux操作系统终端长格式显示的文件 在Linux操作系统终端中用文件长格式命令ls -l显示文件&#xff0c;如上图。第一列10个字符表示的含义如下&#xff1a; drwxrwxrwx 第一个字符是表示该文件的类型&#xff0c;如红色d表示该文件是一个目录&#xff0c;详细内容可以参考我…

ROS 编程入门的介绍

2.1 创建 ROS 功能包 ROS&#xff08;Robot Operating System&#xff09;是一种开源的机器人软件框架&#xff0c;广泛用于机器人开发中。通过使用 ROS&#xff0c;开发者可以轻松创建和管理机器人应用程序。在本节中&#xff0c;我们将介绍如何创建一个 ROS 功能包并实现一些…

高德地图2.0 绘制、编辑多边形覆盖物(电子围栏)

1. 安装 npm i amap/amap-jsapi-loader --save移步&#xff1a;官方文档 2. map组件封装 <script lang"ts" setup> import AMapLoader from amap/amap-jsapi-loader import { onMounted, ref } from vue import { propTypes } from /utils/propTypesdefineO…

【自动驾驶】决策规划算法 | 数学基础(三)直角坐标与自然坐标转换Ⅱ

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

以root用户登陆ubuntu的桌面环境

前言 在学习Linux的时候&#xff0c;经常都需要使用sudo权限来对配置文件进行修改&#xff0c;常用的方法就是用vim编辑器在命令行界面进行修改&#xff0c;比如sudo vim /etc/profile&#xff0c;但我觉得每次都用命令行挺麻烦的&#xff0c;于是&#xff01;&#x1f913;我…

【零散技术】Odoo17通过Controller下载PDF

序言:时间是我们最宝贵的财富,珍惜手上的每个时分 Odoo作为一款开源ERP&#xff0c;拥有极佳的拓展性&#xff0c;Odoo的Controller框架也让它具备了作为微信小程序后端的能力&#xff0c;那么就存在 需要通过小程序来下载PDF的业务情况。 目录 1.功能代码 1.1 manifest 设置 …

neo4j 图数据库使用教程

文章目录 neo4j 图数据库使用教程1&#xff09; 下载2&#xff09;安装3&#xff09; 创建数据4&#xff09;查询数据5&#xff09; 更新数据6&#xff09; 建立索引 neo4j 图数据库使用教程 1&#xff09; 下载 neo4j下载地址 http://dist.neo4j.org/neo4j-community-3.5.2…

【C++前后缀分解】1888. 使二进制字符串字符交替的最少反转次数|2005

本文涉及知识点 C前后缀分解 LeetCode1888. 使二进制字符串字符交替的最少反转次数 给你一个二进制字符串 s 。你可以按任意顺序执行以下两种操作任意次&#xff1a; 类型 1 &#xff1a;删除 字符串 s 的第一个字符并将它 添加 到字符串结尾。 类型 2 &#xff1a;选择 字符…

redis群集三种模式:主从复制、哨兵、集群

redis群集有三种模式 redis群集有三种模式&#xff0c;分别是主从同步/复制、哨兵模式、Cluster&#xff0c;下面会讲解一下三种模式的工作方式&#xff0c;以及如何搭建cluster群集 ●主从复制&#xff1a;主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制…