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

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

基本概念和术语

在这里插入图片描述

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

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

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

  • 数据元素的映象是 二进制位(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

相关文章:

  • spring 优雅替换bean
  • HTML静态网页成品作业(HTML+CSS)—— 冶金工程专业展望与介绍介绍网页(2个页面)
  • SQL—DQL之执行顺序(基础)
  • Java语言编程考试难吗:深入剖析与应对策略
  • windows11家庭版、专业版、工作站版区别
  • 利用 Docker 简化Redis部署:快速搭建Redis服务
  • webserver服务器从零搭建到上线(八)|EpollPoller事件分发器类
  • 南澳葡萄酒发展论坛盛邀国际荐酒师香港协会共商开放关税中国发展
  • 【计算机毕业设计】基于SSM++jsp的在线云音乐系统【源码+lw+部署文档】
  • 使用Python库Matplotlib绘制常用图表类型
  • 新人学习笔记之(JavaScript作用域)
  • BurpSuite2024.5
  • C++——list
  • STM32学习问题总结(1)—CubeMX生成后下载无反应
  • SpringBoot+layui实现Excel导入操作
  • 4个实用的微服务测试策略
  • Golang-长连接-状态推送
  • iOS 系统授权开发
  • Java,console输出实时的转向GUI textbox
  • Javascript 原型链
  • js面向对象
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • vue自定义指令实现v-tap插件
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 搭建gitbook 和 访问权限认证
  • 理解在java “”i=i++;”所发生的事情
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 浅谈Golang中select的用法
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 我建了一个叫Hello World的项目
  • 学习HTTP相关知识笔记
  • ​linux启动进程的方式
  • ​TypeScript都不会用,也敢说会前端?
  • !!java web学习笔记(一到五)
  • (13)DroneCAN 适配器节点(一)
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (二)WCF的Binding模型
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (汇总)os模块以及shutil模块对文件的操作
  • (南京观海微电子)——I3C协议介绍
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (四)Linux Shell编程——输入输出重定向
  • (五)MySQL的备份及恢复
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .NET CF命令行调试器MDbg入门(一)
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • @EnableWebMvc介绍和使用详细demo
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • []Telit UC864E 拨号上网
  • [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)
  • [AX]AX2012 AIF(四):文档服务应用实例
  • [AX]AX2012开发新特性-禁止表或者表字段
  • [c#基础]值类型和引用类型的Equals,==的区别
  • [Codeforces] combinatorics (R1600) Part.2