数据结构绪论

news/2024/5/18 15:59:48/文章来源:https://blog.csdn.net/qq_37701948/article/details/129794498


文章目录

  • 1 知识结构
  • 2 数据结构的基本概念
    • 2.1 算法的基本概念
    • 2.2 数据结构三要素
      • 2.2.1 数据的逻辑结构
        • 线性结构
        • 非线性结构
      • 2.2.2 数据的存储(物理)结构
        • 数据结构的四种存储结构
      • 2.2.3 数据的运算
  • 3 算法的基本概念
    • 3.1 基本概念
      • 3.1.1 算法(Algorithm)
      • 3.1.2 算法的特性
      • 3.1.3 算法的设计目标
    • 3.2 算法效率的度量
      • 3.2.1 时间复杂度
      • 3.2.2 空间复杂度
      • 3.2.3 计算算法复杂的的基本步骤

​​​​​​​​​​​​​​

1 知识结构

在这里插入图片描述
比较基础的入门知识点中,时间复杂度和空间复杂度的计算、算法的设计是主要的考察点。

2 数据结构的基本概念

2.1 算法的基本概念

在这里插入图片描述
数据、数据元素及数据项的例子如下:
在这里插入图片描述

2.2 数据结构三要素

2.2.1 数据的逻辑结构

逻辑结构是指数据元素之间的逻辑关系。它与数据的存储结构无关,同一种逻辑结构可以有多种存储结构。线性表是典型的线性结构;集合、树和图是典型的非线性结构。数据的逻辑结构分类见图。
在这里插入图片描述

线性结构

线性结构是一个数据元素的有序集合,有3个基本特征:

  1. 存在唯一的“第一个元素”和“最后一个元素”。
  2. 除 1. 中元素外,所有元素都有唯一的前驱和后继。
  3. 结构中的元素存在着“一对一”的关系。如 (a1, a2, … , an),a1 为第一个元素,an 为最后一个元素。

非线性结构

  1. 树形结构

数据元素(在树中称为结点)按分支关系组织起来的结构,很象自然界中的树那样。结构中的元素存在着“一对多”的关系。

  1. 图状结构

“多对多”关系形成的逻辑结构。其中每个元素的直接前趋和直接后继数目都不限。

2.2.2 数据的存储(物理)结构

数据的存储结构是其逻辑结构在计算中的表示(映像),也可以理解为数据的存储结构是用计算机语言实现的逻辑结构,它依赖于计算机语言数据的逻辑结构。它包括数据元素的表示和关系的表示。当数据元素是由若干项数据构成的时候,数据项的表示称为数据域。

数据元素之间的关系在计算机中有两种不同的表示方法:顺序映像非顺序映像(从逻辑关系上分类)。对应两种不同的存储结构:顺序存储结构链式存储结构。顺序映像借助数据元素在内存中的相对位置来表示它们之间的逻辑关系;非顺序映像借助的则是指针。

数据结构的四种存储结构

  1. 顺序存储

把逻辑上相邻的元素存储在物理位置上相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。优点是可以实现随机存取,每个元素占用最少的存储空间;缺点是只能使用相邻的一整块存储单元,因此可能产生较多的外部碎片。

  1. 链式存储

不要求逻辑上相邻的元素在物理位置上也相邻,借助指示元素存储地址的指针表示元素之间的逻辑关系。优点是不会出现碎片现象,充分利用所有存储单元;缺点是每个元素因存储指针而占用额外的存储空间,并且只能实现顺序存取。值得注意的是,链式存储的结点的存储空间可以不连续,但是结点内的存储单元地址必须是连续的。

  1. 索引存储

在存储元素信息的同时,还建立附加的索引表来标致数据元素的地址。索引表中的每一项称为索引项,索引项的一般形式是:<关键字,地址>,地址作为指向数据元素的指针。优点是检索速度快;缺点是增加了附加的索引表,会占用较多的存储空间。另外,在增加和删除数据时要修改索引表,因而会花费较多的时间。

  1. 散列存储

由数据元素的关键字通过散列函数直接计算出该元素的存储地址,又称为 Hash 存储,本质上是顺序存储方法的扩展。其优点是检索、增加和删除结点的操作都很快;缺点是如果散列函数不好可能出现元素存储单元的冲突,而解决冲突会增加时间和空间开销。

2.2.3 数据的运算

施加在数据上的运算包括运算的定义和实现。运算的定义是针对逻辑结构的,指出运算的功能;运算的实现是针对存储结构的,指出运算的具体操作步骤。

3 算法的基本概念

3.1 基本概念

3.1.1 算法(Algorithm)

算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。可以理解为由基本运算及规定的运算顺序所构成的完整的解题步骤

3.1.2 算法的特性

在这里插入图片描述

3.1.3 算法的设计目标

在这里插入图片描述

3.2 算法效率的度量

3.2.1 时间复杂度

通常将算法中基本操作的执行次数(时间)作为算法时间复杂度的度量。一个语句的频度是指该语句在算法中被重复执行的次数。算法中所有语句的频度之和记作 T(n)T(n)T(n),它是该算法问题规模 nnn 的函数,时间复杂度主要是分析 T(n)T(n)T(n) 的数量级。算法中的基本运算(最深层循环内的语句)的频度T(n)T(n)T(n) 同数量级,所以通常采用算法中基本运算的频度 f(n)f(n)f(n) 来分析算法的时间复杂度。因此,算法的时间复杂度记为:T(n)=O(f(n))T(n) = O(f(n))T(n)=O(f(n))

上式中“O”的含义是 T(n)T(n)T(n) 的数量级,其严格的数学定义是:若 T(n)T(n)T(n)f(n)f(n)f(n) 是定义在正整数集合上的两个函数,则存在正常数 CCCn0n_0n0,使得当 n≥n0n \ge n_0nn0 时,都满足 0≤T(n)≤C×f(n)0 \le T(n) \le C \times f(n)0T(n)C×f(n)

算法的时间复杂度不仅依赖于问题的规模 nnn,也取决于待输入数据的性质(如输入数据元素的初始状态)。例如在数组 A[0…n−1]A[0 … n - 1]A[0n1] 中,查找给定值 kkk 的算法如下:

i = n - 1;
while (i >= 0 && (A[i] != k)) {i--;
}
return i;

此算法中的第三行代码就是基本运算,它的执行频度不仅与问题规模 nnn 有关,还与数组 AAA 中的各元素取值及 kkk 的取值有关:
① 若 AAA 中没有与 kkk 相等的元素,则语句3的频度 f(n)=nf(n) = nf(n)=n
② 若 AAA 的最后一个元素等于 kkk,则语句3的频度 f(n)=0f(n) = 0f(n)=0

补充几个时间复杂度的分类:

  • 最坏时间复杂度:指在最坏情况下,算法的时间复杂度。
  • 平均时间复杂度:是指所有可能输入实例在等概率出现的情况下,算法的期望运行时间。
  • 最好时间复杂度:是指在最好情况下,算法的时间复杂度。

一般总是考虑在最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长。

在分析一个程序的时间复杂性时,通常有以下两条规则:

  1. 加法规则

T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n)))T(n) = T_1(n) + T_2(n) = O(f(n)) + O(g(n)) = O(max(f(n),\ g(n)))T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n), g(n)))

  1. 乘法规则

T1(n)×T2(n)=O(f(n))×O(g(n))=O(f(n)×g(n))T_1(n) \times T_2(n) = O(f(n)) \times O(g(n)) = O(f(n)\times g(n))T1(n)×T2(n)=O(f(n))×O(g(n))=O(f(n)×g(n))

常用的时间复杂度比较关系:

O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)O(1)<O(log_2n)<O(n)<O(nlog_2n)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)

3.2.2 空间复杂度

算法的空间复杂度 S(n)S(n)S(n) 定义为该算法所耗费的存储空间,它是问题规模 nnn 的函数。渐近空间复杂度也简称为空间复杂度,记作 S(n)=O(g(n))S(n) = O(g(n))S(n)=O(g(n))

3.2.3 计算算法复杂的的基本步骤

  1. 确定算法中的基本操作以及问题的规模。
  2. 根据基本操作执行情况计算出规模 nnn 的函数 f(n)f(n)f(n),并确定时间复杂度为 T(n)=O(f(n))T(n) = O(f(n))T(n)=O(f(n)) 中增长最快的项。注意区分执行次数和时间复杂度的概念,执行次数只是时间复杂度的一个度量,并不直接等于时间复杂度。一般需要通过求和计算来求得执行次数。

希望本篇博客能对你有所帮助,也希望看官能动动小手点个赞哟~~。

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

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

相关文章

MIPI D-PHYv2.5笔记(5) -- 不同的PHY配置方式

声明&#xff1a;作者是做嵌入式软件开发的&#xff0c;并非专业的硬件设计人员&#xff0c;笔记内容根据自己的经验和对协议的理解输出&#xff0c;肯定存在有些理解和翻译不到位的地方&#xff0c;有疑问请参考原始规范看 规范5.7章节列举了一些常见的PHY配置&#xff0c;但实…

jsp+ssm在线考试系统+错题集Spring+SpringMVC+Mybatis编写实现的项目

本系统设计了三种角色&#xff1a;管理员&#xff0c;用户和教师。通过此系统&#xff0c;教师可以在线课程信息、考试内容、在线考试、考试管理进行发布。以及在线对试卷进行批阅和批量删除&#xff0c;用户可以对自己任课老师布置的课程信息进行下载&#xff0c;对老师已经批…

TryHackMe-Willow(boot2root)

Willow 柳树下有什么&#xff1f; 端口扫描 循例 nmap NFS枚举 直接挂载进来 存在一个rsa_key 暂时不知道有啥用&#xff0c;先去看80 Web枚举 进入80 看起来像是16进制&#xff0c;使用xxd转换 得到了用户名和rsa密文 在线计算器解密一下得到ssh的私钥 需要密码 ssh2johnj…

现在转行IT还有机会吗?

其实大部分所谓的机会都是建立在我们准备好的基础上的&#xff0c;因为大多数的企业并不会启用一个零基础毫无经验&#xff0c;或者没有企业所需要特质的人员。作为普通人而言&#xff0c;只有当你准备好之后&#xff0c;你才会看到机会&#xff0c;在这之前&#xff0c;你只会…

Web自动化测试入门

1.Web自动化测试的价值&#xff08;为什么要做web自动化测试&#xff09; 我们可以使用脚本语言代替人来进行测试 2.Web自动化测试相关技术&#xff1a; Selenium:支持多语言&#xff0c;行业内最火最主流Pytest/JUnit5:最好用最全面的单元测试框架Allure:测试报告3.Web自动化…

NotionAI - 文档领域的ChatGPT,一款 AI 加持的在线文档编辑和管理工具

简介 NotionAI - 文档领域的ChatGPT&#xff0c;一款 AI 加持的在线文档编辑和管理工具 作为国际领先的在线文档编辑和管理工具&#xff0c;Notion受到了广大用户的欢迎&#xff0c;尤其是程序员们。它不仅支持笔记、编码等基本的在线文档功能&#xff0c;还支持团队协作、项…

简单XXE漏洞理解以及在实战中演练【网络安全】

1.概念 XXE(XML External Entity Injection) 全称为 XML 外部实体注入。这是一个注入漏洞&#xff0c;强调利用点是外部实体 &#xff0c;将注意力集中于外部实体中&#xff0c;而不要被 XML 中其他的一些名字相似的东西扰乱了思维&#xff0c;如果能注入 外部实体并且成功解析…

基于springboot实现留守儿童爱心网站平台【源码+论文】分享

基于springboot实现留守儿童爱心网站演示开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&…

CS-Stdio Display Builder

Display Builder 1) 操作界面编辑器和Runtime 2&#xff09;在EPICS edd/dm, medm, edm, ...想法上构建 3&#xff09;与CS-Studio BOY兼容性非常好 4&#xff09;大约2015年在CS-Stdio/Eclipse中开始&#xff0c;现在在CS-Studio/Phoebus中 5) 从209年以Web Runtime获取。…

UG/NX二次开发实例流程样例(nx1980+vs2019)

接上一篇文章《UG/NX二次开发环境配置方法(nx1980vs2019)》&#xff0c;这一篇文章我们将详细讲述&#xff0c;如何开发一个具体的功能——根据用户输入的数据&#xff0c;在原点处创建一个指定大小的立方体。 由于本功能还涉及到nx的一些基本操作&#xff0c;所以这里先讲一下…

HTB-Stocker

HTB-Stocker信息收集开机提权信息收集 先看80端口。 没有让人眼前一亮的目录。 但是有子域名。 子域名是一个登录功能。 对其进行简单的sql注入测试&#xff0c;发现并不存在sql注入&#xff0c;尝试非sql注入方法绕过登录&#xff0c;NoSQL。经过测试&#xff0c;使用json格式…

【分布式】分布式锁

目录一、分布式锁介绍二、基于 Redis 实现分布式锁1. 如何基于 Redis 实现一个最简易的分布式锁&#xff1f;2.为什么要给锁设置一个过期时间&#xff1f;3. 如何实现锁的优雅续期&#xff1f;4. 如何实现可重入锁&#xff1f;一、分布式锁介绍 单机多线程&#xff1a; 在 Jav…

整理alacritty使用笔记

github&#xff1a; https://github.com/alacritty/alacritty features&#xff1a; https://github.com/alacritty/alacritty/blob/master/docs/features.md features&#xff08;中文&#xff09;&#xff1a; https://gitcode.gitcode.host/docs-cn/alacritty-docs-cn/docs/…

js宏编程--wps开放平台介绍

在上篇《初识Excel的JS环境WPS宏编程》中提到&#xff0c;JS宏编程有2个比较好的参考资料&#xff0c;一个是官方的WPS开发平台介绍&#xff0c;另一个则是ES6教程&#xff0c;本文就WPS开发平台关于JS宏编程的重点做一个概要性的介绍。 1、客户端开发 进入开发平台后&#xf…

要和文心一言来一把你画我猜吗?

想和文心一言来一把你画我猜吗&#xff1f; ChatGPT的爆火&#xff0c;让AI对话模型再次走入大众视野。大家在感叹ChatGPT的智能程度时&#xff0c;总会忍不住想&#xff1a;如果我们也有自己的AI对话模型就好了。在社会的压力下&#xff0c;国内的厂商和研究机构也纷纷做出尝试…

通过小三越位,彻底弄懂 https 原理本质(三)加密漏洞

一、https加密&#x1f510;过程&#xff0c;上期知识回顾 小明&#x1f466;和小花&#x1f467;为了安全高效的发情书&#xff0c;采用对称加密方式。聪明的老王&#x1f436;盗取对称加密的密钥S&#x1f511; 。小明&#x1f466;想到了非对称加密方式&#xff0c;于是就生…

Grainger 固安捷 EDI 需求分析

Grainger 固安捷是全球领先的设备维护、修理和MRO工业品分销商&#xff0c;成立于1927年&#xff0c;由威廉W格兰杰&#xff08;William W. Grainger &#xff09;在芝加哥创立。他创建这家公司的目的是为了让消费者能够获得稳定的电机供应。Grainger 固安捷的经营范围包括维修…

熟练Redis之无处不在的锁

为了保证并发访问的正确性&#xff0c;Redis提供了两种方法,分别是加锁和原子操作 Redis加锁两个问题:一个是&#xff0c;如果加锁操作多&#xff0c;会降低系统的并发访问性能;第二个是&#xff0c;Redis客户端要加锁时&#xff0c;需要用到分布式锁&#xff0c;而分布式锁实…

【从零开始】力扣刷题(2)

前言 我根据这里的表单开始刷力扣 数组的改变移动 453.最小操作次数使元素相等 写了一个但超过时间限制&#xff0c;碰到[1,100000000]就超出时间限制了,就不错误示范了。 看了一个评论&#xff0c;拍案叫绝。 665.非递减数列 想了一天&#xff0c;看了很多解答&#xff0…

Spark SQL实战(04)-API编程之DataFrame

1 SparkSession Spark Core: SparkContext Spark SQL: 难道就没有SparkContext&#xff1f; 2.x之后统一的 package com.javaedge.bigdata.chapter04import org.apache.spark.sql.{DataFrame, SparkSession}object SparkSessionApp {def main(args: Array[String]): Unit …