【学习笔记】数据结构(一)

基本概念和术语

在这里插入图片描述

👉数据:所有能被输入到计算机中,且被计算机处理的符号的集合;

  • 是计算机操作对象的总称;
  • 是计算机处理信息的载体;
  • 是信息的某一种特定的符号表示形式
  • 包括数值型数据、非数值型数据

👉数据元素/元素/记录/结点/顶点:数据中的一个”个体“,数据结构的基本单位

  • 数据元素的映象是 二进制位(bit)的位串

👉数据项:数据结构的最小单位,数据元素是数据项的集合,不可分割的最小单位

例如:一本书的书目信息为一个数据元素,而书目信息中的每一项(如书名、作者名等)为 一个数据项。

👉数据对象:是性质相同的数据元素的集合,是数据的一个子集

👉数据结构:带结构的数据元素的集合(结构:数据元素之间存在的一个约束关系)

例如:一维数组的次序关系:{<ai ai+1>|i = 1,2,3,4,5}

  • 逻辑结构分类

    • 线性结构

    • 树形结构

    • 图状结构

    • 集合结构

  • 形式定义 - 逻辑结构

    • 数据结构是一个二元组 Data_Structures = (D , S) D是数据元素的有限集,S是D上关系的有限集
  • 存储结构/物理结构:逻辑结构在存储器中的映象

    • 关系的映象方法 - 有序对<x,y>的表示方法:

      • 顺序映象: 以存储位置的相邻表示后继关系

        ​ 以数据元素在存储器之间一个固定的相对位置的关系来表示数据元素的关系

        ​ y的存储位置和x的存储位置之间差一个常量C,C是一个隐含值,整个存储结构只含 数据元素本身的信息

      • 链式映象: 以附加信息(指针)表示后继关系

        ​ x的存储映象是一个节点,这个节点包含了两部分信息,一部分是数据元素x的映象, 另一部分是指向后继元素的指针

      • 索引存储结构:在存储结点信息的同时,还建立附加的索引表 例如:通讯录

      • 散列存储结构:根据结点的关键字直接计算出该节点的存储地址

👉数据类型:在高级程序语言编写中,每个类型明显或隐含的规定了在程序执行期间,他的变量或表达式允许 取值的范围以及允许进行的操作;是一个值的集合和定义在此集合上的一组操作的总称

👉抽象数据类型(ADT):指一个数学模型以及定义在此数学模型上的一组操作

  • 两个特征:

    • 数据抽象 - 用ADT描述实体时,强调本质特征、所能完成实现的功能、外界使用的方法
    • 数据封装 - 实体的外部特性和内部实现细节分离,并且对外部用户隐藏其内部实现细节
  • 形式定义——抽象数据类型可用以下三元组表示

    ​ (D,S,P)

    ​ 其中, D是数据对象,S是D上的关系集, P是对D的基本操作集。

  • 定义格式

    ADT 抽象数据类型名{
    	数据对象:<数据对象的定义>
    	数据关系:<数据关系的定义>
    	基本操作:<基本操作的定义>
    }ADT 抽象数据类型名
    
    数据对象、数据关系的定义用伪代码描述
    
    基本操作的定义格式:
    	基本操作名(参数表)
    	初始条件:<初始条件描述>
    	操作结果: <操作结果描述>
    

在这里插入图片描述

👉算法:为了解决某类问题而规定的一个有限长的操作序列。算法是对问题求解的一种描述。

  • 特性:

    • 有穷性

      ​ 对于任意一组合法输入值,在执行有穷步骤之后一定能结束,即算法中的每个步骤都能在有限

      ​ (合理)时间内完成。

    • 确定性

      ​ 每一条指令必须有确切的含义,读者理解时不会产生二义性。

      ​ 并且对同样的输入值,在任何条件下都能得到相同的结果

    • 可行性

      ​ 算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的。

    • 有输入 —— 有零个或多个的输入

    • 有输出 —— 有一个或多个的输出

  • 设计原则

    • 正确性

      ​ a. 程序不 含语法错误;

      ​ b. 程序对于几组输人数据能够得出满足规格说明要求的结果;

      ​ c. 程序对于精心选择的典型、苛刻而带有刁难性的几组输人数据能够得出满足规格说明要求的结 果;

      ​ d. 程序对于一切合法的输入数据都能产生满足规格说明要求的结果。

      ​ 通常以第三层意义上的正确性作为衡量一个算法是否合格的标准

    • 可读性

    • 健壮性

      ​ 输入数据非法时,应返回一个表示错误或者错误性质的值,而不是中断程序执行

    • 高效率和低存储量需求

      • 效率:算法执行时间

        • 效率衡量方法:

          • 事后统计法 - 缺点 必须执行程序、其他因素掩盖算法本质

          • 事前分析估算法

            算法运行时间 = 一个简单操作所需的时间 x 简单操作次数

        • 和算法执行时间相关的因素:(后三条与计算机硬件、软件相关)

          • 算法选用的策略
          • 问题的规模
          • 编写程序的语言
          • 编译程序产生机器代码的质量
          • 计算机执行指令的速度
        • 算法执行的时间是问题规模的函数,称之为是一个特定算法的运行工作量

        • ⭐️时间复杂度:

          ​ - 随着问题规模n的增长,算法执行时间的增长率和f(n)的增长率相同,可记作:

          T(n) = O(f(n)), 称T(n)为算法的(渐进)时间复杂度

          ​ - 算法 = 控制结构 + 原操作(固有数据类型的操作)

          ​ - 算法的执行时间 = ∑原操作(i)的执行次数 * 原操作(i)的执行时间

          ​ 原操作(i)的执行次数 - 指的是语句的频度

          ​ 算法的执行时间和原操作执行次数之和成正比

          #define _CRT_SECURE_NO_WARNINGS 1
          #include <stdio.h>
          #include <stdbool.h>
          
          void bubble_sort(int a[], int n) {
              //最好情况 - 只执行一次 - n-1
          	//最坏情况 - (n-1)*n/2 - O(n^2)
          	int i, j;
          	bool change;
          	int temp;
          	for (i = n - 1, change = true; i > 0 && change; --i) {
          		change = false;
          		for (j = 0; j < i; ++j) {
          			if (a[j] > a[j + 1]) {
          				temp = a[j];
          				a[j] = a[j + 1];
          				a[j + 1] = temp;
          
          				change = true;
          			}
          		}
          	}
          
          }
          
          int main() {
          	int a[] = { 8,7,6,5,4,3,2,1 };
          	int size = sizeof(a) / sizeof(a[0]);
          	bubble_sort(a, size);
          	for (int i = 0; i < size; i++)
          	{
          		printf("%d \n", a[i]);
          	}
          	return 0;
          }
          

          在这里插入图片描述

          O(1) < O(log2n) < O(n) < O(n log2n) < O(n2) < O(n3) < O(nk) < O(2n)

      • 存储量:算法执行过程中所需的最大存储空间

        • ⭐️空间复杂度

          随着问题规模n的增长,算法运行所需存储量的增长率和g(n)的增长率相同,可记作:

          S(n)= O(g(n))

          包含:输入数据所占空间、程序本身所占空间、辅助变量所占空间

          若输入数据所占空间只取决于问题本身和算法无关,只需分析辅助变量所占的额外空间 在这里插入图片描述

参考:

教材:严蔚敏《数据结构》(C语言版).pdf

视频:

https://www.bilibili.com/video/BV1nJ411V7bd?p=10&vd_source=a89593e8d33b31a56b894ca9cad33d33

https://www.bilibili.com/video/BV1Fv4y1f7T1/?p=19&spm_id_from=333.880.my_history.page.click&vd_source=a89593e8d33b31a56b894ca9cad33d33

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

变种水仙花

变种水仙花 题干要求&#xff1a; 变种水仙花数 - Lily Number&#xff1a;把任意的数字&#xff0c;从中间拆分成两个数字&#xff0c;比如1461 可以拆分成&#xff08;1和461&#xff09;,&#xff08;14和61&#xff09;,&#xff08;146和1),如果所有拆分后的乘积之和等于…

干Java的有4年的工作经验;想转行做labview能行吗?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「 Java的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;bVIEW和Java都是软件工具&a…

Golang | Leetcode Golang题解之第120题三角形最小路径和

题目&#xff1a; 题解&#xff1a; func minimumTotal(triangle [][]int) int {n : len(triangle)f : make([]int, n)f[0] triangle[0][0]for i : 1; i < n; i {f[i] f[i - 1] triangle[i][i]for j : i - 1; j > 0; j-- {f[j] min(f[j - 1], f[j]) triangle[i][j]…

【新能源大巴BMS结构与乘用车的区别】

新能源大巴BMS结构与乘用车的区别 这篇文章主要介绍新能源大巴的电池和BMS的结构与乘用车的区别。 主要有&#xff0c;新能源大巴行业、新能源电池系统结构和新能源大巴的BMS系统。 第一部分 新能源大巴行业 其实数数全球的商用车(大巴卡车)&#xff0c;大致的方向还是沿着就…

机器视觉halcon学习——检测斜面两边之间距离的数据稳定性

一个样品的斜面&#xff0c;因为有景深&#xff0c;所以无法同时聚焦到两条边。想办法聚焦到其中一条不太有特征的边&#xff0c;另一条边通过白色的特征来检测。 dev_open_window(0, 0, 800, 800, black, WindowHandle) dev_set_color(red) * Image Acquisition 01: Code gen…

leetcode及牛客网二叉树相关题、单值二叉树、相同的树、二叉树的前序、中序、后序遍历、另一棵树的子树、二叉树的遍历等的介绍

文章目录 前言一、单值二叉树二、相同的树三、二叉树的前序遍历四、二叉树的中序遍历五、二叉树的后序遍历六、另一棵树的子树七、二叉树的遍历总结 前言 leetcode及牛客网二叉树相关题、单值二叉树、相同的树、二叉树的前序、中序、后序遍历、另一棵树的子树、二叉树的遍历等…

交换机堆叠技术

堆叠 一、园区网络以及数据中心技术发展演进 1、xSTP&#xff08;STP&#xff0c;RSTP&#xff0c;MSTP&#xff09; 问题&#xff1a; 收敛慢链路利用率不高次优路径------mstp不持支负载vlan数量限制&#xff08;4k&#xff09;&#xff0c;网络规模瓶颈 二、堆叠基本概念…

vue实现左侧拖拽拉伸,展开收起

需求&#xff1a;1.左侧是个树形结构&#xff0c;有的文字过长展示不全&#xff0c;想通过拖拽显示全部的数据 2.展开收起 实现图中效果 <div class"catalog-drag"><svg t"1687228434888" class"icon" viewBox"0 0 1…

【主动均衡和被动均衡】

文章目录 1.被动均衡2.主动均衡1.被动均衡 被动均衡一般通过电阻放电的方式,对电压较高的电池进行放电,以热量形式释放电量,为其他电池争取更多充电时间。这样整个系统的电量受制于容量最少的电池。充电过程中,锂电池一般有一个充电上限保护电压值,当某一串电池达到此电压…

将点作为C++ map容器key值时的踩坑记录

1.背景 空间点具有X,Y,Z坐标等数据&#xff0c;一些情况下我们需要将点作为map容器的key值&#xff0c;比如识别重复点或处理轮廓等情况。 2.问题 将点作为map的key值&#xff0c;需要自定义比较器或者重载实现点类的小于<操作运算符&#xff0c;判断规则是a < b 和 b…

使用Python发送企业微信消息

大家好&#xff0c;在本文中&#xff0c;我们将探讨如何使用 Python 发送企业微信消息。将详细说明如何通过 Python 脚本实现消息的发送。无论是希望自动化某些任务&#xff0c;还是想要快速地向团队发送实时通知&#xff0c;本文都将为您提供一站式的解决方案。 企业微信提供了…

二叉树—堆(C语言实现)

一、树的概念及结构 1.树的概念 树是一种非线性的数据结构&#xff0c;它是有n&#xff08;n > 0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一颗倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下。 ● 有一个特殊的结点…

【SQL学习进阶】从入门到高级应用(六)

文章目录 ✨数据处理函数✨数字相关✨rand()和rand(x)✨round(x)和round(x,y)四舍五入✨truncate(x, y)舍去✨ceil与floor ✨空处理✨日期和时间相关函数✨获取当前日期和时间✨获取当前日期✨获取当前时间✨获取单独的年、月、日、时、分、秒✨date_add函数✨date_format日期格…

Netty SSL双向验证

Netty SSL双向验证 1. 环境说明2. 生成证书2.1. 创建根证书 密钥证书2.2. 生成请求证书密钥2.3. 生成csr请求证书2.4. ca证书对server.csr、client.csr签发生成x509证书2.5. 请求证书PKCS#8编码2.6. 输出文件 3. Java代码3.1. Server端3.2. Client端3.3. 证书存放 4. 运行效果4…

C++ 多重继承的内存布局和指针偏移

在 C 程序里&#xff0c;在有多重继承的类里面。指向派生类对象的基类指针&#xff0c;其实是指向了派生类对象里面&#xff0c;该基类对象的起始位置&#xff0c;该位置相对于派生类对象可能有偏移。偏移的大小&#xff0c;等于派生类的继承顺序表里面&#xff0c;排在该类前面…

Python中Web开发-Django框架

大家好&#xff0c;本文将带领大家进入 Django 的世界&#xff0c;探索其强大的功能和灵活的开发模式。我们将从基础概念开始&#xff0c;逐步深入&#xff0c;了解 Django 如何帮助开发人员快速构建现代化的 Web 应用&#xff0c;并探讨一些最佳实践和高级技术。无论是初学者还…

SM2259XT2、SM2259XT3量产工具开启“调整不对称CH/CE组态”功能

自己摸索的SM2259XT2、SM2259XT3量产工具开启“调整不对称CH/CE组态”功能。在量产部落下载SM2259XT2量产工具后&#xff0c;解压量产工具压缩包&#xff0c;找到并打开量产工具文件夹中的“UFD_MP”文件夹&#xff0c;用记事本或者Notepad打开“Setting.set”文件&#xff0c;…

Vue3实战笔记(53)—奇怪+1,VUE3实战模拟股票大盘工作台

文章目录 前言一、实战模拟股票大盘工作台二、使用步骤总结 前言 实战模拟股票大盘工作台 一、实战模拟股票大盘工作台 接上文&#xff0c;这两天封装好的组件直接应用,上源码&#xff1a; <template><div class"smart_house pb-5"><v-row ><…

Docker管理工具Portainer忘记admin登录密码

停止Portainer容器 docker stop portainer找到portainer容器挂载信息 docker inspect portainer找到目录挂载信息 重置密码 docker run --rm -v /var/lib/docker/volumes/portainer_data/_data:/data portainer/helper-reset-password生成新的admin密码&#xff0c;使用新密…

若依分页问题排查

无限分页数据返回 一、问题排查1.1 代码排查1.2 sql排查1.3 原因分析 二、问题修复 项目使用了 若依的框架&#xff0c;前端反馈了一个问题&#xff0c;总记录条数只有 48条的情况下&#xff0c;传入的 页数时从6~~无穷大&#xff0c;每页大小为10, 此时还能返回数据&#xff0…