精华内容
下载资源
问答
  • mysql索引的数据结构什么

    千次阅读 2021-01-21 10:36:53
    一、简介mysql索引的数据结构是树,常用的存储引擎innodb采用的是B+Tree。这里对B+Tree及其相关的查找树进行简要介绍。二、各种查找树1、二叉排序树(也称为二叉查找树)二叉排序树是最简单的查找树,特点:a)是一棵...

    e2ef9ca0ed393c38e08181ea6d904c74.png

    一、简介

    mysql索引的数据结构是树,常用的存储引擎innodb采用的是B+Tree。这里对B+Tree及其相关的

    查找树进行简要介绍。

    二、各种查找树

    1、二叉排序树(也称为二叉查找树)

    二叉排序树是最简单的查找树,特点:

    a)是一棵二叉树;

    b)左子树所有结点的值小于它的父结点的值,右子树所有结点的值大于它的父结点的值。

    2、平衡二叉树(又称AVL树)

    平衡二叉树是二叉排序树的基础上,对树的深度进行了限制,从而减少了查找比较的次数,

    特点:

    a)是一棵二叉树;

    b)左子树所有结点的值小于它的父结点的值,右子树所有结点的值大于它的父结点的值;

    c)左子树与右子树的深度差在-1、0、1内,否则对子树进行旋转调整。

    3、B-树(B-Tree)

    B-树是多路平衡查找树,相对于平衡二叉树,对父结点的直接子结点个数,不再仅限于2,

    可以指定m(自定义),这样可以在树的深度不大量增加的前提下,保存更多的结点。

    B-树是通常在文件系统中使用。

    特点:

    a)树的每个结点最多有m(自定义)子结点;

    b)若根结点不是叶子结点,则至少有两个子结点;

    c) 除根结点外的所有非叶子结点,至少有m/2上取整个子结点;

    d)父结点下的最左边子树所有结点的值均小于父结点最小值,

    最右边子树所有结点的值均大于父结点最大值,

    其余中间子树所有结点的值则介于指针的父结点两边的值;

    e)所有叶子结点都在同一层;

    注意:所有结点均带有值

    4、B+树(B+Tree)

    B+树是B-树变体,相对于B-树,叶子结点的值包含了所有的值,所有父结点的值是重复了叶子结点的值,

    父结点只起索引查找的作用,同时所叶子结点也也构成了一条有序的链表。

    mysql中存储引擎为innodb的索引,采用的数据结构即是B+树。

    特点:

    a)有m个子结点的父结点就有m个关键字;

    b)所有叶子结点包含了所有关键字(值),且构成由小到大的有序链表;

    c) 所有非叶子结点起索引作用,结点仅包含子树所有结点的最大值;

    d)所有叶子结点都在同一层;

    注意:叶子结点包含了所有的关键字(值)。

    5、B*树(B*Tree)

    B*树是B+树的变体,相对B+树,增加了对同一层非叶子结点的指针,即同一层非叶子结点也构成了一条链表。

    三、总结

    综上,上述各种查找树是相互关联的。

    归结到mysql中innodb索引,采用的是B+树,如聚簇索引,是通过主键来聚集数据,采用B+树实现,

    这即是一种索引,也是mysql的一种数据存储结构,叶子结点包含了所有的数据,非叶子结点仅起索引作用(若

    没有定义主键,则innodb会隐式定义一个主键来作为聚簇索引)。

    更多MySQL的相关技术文章,请访问MySQL教程栏目进行学习!

    展开全文
  • 因为教材中的概念之间存在冲突,所以广泛浏览各类教材、视频,对数据结构进行系统、辩证的梳理。建议考研看不懂教材或者视频的同学看一看。

    为什么写这篇文章

    《数据结构》这门课有很多教材,各种概念十分混乱。为了解决概念之间的矛盾,写下这篇博客。
    比如严蔚敏的书中存在数据类型和数据结构的混乱,数据类型和ADT的混乱。书上所写本就自相矛盾,因此引用严书中的内容所写的文章或者录制的慕课大概率是存在问题的。

    计算机科学的各种定义是对实践经验的总结,掺杂了人的主观意识,也就是人为规定的,很多定义,包括数据 结构,至今没有被公认,不像自然定理一样亘古不变,所以建议从历史发展的角度,结合实践经验理解,不要死记硬背,但不是不要记!

    信息与数据

    数据是信息的载体,是描述客观事物的数字、字符、图片、声音等符号的集合,所有的数据在计算机中以二进制比特的形式表示。
    信息是数据的内涵。
    少量数据可能包含很多信息。似乎所有的数据都可能有用,正如黑格尔所说的“存在即合理”。

    数据、数据对象、数据元素、数据项之间的关系
    数据元素是数据的基本单位,也称为元素、记录等,通常作为一个整体考虑。
    数据项是组成数据元素的具有独立含义的、不可分割的最小单位。
    数据对象是性质相同的数据元素的集合。

    程序执行中所用的数据都存于内存。任何数据对象在能用期间都有存储位置,占据一定数量的存储单元。内存单元按顺序排,每个单元有一个称为内存地址的编号,内存数据都是通过地址访问的。高级语言把存储单元、地址等低级概念用变量等高级概念掩盖起来,使写程序时可以不必过多关心这方面细节。但内存与地址等仍是最基本的重要概念 。

    个人感觉,严书两个版本对数据元素的理解有不同。这从对数据结构的定义的差别中可以感受到。详见后文存储结构部分。
    若是按照严书1 理解,数据元素和关系区别开。
    若是按照严书2理解,数据元素包括数据和逻辑关系,即表示关系的数据也算是数据元素或数据元素的一部分。

    数据类型

    数据类型的本质是固定内存大小上的储存方案和操作方案
    数据类型关注的是比特组合表示什么,也就是怎么用比特组合表示数据的问题,关注的是一个数据元素的data representation。

    数据类型的概念最早出现在高级程序设计语言,发源于硬件,是一种解释计算机中的数据的手段。
    计算机内所有的的数据都是二进制数字,电路工程师设计一个CPU,需要人工制定一个规则来使用数据,要考虑如何对数字进行编码表示,并根据编码规则设计加法器、乘法器等。
    如果没有了这个规则,就说不清比特串代表什么,不知道从哪里开始到哪里结束代表一个数字,有可能8个比特代表一个整数,有可能16个比特代表一个整数,也可能是浮点数或者其他的数。
    工程师将数字按类别分组,用一个编码方式解释一个类里的所有数字,不同类的数字采用不同的编码方式。这个方法算是一种简单的抽象,毕竟总不能一个数字专门定制一个规则。

    写程序也就是要描述怎么表示数据并处理数据。
    高级程序设计语言,在硬件提供的编码方式的基础上,继续将数据抽象分类,使属于同一类型的数据具有相同的编码规则,并为程序员提供了数据描述机制。
    比如C语言,将若干位的比特数字规定为整型数字,并命名为int类型,还提供声明和定义机制,如int a;标识符a表示内存中的一块区域,按照int类型的规定使用这块区域。
    这种描述数据的机制,在程序设计中被规范地称为数据类型

    数据类型规定了一类数据所有可能取值的范围,以及在这些值上允许进行的操作。可能所有的CPU都提供int类型,但如果编码方式不同,能在其上进行的操作的过程不同,电路实现不同,严格地讲,就不能算作同一种数据类型。
    在计算机发展初期,计算机主要处理数值计算问题,整数、浮点数等是经常用到的运算对象,所以CPU一般会支持整数、浮点数等数字的计算。整数、浮点数等数据模型简单,不需要设计复杂的存储方法,因此不重视数据结构。

    随着程序设计的规范,抽象数据类型被提出。抽象数据类型(Abstract Data Type,简称ADT)是数据类型的数学抽象,是一个数学模型以及定义在该模型上的一组操作,不考虑其具体实现,也不依赖特定的编程语言。

    严蔚敏的数据结构中说,数据类型和抽象数据类型实质上是一个概念1。个人认为将两个概念当作一个是不严谨的。
    书中说是一个概念,是因为书中认为,对于使用数据类型的普通用户来说,不必了解的细节都被封装了,尽管实现不同,但数学特性相同,在用户看来都是一样的。而且数据结构的思想不依赖于特定的编程语言

    但是数据类型即使封装了细节,还是已经包含了具体实现,而抽象数据类型完全不涉及具体实现。当然我们在实际使用中,也确实对两个概念几乎完全不做区分,是因为大多时候我们不依赖于数据类型的实现细节,但这不代表不知道如何实现,有时也需要考虑数据类型的实现。

    对于高级的程序员,要多多少少对实现方法具备一些了解,即使不考虑数据类型的实现,也要或多或少地考虑程序设计语言的特性,并不是完全只需要考虑其数学上的抽象特性。
    对于依赖实现细节的硬件工程师来说,数据类型和抽象数据类型显然是不一样的。

    数据结构

    数据在内存或者硬盘中不是胡乱存储的,就像图书馆的书不是随便放在书架上的,所以为了研究怎么摆放计算机中的数据更好,就有了《数据结构》这门课。

    什么是数据结构

    数据结构是(数据对象)与(对象中数据元素之间的关系)的集合,是(逻辑上) 组织、(物理上)存储数据的方法,当然在计算机里也是数据,当然也是一门
    数据结构关注的是数据对象的data strorage。

    数据结构起源于程序设计,并随着程序设计的发展而发展。人们在进行程序设计时通常关注两个重要的问题,一是如何将待处理的数据存储到计算机内存中,二是如何设计相应的算法操作这些数据,即数据处理。数据表示的本质是数据结构设计,数据处理的本质是算法设计。
    计算机发展初期,人们使用计算机主要处理数值计算问题,所涉及的运算对象是简单的整数、浮点数、字符及布尔型数据,不需要设计复杂的存储方法,因此不重视数据结构。
    非数值计算的问题越来越重要,如何表示数据成为重要的问题,数据结构及抽象数据类型被提出,从而使程序设计越来越规范。

    在早期的面向过程的结构化程序设计中,程序设计一般原则——程序=数据结构+算法,就是先分析数据的数学模型和要对其进行的操作,确定如何存储数据和怎么实现操作,在这之后编写程序就很容易了。
    而结构化程序设计中,数据和过程分离,所以把数据结构定义为二元组(D,S),D为数据元素的有限集,S为关系的有限集,未考虑数据结构上的操作。由于结构化程序设计影响深远,所以习惯性地把数据结构定义为二元组。

    在面向对象程序设计中,数据结构可以看作一个容器对象。利用面向对象的开发方式,数据和过程放在一起,所以有时候,数据结构又包含了其上的操作,变成了三元组(D,S,P)。
    而我们上这门课,肯定是要讨论数据结构上的操作的,所以用面向对象的方法描述数据结构更合适。

    数据结构,作为一门课程,这门课研究的是(数据的逻辑上的组织方法和物理上的存储方法),也就是(先把数据模型化,再研究如何放在计算机里表示)。这门课不是程序设计课2.0,而是要通过精心设计数据结构,为程序带来更高的运行或者存储效率。

    所以数据结构包含逻辑结构存储结构两个层次(不是并列)。
    编写程序将逻辑结构映射成存储结构,并实现可在数据结构上进行的各种操作。

    以下几条来自不同教材里对数据结构的定义,对比体会。

    1. 数据结构是相互之间存在一种或多种特定关系的数据元素的集合。换句话说,数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。12
      个人认为,这句话把关系作为数据元素的定语,关系和数据元素的地位不够平等。书中也说这是书中的一种简单解释。而且第二版2由此出发的对存储结构的定义让人感觉有些疑惑。
    2. 数据结构是数据对象,以及存在于该对象的实例和组成实例的数据元素之间的各种联系。3
    3. 数据结构是ADT的物理实现。4
      如果把数据结构当成一个容器对象,这个对象的抽象类,即ADT。 编程是在描述解决问题的办法,则在编程中,ADT的实现是对(组织、存储数据的方法和对数据进行的操作)的抽象模型的具体描述。想一想编程中如何实现数据结构,比如C语言,差不多就是声明结构类型和函数,将其定义,再初始化,好像很大一部分工作就是在实现某种ADT,也就是在具体描述组织、存储数据的方法和对数据进行的操作。在程序运行时,ADT的物理实现就可以是一个容器对象。

    逻辑结构

    逻辑结构从逻辑关系上描述数据,也就是数据的数学模型,与数据的在计算机中的存储无关。这个模型考虑的不只限于现有的有限数据,还要考虑范围更广的同类的数据。

    任意一个数据元素可以和n(n>=0)个数据元素有逻辑上的关系。
    逻辑结构可以分为四类:

    • 多对多的关系为图结构或网状结构;
    • 一对多为树结构;
    • 一对一为线性结构;
    • 除了同为一个集合外,别无其它关系为集合结构。
      逻辑结构也可以分为 线性结构 和 非线性结构两大类。
      可以认为,图结构表示的关系最复杂;树是一种特殊的图;线性结构是一种特殊的树结构,也是一种特殊的图结构;集合是没有关系的图结构。

    存储结构

    若是按照严书1,数据元素和关系区别开。
    ​数据结构在计算机中的表示(又称映像)称为数据的物理结构,又称存储结构。它包括数据元素的表示和关系的表示。
    ​数据元素的位串称为元素或节点,他的子位串称为数据域。因此元素或结点可看成是数据元素在计算机中的映像。

    若是按照严书2,数据元素包括数据和逻辑关系。
    数据对象在计算机中的存储表示称为数据的存储结构。把数据对象存储到计算机时,通常既要存储各数据元素的数据,又要存储数据元素之间的逻辑关系

    严书1提到数据元素之间的关系在计算机中有两种不同的表示方法:顺序映像和非顺序映像
    按照严书1的理解,重点在关系的表示。

    1. 顺序映像,借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系,即通过相对位置来寻址。
    2. 非顺序映像,使用地址表示数据元素之间的逻辑关系。比如为了表示结点之间的关系,给每个结点附加指针字段,用于存放后继元素的存储地址。

    综合使用顺序映像和非顺序映像来存储数据,总结起来有四种基本方法,即殷人昆的书提到顺序存储方法链式存储方法索引存储方法散列存储方法5

    1. 顺序存储方法,该方法把逻辑上相邻的元素放到物理位置上相邻的存储单元中,数据元素之间的逻辑关系由顺序映像表示,也就是有存储单元的邻接位置关系来体现。由此得到的存储表示称为顺序存储结构。所谓的顺序不只包括无间隔的紧邻,诸如间隔k个字节,a^k个字节,都算是顺序存储。

    2. 链式存储方法,该方法不要求逻辑上相邻的元素在物理上相邻,㢝之间的逻辑关系由附加的指针指示。由此得到的存储表示称为链式存储结构

      1和2基本上是两个极端。顺序存储结构占用内存严重,链式存储结构寻址困难,综合两者的特性,做出寻址容易,插入删除也容易的数据结构。

    3. 索引存储方式,采用附加的索引表的方式来存储节点信息的一种存储方式。索引表由若干索引项组成。索引存储方式中索引项的一般形式为(关键字、地址)。

    4. 散列存储方法,根据结点的关键字计算直接得到该结点的存储地址。

    四种基本存储方法,既可单独使用,也可组合使用。
    同一种逻辑结构使用不同的存储方法可以实现不同的存储结构。

    严书2提到数据元素在计算机中有两种基本的存储结构,分别是顺序存储结构和链式存储结构
    按照2的理解,有这两种基础的存储结构,可以组合成其他数据结构的存储结构,比如,散列表。

    总之,存储结构是逻辑结构在计算机中的物理映射,也就是抽象的数据在内存里的物理实现。
    把数据存储到计算机中,通常既要存储数据元素,又要存储数据元素之间的逻辑关系。
    存储结构=物理结构=存储表示=物理表示=存储映像=物理映像

    ADT、数据类型、数据结构之间的关系

    不同语言的《数据结构》

    数据结构考虑的是数据对象的Data storage——怎么存数据对象的问题,而数据类型考虑的是数据元素的Data representation——怎么表示数据元素的问题。

    6为了描述数据,程序语言提供的数据机制必须足够丰富,以满足人们写程序的实际需要。程序语言的机制不能无限地庞大,使语言过分臃肿,难以使用;这些机制也不应过于低级,一直需要描述一点点东西都非常繁琐。 后面这种情况正是机器语言和汇编语言的一个弱点。
    经过几十年的研究和实践,目前高级语言领域在这个方面已经形成了一套公认有效的方式,一般语言都采用这种模式的数据机制,其基本框架包括几个互相联系的方面:

    1. 把语言要处理的数据对象划分为一些类型,每个类型是一个数据值的集合。例如C语言里的int类型是这个类型能够表示的所有合法整数值的集合。
    2. 提供一组基本数据类型,为他们确定书写方式,提供一组相关的基本操作(运算),以支持程序中队基本数据类型的表示和使用。
    3. 提供了一组由简单的数据类型或数据对象构造更加复杂的数据类型或数据对象的手段,反复使用这些手段可以一层层地构造起任意复杂的数据结构,以满足程序中处理复杂数据的需要。

    市面上有各种语言的数据结构的书,但是程序设计语言只是一种描述数据结构的工具,我们当然可以不使用数据类型这个概念,可以不用某种高级程序设计语言,可以直接用01比特,可以只用自然语言描述数据结构,《数据结构》这门课归根结底是要想办法有组织地把01比特存储在内存中。
    不过为了简化描述抽象算法,分类与评价数据结构,使用高级程序设计语言,尤其是其中的ADT的概念,来讲解数据结构。
    ADT的思想和面向对象是一致的,我们既要考虑数据结构,也要考虑其上的操作,所以用面向对象的方法描述数据结构比较方便、有效,但本课程大都在大学低年级开设,用C语言的描述方法更符合学生的实际情况。
    数据结构是一门介于软件和硬件之间的课,重要的不是用什么语言,而是要理解数据逻辑上的组织方式和在内存中的存储方式,所以说这门课不是程序设计课。

    数据结构与抽象数据类型

    网友认为数据结构是一种抽象的封装,我们平时写程序都是直接去调用这些数据结构,而没有去想它们的内部实现是怎样的。
    这种想法有些不严谨。网友说的是编程语言的数据类型。
    《数据结构》这门课使用哪门语言不重要,重要的是抽象地描述,所以有的教材直接使用ADT的概念,而不是数据类型。
    可以认为,抽象数据类型,是逻辑结构+运算在程序设计中的等价概念,是数据结构的接口描述。

    从程序设计的角度看,抽象数据类型使用不同的存储方法可以实现不同的数据类型,然后在程序运行中,可以使用数据类型来存储数据,从而把逻辑结构表示为存储结构,并实现算法。例如,列表的抽象数据类型可以以数组或链表为基础来实现为数据类型。
    对于可操作数据对象完全相同的数据类型,如果给它定义具有不同功能的一组,则可形成不同的抽象数据类型。例如队列和优先级队列,它们可能使用相同的顺序表结构来实现为数据类型,但队列是先进先出,优先级队列是优先级高的先出,具有各不相同的服务,是不同的抽象数据类型。

    我们平时编程中调用的是封装好的数据类型或者数据类型模板,利用某种数据类型定义数据,把数据组织、存储成数据结构。
    比如C++的STL的vector,他是一个顺序型容器类模板,我们可以利用 vector类模板,定义一个可以存储并管理int类型数据的vector< int >类型的容器,容器是一个能存储并管理对象的对象。这个对象与存储在对象中的其他对象一起构成了一个数据结构,也就是带有关系的数据元素的集合。

    一般我们在高级程序设计语言的层面进行软件设计。抽象数据类型处于软件层面,是编程语言理论的概念。而数据结构是在硬件和软件之中都有被用到,和语言无关,关注的是数据逻辑上的组织方式和在内存中是怎么存储的,最终还是要实现为01比特流。在编程中,我们使用数据类型描述组织、存储数据的方式和操作。在程序运行中,把数据元素组织、存储成带关系的数据元素的集合,也就是数据结构的存储结构。

    反过来说,数据结构是组织和存储的方法,而不是操作方法。我们可以把组织和存储的方法和操作方法结合并抽象成数据类型,在更高的层次上进行软件分析和设计。

    抽象数据类型的概念与面向对象方法的思想是一致的。。。。未完待续

    未完待续

    孤立地理解某一个概念,而不注意他们之间的联系是不可取的。
    比如,我们想定义一个整数类型,数学里的整数取值范围是无穷的。
    由于CPU的工作机制决定了它每次计算的数得是定长的,而定长就表示它只能表示有限范围内的数。虽然只要内存无限,当然可以设计出没有位数上限的整数运算的硬件。但是CPU为了通用,只提供最基本数据类型,不提供其他多余的功能。
    那么我们通过软件的方式来实现一个取值范围无穷的整数类型,使用高级程序设计语言提供的int类型构造这个ADT,显然逻辑上是线性结构,存储上可以选择链表或者顺序表。

    未完待续


    1. 严蔚敏,吴伟民,数据结构(C语言版) ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

    2. 严蔚敏,李冬梅,吴伟民,数据结构(C语言版)(第二版) ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

    3. Clifford A.Shaffer, 数据结构与算法分析 ↩︎

    4. Sartaj Sahni,数据结构、算法与应用 ↩︎

    5. 殷人昆,数据结构(用面向对象方法与C++语言描述)(第二版) ↩︎

    6. 裘宗燕,从问题到程序——程序设计与C语言引论 ↩︎

    展开全文
  • 专升本数据结构复习

    千次阅读 多人点赞 2021-03-03 13:48:51
    数据结构知识点总汇 主要参考书目: 程海英老师的《数据结构(C语言版)》教材 严蔚敏,李冬梅,吴伟民.《数据结构(C语言版)》 说明:这是本人专升本上岸一年后写的,本篇包含知识点和例题总结。因为是当时自己...

    数据结构知识点总汇

    主要参考书目:

    1. 程海英老师的《数据结构(C语言版)》教材
    2. 严蔚敏,李冬梅,吴伟民.《数据结构(C语言版)》

    推荐视频:西北大学 数据结构-耿国华老师

    说明:这是本人专升本上岸一年后写的,本篇包含知识点和例题总结。因为是当时自己手码的,所以知识点有冗余和顺序错位。如果发现有错误之处,欢迎评论区留言,看到后及时改正,谢谢!最后祝大家好好学习,积极向上,早日上岸!

    ① 数据结构(逻辑结构)其4类基本结构:集合线性结构树形结构图状结构网状结构

    ② 物理结构(存储结构)其4种存储结构:顺序存储结构链式存储结构索引存储结构散列存储结构

    ③ 算法5个重要特性:有穷性、确定性、可行性、输入 和 输出。
       通常从四个方面评价算法的质量:正确性、易读性、强壮性 和 高效率。

    ④ 线性表是由n≥0个数据元素组成的 有限序列。其特点为逻辑关系上相邻的两个元素在物理位置上也相邻。

    ⑤ 在顺序表中实现的基本运算:
      插入:平均移动结点次数为 n/2;平均时间复杂度均为O(n)。
      删除:平均移动结点次数为 (n-1)/2;平均时间复杂度均为O(n)。

    ⑥ 存储位置计算:每个元素需占用L个存储单元第一个单元的存储地址作为数据元素的存储位置线性表的第i个数据元素ai的存储位置为LOC(ai)=LOC(a1)+(i-1)*L ,a1的存储位置,通常称做线性表的起始位置或基地址。

    ⑦ 线性表的链式存储结构:数据元素ai的存储映像称为结点,包括2个域:存数据的 数据域、存后继存储位置的 指针域

    ⑧ 线性链表(单链表)特点:每个结点只包含1个指针域。在单链表的第一个结点之前附设的一个结点,称之为 头结点。

    ⑨ 假设L是LinkList型变量,则L为单链表的头指针,它指向表中第一个结点。
      L->next 为第一个结点地址,L->next=NULL为 空表。
      回收结点:free(q)
    在这里插入图片描述
    ⑩ 栈:是限定仅在 栈顶(表尾)进行插入或删除操作 的线性表。表头端称为栈底,不含有元素的空表称为空栈;栈又称为 后进先出 的线性表。

    ⑪ 队列:是一种 先进先出 的线性表,它只允许在表的一端进行插入,而另一端删除元素。允许插入的一端叫做队尾,允许删除的一端则称为队头。

    ⑫ 链队列:用链表示的队列。一个队列需要头指针和尾指针才能确定唯一。

    ⑩ 栈:是限定仅在 栈顶(表尾)进行插入或删除操作 的线性表。表头端称为栈底,不含有元素的空表称为空栈;栈又称为 后进先出 的线性表。

    ⑪ 队列:是一种 先进先出 的线性表,它只允许在表的一端进行插入,而另一端删除元素。允许插入的一端叫做队尾,允许删除的一端则称为队头。

    ⑫ 链队列:用链表示的队列。一个队列需要头指针和尾指针才能确定唯一。
    在这里插入图片描述
    ⑬ 循环队列:两个指针front指示队列头元素和rear指示队列尾元素的位置。初始化建空队列时,令front = rear = 0,每当插入新的队列尾元素时,“尾指针增1”;每当删除队列头元素时,“头指针增1”。
    在这里插入图片描述
    在这里插入图片描述
    ⑭ 串:是由零个或多个字符组成的有限序列。

    ⑮ 数组的存储位置计算:假设每个数据元素需占用L个存储单元,则二维数组A中任一元素A[ij]的存储位置可由下式确定:

      以行序为主序的存储结构:LOC(i,j)=LOC(0,0)+(n*i+j)*L;(n为行数)

      以列序为主序的存储结构:LOC(i,j)=LOC(0,0)+(n*j+i)*L;(n为列数)

    ⑯ 广义表:是线性表的推广,在广义表的定义中,ai可以是单个元素,也可以是广义表,分别称为广义表LS的原子和子表。
    在这里插入图片描述
    ⑰ 二叉树的性质:
      性质1:在二叉树的第K层上至多有 2k-1 个结点(K≥1)。
      性质2:深度为k的二叉树至多 2k-1 个结点(k≥1)。
          深度为k的二叉树至少有k个结点(k≥1)。
          深度为k的完全二叉树至少有 2k-1 个结点(k≥1)。
      性质3:对任何一棵二叉树T,如果其终端结点数为N0,度为2的结点数为N2,则 N0=N2+1。总结点个数 N=N0+N1+N2。
      性质4:具有n个结点的完全二叉树的深度为 [log2n]+1。

    ⑱ 满二叉树:一颗深度为k且有 2的k次方减1个结点的二叉树。

    ⑲ 完全二叉树:深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应。

    ⑳ 树转换成二叉树:连兄弟,留长子,删孩子。
      注意:由于树根没有兄弟结点,固树转换为二叉树后,二叉树根结点的右子树必为空。
    在这里插入图片描述
    ① 森林转换成二叉树:连树根及兄弟,留长子,删孩子。
    在这里插入图片描述
    ② 二叉树转换成树:连左孩子的右孩子及其右孩子…,删原树右孩子。
    在这里插入图片描述
    ③ 赫夫曼树:又称最优树,是一类带权路径长度最短的树。
    在这里插入图片描述WPL=23+43+52+71=35

    ④ 赫夫曼编码:在赫夫曼树上,左分支代表0,右分支代表1。由根结点到指定结点的路径(从上到下把0、1连起来),就是该结点的赫夫曼编码;如上图(d)中a为0,b为10,c为110,d为111。

    ⑤无向完全图:有 n(n-1)/2 条边的无向图。
     有向完全图:有 n(n-1) 条边的有向图。

    ⑥邻接矩阵:无向图的邻接矩阵关于主对角线对称,在整个矩阵中非零元素的个数等于边个数的2倍,第i行和第i列中非零元素的个数等于该结点的度。
    在这里插入图片描述
    ⑦ 邻接表:无向图的邻接矩阵关于主对角线对称,在整个矩阵中非零元素的个数等于边个数的2倍,第i行和第i列中非零元素的个数等于该结点的度。
    在这里插入图片描述在这里插入图片描述
    ⑧ 深度优先遍历:

    在这里插入图片描述
    ⑨ 广度优先遍历:
    在这里插入图片描述
    ⑩ 最小生成树:
    普里姆算法(Prim):连相邻权值最小的。
    在这里插入图片描述
    克鲁斯卡尔算法(Kruskal):先连权值最小的,再依次连。
    在这里插入图片描述
    ⑪ 拓扑排序:由某个集合上的一个偏序得到该集合上的一个全序的操作。在这里插入图片描述
    ⑫顺序查找法平均查找长度:ASL=(n+1)/2。
     折半查找法(二分查找法)平均查找长度:ASL=(n+1)/n*log2(n+1)-1
     索引顺序表查找法(分块查找法)平均查找长度:ASL≈log2(n/s+1)+s/2。

    ⑬ 直接插入排序:将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表。
    在这里插入图片描述
    ⑭ 冒泡排序:首先将一个记录的关键字和第二个记录的关键字进行比较,若为逆序(即L.r[1].key>L.r[2].key),则将两个记录交换之,然后比较第二个记录和第三个记录的关键字。以此类推,直至第n-1个记录和第n个记录的关键字进行过比较为止。在这里插入图片描述
    ⑮ 快速排序:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。在这里插入图片描述
    ① 顺序表是随机存储结构,当线性表的操作 主要是查找时,宜采用以插入和删除操作为主的线性表宜采用 链表 做存储结构。若 插入和删除主要发生在表的首尾两端,则宜采用尾指针表示的单循环链表。

    ② 在顺序栈中有“上溢”和“下溢”的现象,“上溢”是栈顶指针指出栈的外面是出错状态,“下溢”可以表示栈为空栈,因此用来作为控制转移的条件。

    ③ 队列 是一种运算受限的线性表,允许删除的一端称为队头(front),允许插入的一端称为队尾(rear) ,队列的操作原则是先进先出的,又称作FIFO表。队列也有顺序存储和链式存储两种存储结构。

    ④循环队列:判定循环队列是空还是满,方法有三种:
     一种是另设一个布尔变量来判断;
     第二种是少用一个元素空间,入队时先测试((rear+1)%m = front)? 满:空;
     第三种就是用一个计数器记录队列中的元素的总数。

    ⑤ 队列的链式存储结构称为链队列,为了便于在表尾进行插入(入队)的操作,在表尾增加一个尾指针,一个链队列就由一个头指针和一个尾指针唯一地确定。链队列不存在队满和上溢的问题。
    在链队列的出队算法中,要注意当原队中只有一个结点时,出队后要同进修改头尾指针并使队列变空。

    ⑥ 串是零个或多个字符组成的有限序列。
     空串:是指长度为零的串,也就是串中不包含任何字符(结点)
     空白串:指串中包含一个或多个空格字符的串。

    ⑦ 子串在主串中的序号就是指子串在主串中首次出现的位置。空串是任意串的子串,任意串是自身的子串。

    ⑧ 串的基本运算有:
     求串长strlen(char*s) 串复制strcpy(char*tochar*from
     字符定位strchr(char*scharc) 串联接strcat(char*tochar*from
     串比较charcmp(char*s1char*s2

    ⑨地址的计算方法:
     按行优先顺序排列的数组:LOCa(ij)=LOCa(11)+((i-1)*n+(j-1))*d
     按列优先顺序排列的数组:LOCa(ij)=LOCa(11)+((j-1)*n+(i-1))*d

    ⑩图的存储结构:
     邻接矩阵表示法:用一个n阶方阵来表示图的结构是唯一的;无向图中邻接矩阵是对称的;有向图中行是出度,列是入度。
     邻接表表示法:用顶点表和邻接表构成不是唯一的;顶点表结构 vertex | firstedge,指针域存放邻接表头指针;邻接表是用头指针确定。

    ⑪图的遍历:
     深度优先遍历:借助于邻接矩阵的列。使用栈保存已访问结点。
     广度优先遍历:借助于邻接矩阵的行。使用队列保存已访问结点。

    ⑫ 直接插入排序:
    在这里插入图片描述
    ⑬ 直接选择排序:在这里插入图片描述
    ⑭ 冒泡排序:在这里插入图片描述
    ⑮ 快速排序:在这里插入图片描述

    ① n个结点的二叉树共有 2n 个指针域,其中有 n-1 个指针域是存放了地址,有 n+1 个指针是空指针。

    ② 在一个具有n个顶点的无向完全图中,包含有 e 条边,在一个具有n个顶点的有向完全图中,包含有 2e 条边。

    ③ 在堆排序的过程中,对任一分支结点进行筛运算的时间复杂度为 O(log2n),整个堆排序过程的时间复杂度为 O(nlog2n)。

    ④ AOV网是一种 有向无回路 的图。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    ⑤ 设哈夫曼树中的叶子结点总数为m,若用二叉链表作为存储结构,则该哈夫曼树中总共有 2m 个空指针域。(m个叶子节点的哈夫曼树总共有2m-1个节点)

    ⑥ 设顺序循环队列Q[0:M-1]的头指针和尾指针分别为F和R,头指针F总是指向队头元素的前一位置,尾指针R总是指向队尾元素的当前位置,则该循环队列中的元素个数为 (R-F+M)%M。

    ⑦ 快速排序的最坏时间复杂度为 O(n2),平均时间复杂度为 O(nlog2n)。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    ⑧ 数据的物理结构主要包括 顺序存储结构链式存储结构 两种情况。

    ⑨ 二分查找的过程可以用一棵二叉树来描述,该二叉树称为二叉判定树。在有序表上进行二分查找时的查找长度 不超过 二叉判定树的高度 1+log2n。
    在这里插入图片描述
    在这里插入图片描述
    ⑩ 设有n个无序的记录关键字,则直接插入排序的时间复杂度为 O(n2),快速排序的平均时间复杂度为 O(nlog2n)。

    ⑪ 设指针变量p指向双向循环链表中的结点X,则删除结点X需要执行的语句序列为 p>llink->rlink=p->rlink ; p->rlink->llink=p->rlink(设结点中的两个指针域分别为llink和rlink)。

    ⑫ 设有一个顺序循环队列中有M个存储单元,则该循环队列中最多能够存储 m-1 个队列元素;当前实际存储 (R-F+M)%M 个队列元素(设头指针F指向当前队头元素的前一个位置,尾指针指向当前队尾元素的位置)。

    ⑬ 设某无向图G中有n个顶点,用邻接矩阵A作为该图的存储结构,则顶点i和顶点j互为邻接点的条件是 A[i][j]=1。
    在这里插入图片描述
    在这里插入图片描述
    ⑭ 数据项是不可分割的构成数据元素的最小单位;数据元素是数据的基本单位。

    ⑮ 设一个有序的单链表中有n个结点,现要求插入一个新结点后使得单链表仍然保持有序,则该操作的时间复杂度为 O(n)。
    两方面:一是插入时间复杂度O(1);二是保持有序时间复杂度O(n)

    ⑯ 设一棵m叉树中度数为0的结点数为N0,度数为1的结点数为Nl,……,度数为m的结点数为Nm,则N0= l+N2+2N3+3N4+……+(m-1)Nm。
    【注解】由2叉树的性质引申出,对于任何一颗树T,如果其终端结点树为n0 度为i的结点数为ni,则n0=1+n2+2n3+···+(i-1)ni

    ⑰ 设有一个顺序共享栈S[0:n-1],其中第一个栈项指针top1的初值为-1,第二个栈顶指针top2的初值为n,则判断共享栈满的条件是 top1+1=top2。

    ⑱ 在图的邻接表中用顺序存储结构存储表头结点的优点是 可以随机访问到任一个顶点的简单链表。

    ⑲设一条单链表的头指针变量为head且该链表没有头结点,则其判空条件是 head==0
     不带头结点是 head==NULL,带头结点是 head->next==NULL
     设带有头结点的单向循环链表的头指针变量为head,则其判空条件是 head->next==head。

    ⑳ 设二叉树的先序遍历序列和后序遍历序列正好相反,则该二叉树满足的条件是 只有一个孩子节点(或 高度等于其结点数)。

    ① 设指针变量front表示链式队列的队头指针,指针变量rear表示链式队列的队尾指针,指针变量s指向将要入队列的结点X,则入队列的操作序列为 rear->next=s ;rear=s。(注意:入队要从队尾入)

    ② 设指针变量p指向单链表中结点A,指针变量s指向被插入的新结点X,则进行插入操作的语句序列为 s->next=p->next ; p->next=s(设结点的指针域为next)。

    ③ 设F和R分别表示顺序循环队列的头指针和尾指针,则判断该循环队列为空的条件为 F==R

    ④ 设二叉树中结点的两个指针域分别为lchild和rchild,则判断指针变量p所指向的结点为叶子结点的条件是
    p->lchild==NULL && p->rchild==NULL

    ⑤ 散列表中解决冲突的两种方法是 开放定址法链地址法
    在这里插入图片描述
    在这里插入图片描述
    ⑥ 设指针变量top指向当前链式栈的栈顶,则删除栈顶元素的操作序列为 top=top->next;
     若指针变量top指向当前顺序栈的栈顶,则删除栈顶元素的操作序列为 top=top-1

    ⑦ 设指针变量p指向双向链表中的结点A,指针变量s指向被插入的结点X,则在结点A的后面插入结点X的操作序列为
    s->left=p;s->right=p->right;p->right=s; p->right->left=s;
    (设结点中的两个指针域分别为left和right)。

    ⑧ 解决散列表冲突的两种方法是 开放定址法链地址法
    在这里插入图片描述
    ⑨ 设指针变量p指向单链表中结点A,指针变量s指向被插入的结点X,则在结点A的后面插入结点X需要执行的语句序列:s->next=p->next ; p->next=s 。

    ⑩ 设指针变量head指向双向链表中的头结点,指针变量p指向双向链表中的第一个结点,则指针变量p和指针变量head之间的关系是p=head->rlink 和head=p->llink(设结点中的两个指针域分别为llink和rlink)。

    ⑪ 设指针变量p指向双向链表中结点A,指针变量s指向被插入的结点X,则在结点A的后面插入结点X的操作序列为
    s->left=p;s->right=p->right;p->right->left=s; p->right=s;。
    在这里插入图片描述
    ⑫ 设散列表中有m个存储单元,散列函数H(key)= key % p,则p最好选择 小于等于m的最大素数。

    ⑬设顺序线性表的长度为30,分成5块,每块6个元素,如果采用分块查找,则其平均查找长度为 6.5。
     设分块查找中将长为 n 的表分成均等的 b 个块,每块 s 个元素,则 b = (n / s)上取整。
     如果索引表中采用顺序查找,则ASL=(b+1)/2+(s+1)/2;
     如果索引表中采用折半查找,则ASL=(s+1)/2+log2(b+1)-1;

    ⑭ 设指针p指向单链表中结点A,指针s指向被插入的结点X,则在结点A的前面插入结点X时的操作序列为:

    1. s->next= p->next;2) p->next=s;3) t=p->data;
    2. p->data= s->data;5) s->data=t;
      在这里插入图片描述
      在这里插入图片描述
      ⑮设某链表中最常用的操作是在链表的尾部插入或删除元素,则选用下列 双向循环链表 存储方式最节省运算时间。
       如果只是插入元素,单向循环列表就可以了;
       如果还需要删除元素,就要双向循环列表,可以最快的找到尾节点的前一个节点。

    ⑰ 有N个关键字排序,各排序最大最小情况如下:

    在这里插入图片描述

    ⑱ 快速排序算法的平均时间复杂度为 O(nlog2n),直接插入排序算法的平均时间复杂度为 O(n^2)。

    ⑲ 设一棵m叉树脂的结点数为n,用多重链表表示其存储结构,则该树中有 n(m-1)+1 个空指针域。
    【注解】m叉树n个结点,得出总的指针域为m*n,不为空的指针域就等于分枝数,根结点没有分支指向它,推出非空指针域为n-1,总指针域减非空指针域就等于空的指针域即m*n-(n-1)

    ⑳ 设指针变量p指向单链表中结点A,则删除结点A的语句序列为:
    q=p->next;p->data=q->data;p->next= q->next;feee(q);

    ① 数据结构从逻辑上划分为三种基本类型:线性结构,树型结构 和 图型结构。

    ② 设无向图G中有n个顶点e条边:则用邻接矩阵作为图的存储结构进行深度优先或广度优先遍历时的时间复杂度为 O(n^2);
     用邻接表作为图的存储结构进行深度优先或广度优先遍历的时间复杂度为 O(n+e)。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    ③ 邻接表是图的一种 链式存储结构

    ④ 树最适合用来表示 元素之间具有分支层次关系的数据。

    ⑤ 在一个单链表中,若要删除由指针q所指向结点的后继结点(若存在),则执行 p=q->next;q->next=p->next 操作。

    ⑥ 常对数组进行的两种基本操作是 索引修改

    ⑦ 在一个单链表中,已知q所指结点是p所指结点的直接前驱,若在q和p之 间插入s所指结点,则执行 q->next=s; s->next=p 操作。
    在这里插入图片描述
    ⑧ 设有两个串p和q,求q在p中首次出现的位置的运算称作 模式匹配。

    ⑨ 一个高度为h的满二叉树共有n个结点,其中有m个叶子结点,则有
    n=2m-1 成立。

    ⑩ 实现图的广度优先搜索遍历算法需要使用 队列,深度优先搜索遍历算法需要使用 栈。

    ⑪ 顺序表中逻辑上相邻的元素的物理位置必定相邻。单链表中逻辑上相邻的元素的物理位置不一定相邻。

    ⑫ 树的先序对应二叉树的先序,树的后序对应二叉树的中序。

    ⑬ 在 n(n>0) 个元素的顺序栈中删除1个元素的时间复杂度为: O(1)。

    ⑭设 SQ 为循环队列,存储在数组 d[m] 中,则 SQ 出队操作对其队头指针 front 的 修改是 front = (front+1)%m  。
     对于一个以顺序实现的循环队列Q[0…m-1],队头、队尾指针分别为f、r,其判空的条件是 r=f,判满的条件是 (r+1)%m=f

    ① 设计一个判别表达式中括号是否匹配出现的算法,采用 栈 的数据结构最佳。

    ② 设广义表L=((a,b,c)),则L的长度为1,深度为2。

    ③ 衡量查找算法效率的主要标准是 平均查找长度

    ④ 栈和队列都是 限制存取点的线性结构。

    ⑤ 在稀疏矩阵的三元组顺序表中,每个三元组表示 矩阵中非零元素的行号、列号和数据值。

    ⑥ 顺序结构逻辑上相邻的结点物理上也是相邻的。因此,其存储密度大,存储空间利用串高。

    ⑦ 含有n个结点的二叉树采用二叉链表存储时,空指针域的个数为 n+1,非空指针个数为 n-1。

    ⑧ 在数据结构中,从存储结构上可以将之分为 顺序存储和非顺序存储;从逻辑结构上可以将之分为 线性结构和非线性结构。

    ⑨ 深度优先遍历类似二叉树的 先序遍历;广度优先遍历类似二叉树的 层次遍历。

    ⑩ n个顶点的有向图最多有 n(n-1)条边;无向图最多有 n(n-1)/2 条边。

    ⑪ 如果要求用线性表既能较快地查找,又能适应动态变化的要求,则可采用 分块查找。

    ⑫ 任意一棵二叉树的叶子结点在其先序、中序和后序序列中的相对位置 不发生变化。

    ⑬ 在单链表指针为p的结点之后插入指针为s的结点,正确的操作是 s->next=p->next;p->next=s。

    ⑭ 某算法的时间复杂度是O(n^2),表明该算法的 执行时间与n^2成正比。

    ⑮ 对于一个具有n个顶点和e条边的无向图,若采用邻接表表示,则表头向量的大小为 n,占用的存储空间为 2e。

    ⑯ 对于顺序表,访问某结点的时间复杂度为 O(1),删除某结点的时间复杂度为 O(n)。

    ⑰ 以数据集{4,5,6,7,10,12,18}为结点权值,画出构造的哈弗曼树,并计算其带权路径长度。

    ⑱广义表(a,(b,c),d,e)的表头为 a。
     已知广义表L=(a,(b,(c,(d)), e), f ),则:
     L1=Tail(L)=((b,(c,(d)), e), f )
     L2=Head(L1)= (b,(c,(d)), e)
     L3=Tail(L2)=((c,(d)), e)
     L4=Head(L3)=(c,(d))
     L5=Head(L4)= c

    ⑲ 树最适合用来表示的结构是 元素间具有分支层次关系的结构。

    ⑳ 图G是一个非连通无向图,共有28条边,则该图至少有 9 个顶点。

    ① 栈的特点是 一个线性结构,数据先进后出,且只能在栈顶进行增删操作。

    ② 与数据元素本身的形式、内容、相对位置、个数无关的是数据的 逻辑结构。

    ③ 数据结构被形式定义为(D, R),其中D是 数据元素 的有限集合,R是D上的 关系 有限集合。

    ④ 当利用大小为N的数组顺序存储一个栈时,假定用top= =N表示栈空,则向这个栈插入一个元素时,首先应执行 top-- 语句修改top指针。

    ⑤ 设有一个字符串S=“abcdefgh”,问该串的最大子串个数为 37。

    ⑥ 若StrIndex(S,T)表示求T在S中的位置的操作,则对于S=“Beijing and Nanjing”,T=“jing”,StrIndex(S,T)的结果为4。

    ⑦ 字符串按存储方式可以分为:顺序存储、链接存储和 堆分配存储。

    ⑧ 在C语言中,以字符 \0表示串值的终结。

    ⑨ A[N, N]是对称矩阵,将下三角(含对角线)以行序存储到一维数组arr[N(N+1)/2]中,则对任一上三角元素arr[i, j]对应arr[k]的下标k是:解析如下
    在这里插入图片描述
    ⑩ 有一个100*90的稀疏矩阵,非零元素有10个,设每个整型数占2个字节,则用三元组表示该矩阵时,所需的字节数是 66。
    在这里插入图片描述
    ⑪ 已知广义表LS=((a, b, c),(d, e, f)),对其运用Head和Tail运算,取出其中原子e的运算是 Head(Tail(Head(Tail(LS))))

    ⑫ 画出广义表((((a),b)),(((), d),(e,f)))的链式存储结构图示。
    在这里插入图片描述
    ⑬ 引入二叉线索树的目的是 加快查找结点的前驱或后继的速度。

    ⑭ 利用二叉链表存储一般树,则根结点的右指针是 空;因为左孩子右兄弟,根节点无兄弟。

    ⑮ 深度优先遍历类似于二叉树的 先序遍历;广度优先遍历类似于二叉树的 层次遍历。

    ⑯ 用邻接表表示图进行广度优先遍历时,通常借助 队列 来实现算法。
    用邻接表表示图进行深度优先遍历时,通常借助 栈 来实现算法。

    ⑰ 拓扑排序 方法可以判断出一个有向图是否有环。

    ⑱ 图中的一条路径长度为k,该路径所含的顶点数为 K+1。

    ⑲ 数据的最小单位是 数据项。

    ⑳ 设一个有序的单链表中有 n 个结点, 现要求插入一个新结点后使得单链表仍然保持有序, 则该操作的时间复杂度为 O(n)。

    ① 在图的邻接表中用顺序存储结构存储表头结点的优点是 可以随机访问到任意点的简单链表。

    ② 设一棵 m叉树中度数为 0 的结点数为 N0,度数为 1 的结点数为 Nl,……,度数为 m的结 点数为 Nm,则 N0= l+N 2+2N3+3N4+…… +(m-1)Nm 。
    在这里插入图片描述
    ③ 设有一个 n 阶的下三角矩阵 A,如果按照行的顺序将下三角矩阵中的元素(包括对角线 上元素)存放在 n(n+1) 个连续的存储单元中,则 A[i][j] 与 A[0][0] 之间有 i*(i+1)/2+j -1或i*(i+1)/2+i个数据元素。
    在这里插入图片描述
    ④设一条单链表的头指针变量为 head且该链表没有头结点,则其判空条件是 head==0

    head为指向表头结点的指针,分别写出带有头结点的单链表、单项循环链表和双向循环链表判空的条件:
    单链表 NULL==head->next
    单向循环 head==head->next
    双向循环 head==head->next&&head==head->prior

    ⑤ head为指向表头结点的指针,分别写出不带有头结点的单链表、单项循环链表和双向循环链表判空的条件:
    单链表 NULL==head
    单向循环 head==head->next
    双向循环 head==head->next&&head==head->prior

    ⑥ 设F和R分别表示顺序循环队列的头指针和尾指针,则判断该循环队列为空的条件为F==R。

    ⑦ 散列表中解决冲突的两种方法是 开放地址法链接法

    ⑧ 设指针变量 top 指向当前链式栈的栈顶,则删除栈顶元素的操作序列为 top=top->next。

    ⑨ 设关键字序列为 (Kl ,K2,⋯, K n) ,则用筛选法建初始堆必须从第 n/2 个元素开始进行筛选。

    ⑩ 建立一个长度为 n 的有序单链表的时间复杂度为 O(n^2)。

    ⑪ 设顺序表的长度为 n,则顺序查找的平均比较次数为 (n+1)/2。

    ⑫ 设顺序线性表的长度为 30,分成 5 块,每块 6 个元素,如果采用分块查找,则其平均查 找长度为 6.5。
    在这里插入图片描述
    ⑬ 在堆排序中,对n个记录建立初始堆需要调用 n/2 次调整算法。

    ⑭ 已知一棵完全二叉树中共有768结点,则该树中共有 384 个叶子结点。
    在这里插入图片描述
    ⑮ 一个一维数组a[10]中存储着有序表(15,26,34,39,45,56,58,63,74,76),根据折半搜索所对应的判定树,写出该判定树中度为1的结点个数,并求出在等概率情况下进行成功搜索时的平均搜索长度。度为1的结点个数:3;平均搜索长度:29/10。

    ⑯ 一维数组中有n个数组元素,则读取第i个数组元素的平均时间复杂度为 O(1)。
    解析:数组是随机访问的数据结构,平均时间复杂度为O(1)

    ⑰ 含n个顶点的无向连通图中至少含有 n-1 条边。

    ⑱ 顺序表中,逻辑上相邻的元素,其物理位置也相邻,在链表中,逻辑上相邻的元素,其物理位置不一定相邻。

    ⑲ 利用三元组表存放稀疏矩阵中的非零元素,则在三元组表中每个三元组元素对应一个非零元素的行号、列号和 值。

    ⑳ 数据的逻辑结构是从逻辑关系上描述数据,它与数据的 存储(或存储结构) 无关,是独立于计算机的。

    ① 区分循环队列的满与空,有三种方法,它们是 少用一个存储单元、设置一个标志位 和 设置一个计数器。

    ② 根据线性表的链式存储结构中每一个结点包含的指针个数,将线性链表分成 单链表和双链表。

    ③ 数据结构中评价算法的两个重要指标是 时间复杂度 和 空间复杂度。

    ④ 最大容量为n的循环队列,队尾指针是rear,队头是front,则队空的条件是 rear==front队满条件是 (rear+1)%n==front;当前队列中的元素个数为 (rear-front+n)%n

    ⑤ 一个递归算法必须包括 终止条件和递归部分。

    ⑥ 循环队列存储在数组A[0…m]中,则入队时的操作为 rear=(rear+1) mod (m+1)。

    ⑦ 设计一个判别表达式中左,右括号是否配对出现的算法,采用 栈 数据结构最佳。

    ⑧元素的移动次数与关键字的初始排列次序无关的是:基数排序
     元素的比较次数与初始序列无关是:选择排序
     算法的时间复杂度与初始序列无关的是:直接选择排序

    ⑨ 若一个栈以向量V[1…n]存储,初始栈顶指针top为n+1,则下面x进栈的正确操作是:top=top-1; V[top]=x。

    ⑩ 利用带头结点的二叉链表存储树,则根结点的右指针是 空。二叉链表:左孩子右兄弟,根节点没有兄弟,所以为空 。

    ⑪ 设二叉排序树的高度为h,则在该树中查找关键字key最多需要比较 h次。

    ⑫ 入栈操作和入队列操作在链式存储结构上实现时不需要考虑栈溢出的情况。正确,链式存储结构是动态分配空间的。

    ⑬ 用邻接矩阵作为图的存储结构时,则其所占用的存储空间与图中顶点数有关。图的邻接矩阵存储所占用空间大小只与顶点个数有关,更准确地说,设顶点n个,则与n^2成正比

    ⑭ 设一维数组中有n个数组元素,则读取第i个数组元素的平均时间复杂度为 O(1)。

    ⑮ 堆是完全二叉树,完全二叉树不一定是堆。

    ⑯ 不论线性表采用顺序存储结构还是链式存储结构,删除值为X的结点的时间复杂度均为O(n)。

    ⑰ 设一组初始记录关键字序列(k1,k2,……,kn)是堆,则对i=1,2,…,n/2而言满足的条件为 ki<=k2i && ki<=k2i+1。

    ⑱ 设一组初始记录关键字序列为(345,253,674,924,627),则用基数排序需要进行3趟的分配和回收才能使得初始关键字序列变成有序序列。

    ⑲ 设有序顺序表中有n个数据元素,则利用二分查找法查找数据元素X的最多比较次数不超过 log2n+1。在这里插入图片描述
    ⑳ 画出广义表LS=(( ) , (e) , (a , (b , c , d )))的头尾链表存储结构。在这里插入图片描述
    21 设散列表的地址范围是[ 0…9 ],散列函数为H(key)= (key 2 +2)MOD 9,并采用链表处理冲突,请画出元素7、4、5、3、6、2、8、9依次插入散列表的存储结构。
    H(4)=H(5)=0,H(3)=H(6)=H(9)=2,H(8)=3,H(2)=H(7)=6
    在这里插入图片描述
    ① 二分查找的过程可以用一棵二叉树来描述,该二叉树称为二叉判定树。在有序表上进行二分查找时的查找长度不超过二叉判定树的高度1+log2n。

    ② 设某链表中最常用的操作是在链表的尾部插入或删除元素,则选用下列 双向循环链表 存储方式最节省运算时间。

    ③ 将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是n次,最多2n-1次。

    ④循环队列存储在数组A[0…m]中,则入队时的操作为 rear=(rear+1)%(m+1)
     入队是:rear=(rear+1)%(m+1) //m+1 代表有m+1个空间 。。它是0到m的数组
     出队是: front =(front+1)%(m+1)

    ⑤ 循环队列放在一维数组A[0…M-1]中,end1指向队头元素,end2指向队尾元素的后一个位置。假设队列两端均可进行入队和出队操作,队列中最多能容纳M-1个元素。初始时为空。则 队空:end1==end2;队满:end1==(end2+1)mod M

    ⑥ 一个栈的入栈序列为1,2,3,…,n,其出栈序列是p1,p2,p3…,pn。若p2=3,则p3可能取值的个数是 n-1;
    在这里插入图片描述
    ⑦ 图的BFS生成树的树高小或相等DFS生成树的树高。

    例题】线性 表( a1, a2,…, an)采用顺序存储结构。试问:
    (1) 在等 概率 的 前提下, 平均 每 插入 一个 元素 需要 移动 的 元素 个数 为 多少?
    (2) 若 元素 插在 ai 与 ai+ 1 之间( 0 ≤ i ≤ n- 1) 的 概率 为, 则 平均 每 插入 一个 元素 所要 移动 的 元素 个数 又是 多少?
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    ① 线性表的顺序存储结构是一种 随机存取 的存储结构,线性结构的链式存储是一种 顺序存取 的存储结构。

    ② 数据结构是一门研究非数值计算的 操作对象 以及它们之间的 关系 和运算等的学科。

    ③ 一个数据结构在计算机 存储器内的表示 称为存储结构。

    ④ 链栈和顺序栈相比较,有一个较为明显的优点是 通常不会出现栈满的情况。

    ⑤ 引入循环队列的目的是为了克服 “假溢出”现象。

    ⑥ 区分循环队列的满与空,只有两种方法,它们是 牺牲一个存储单元 和 设标记。

    ⑦ 设循环队列存放在向量data[0…M]中,则队头指针front 在循环意义下的出队操作可表示为 front=(front+1)%(M+1),若用牺牲一个单元的办法来区分队满和队空(设队尾指针rear),则队满的条件为 front==(rear+1)%(M+1)。

    ⑧ 对于长度为n且顺序存储的线性表,在任何位置上操作都是等概率的情况下,插入一个元素需要平均移动表中的元素个数 ;删除一个元素平均需要移动表中元素 。

    ⑨ 在一个不带头结点的单链表中,在表头插入或删除与在其他位置上插入或删除其操作过程 不相同。

    ⑩ 在线性表的顺序存储中,元素之间的逻辑关系是通过 存储位置 决定的;在线性表的链式存储中,元素之间的逻辑关系是通过 指针 决定的。

    ⑪ 单链表表示法的基本思想是用 指针 表示结点的逻辑关系。

    ⑫ 数据的逻辑结构是指数据元素间的逻辑关系,数据的存储结构是数据在计算机中的表示(又称映像)方法,是数据的逻辑结构在计算机中的存储实现。

    ⑬ 数据的物理结构包括 数据元素 的表示和数据元素间关系的表示。

    程序=数据结构+算法。

    ⑮线性表L=(a1, a2, …, an)用数组表示,假定删除表中任一元素的概率相同,则删除一个元素平均需要移动元素的 (n-1)/2;
     线性表L=(a1, a2, …, an)用数组表示,假定删除表中任一元素的概率相同,则插入一个元素平均需要移动元素的 n/2。

    ⑯ 一个字符串中 任意个连续的字符组成的子序列 称为该串的子串。

    ⑰ 设T和P是两个给定的串,在T中寻找等于P的子串的过程称为 模式匹配,又称P为 模式串。

    ⑱ 串是一种特殊的线性表,其特殊性表现在 其数据元素都是字符;

    ⑲ 串的两种最基本的存储方式是 顺序存储、链式存储;

    ⑳ 两个串相等的充分必要条件是 两串的长度相等且两串中对应位置的字符也相等。

    ① 若度为m的哈夫曼树中,其叶结点个数为n,则非叶结点的个数为 [(n-1)/(m-1)](向上取整)

    ② 树的后根遍历序列等同于该树对应的二叉树的 中序序列。

    ③ 若二叉树采用二叉链表存储结构,要交换其所有分支结点左、右子树的位置,利用 后序 遍历方法最合适。

    ④ 一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足 只有一个叶子结点。

    ⑤ 某二叉树的前序序列和后序序列正好相反,则该二叉树一定是 高度等于其结点数 的二叉树。

    ⑥ 线索二叉树是一种 物理或存储 结构。

    ⑦ n个结点的线索二叉树上含有的线索数为 n+l(即空指针域个数)。

    ⑧ 中序线索树 的遍历仍需要栈的支持。

    ⑨ 设F是一个森林,B是由F变换得的二叉树。若F中有n个非终端结点,则B中右指针域为空的结点有 n+1 个。

    ⑩ 个有n个结点的图,最少有 1个连通分量,最多有 n个连通分量。

    ⑪ 用有向无环图描述表达式(A+B)*((A+B)/A),至少需要顶点的数目为 5。
    在这里插入图片描述
    ⑫ 如果含n个顶点的图形形成一个环,则它有 n 棵生成树。

    ⑬ 对稀疏图最好用 克鲁斯卡尔(Kruskal) 算法求最小生成树,对稠密图最好用 普里姆(Prim) 算法求最小生成树。

    ⑭ 判断一个无向图是一棵树的条件是 n个顶点,n-1条边的无向连通图。

    ⑮ 有向图G的强连通分量是指 有向图的极大强连通子图。

    ⑯ N个顶点的无向连通图至少有N-1条边,则邻接矩阵中至少有2(N-1)个非零元素。

    ⑰ 在AOE网中,从源点到汇点路径上各活动时间总和最长的路径称为 关键路径。

    ⑱ AOV网中,结点表示 活动,边表示 活动间的优先关系;AOE网中,结点表示 事件,边表示 活动边上的权代表活动持续时间。

    ⑲ 二叉查找树的查找效率与二叉树的 树型 有关, 在 呈单枝树 时其查找效率最低,

    ⑳ 堆排序是 选择 类排序,堆排序平均执行的时间复杂度 O(nlog2n) ;需要附加的存储空间复杂度分是O(1)

    ① 设一维数组中有 n 个数组元素,则读取第 i 个数组元素的平均时间复杂度为 O(1)

    ② 在二叉排序树中插入一个结点的时间复杂度为 O(n)

    ③ 设二叉树的先序遍历序列和后序遍历序列正好相反,则该二叉树满足的条件是 高度等于其结点数。

    展开全文
  • 数据结构是指数据对象以及该数据对象集合中的数据元素之间的相互关系(即数据元素的组织形式)。 例如,有一张学生体检情况登记表,记录了一个班的学生的身高、体重等各项体检信息。这张登记表中,每个学生的各项...
    • 数据结构是指数据对象以及该数据对象集合中的数据元素之间的相互关系(即数据元素的组织形式)。
    • 例如,有一张学生体检情况登记表,记录了一个班的学生的身高、体重等各项体检信息。这张登记表中,每个学生的各项体检信息排在一行上,这个表就是一个数据结构,每个记录(姓名、学号、身高和体重等字段)就是一个结点,对于整个表来说,只有一个开始结点(它的前面无记录)和一个终端节点(它的后面无记录),其他的结点则各有一个也只有一个直接前驱和直接后继(它的前面和后面均只有一个记录)、这几个关系就确定了这个表的***逻辑结构***是线性的。
    • 这个表中的数据如何存储到计算机中,并且如何表示数据元素之间的关系呢?即用一片连续的内存单元来存放这些记录(例如用数组表示)还是随机存放各结点数据再用指针及进行连接呢?这就是***存储结构***的问题。
    • 在这个表的某种存储结构基础上,可以实现对这张表中的记录进行查询、修改、删除等操作。对这个表可以进行哪些操作以及如何实现这些操作就是数据的运算问题了。
    展开全文
  • 数据结构之顺序表

    千次阅读 2021-02-06 19:23:34
    顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素...
  • 数据结构中的status

    千次阅读 2021-07-22 15:39:18
    用status表示int类型,这样做是因为使程序更容易明白,因为用int的时候你不知道是干嘛的,但是用status时就知道是用来表示状态的,虽然都是int类型。用status表示int类型,这样做是因为使程序更容易明白,因为用int...
  • lnode(数据结构lnode是什么类型)

    千次阅读 2021-05-24 07:59:25
    请问LNode在C语言中代表什么,英语全称是什么是数据结构中定义链表的英文名称,代表链表中的结点, 可以查阅c中链表那一章的相关内容.数据结构Lnode *是代表什么!??大侠 谢谢!!是一个 指针类型是吗???.你好...
  • 文章目录ECharts简介使用场景实现步骤1、引入Echarts并且绘制一个简单的图表(html)2、创建一个折线图(js)3、了解ECharts需要的数据结构4、后台将数据整合返回给ECharts ECharts简介 ECharts,缩写来自Enterprise...
  • 数据结构:八种数据结构大全!

    千次阅读 多人点赞 2021-07-29 12:36:10
    数据结构 1.1 数据结构概述 数据结构是计算机存储、组织数据的方式;通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构的优良将直接影响着我们程序的性能;常用的数据结构有:数组(Array)...
  • 老周以前也写过关于跳表的数据结构,但那是纯数据结构方面来分析的,今天我们就来从跳跃表在 Redis 中的底层实现方向来分析。我们都知道 Redis 有五种常用的数据结构:String、Hash、List、Set 以及 ZSet,其中 ZSet...
  • 什么是数据结构和算法?

    千次阅读 2021-01-07 23:21:46
    文章目录一、什么是数据结构? 一、什么是数据结构数据结构就是在计算机中,存储和组织数据的方式。
  • 数据结构中,树是一对多的存在,如下图是一颗树。 结点拥有的子树称为子树的度,比如结点①的度为4,结点②的度为0,结点③的度为3。 对于树而言,树的度为树内各结点最大的度,从图中可知,这棵树的度为4。 ...
  • 什么要学习数据结构和算法?

    千次阅读 多人点赞 2021-11-07 13:06:24
    是不是觉得数据结构和算法,跟os、计网一样,属于脱离实际工作的屠龙术? 除了面试,其实这辈子也用不着? 尽管计算机专业同学在大学都学过这些课程,甚至很多培训机构也会培训,但很多程序员对数据结构和算法依旧...
  • 数据结构是计算机存储、组织数据的方式。一种好的数据结构可以带来更高的运行或者存储效率。数据在内存中是呈线性排列的,但是我们可以使用指针等道具,构造出类似“树形”的复杂结构。下面介绍八个常见的数据结构
  • 如何学好数据结构?

    千次阅读 2021-03-10 11:49:56
    这两年来,每次有读者问我学数据结构和算法有什么好的图文课程,我都会推荐王争的《数据结构与算法之美》,毫不夸张的说,这是市面上最实用又全面的算法教程,口碑特别好(10W+的订阅量与评论区的大量好评),目前...
  • 什么?程序竟然等于数据结构 + 算法?这个公式是大师 Niklaus Wirth 在 1976 年提出来的,40 多年过去了,这个公式还成立吗?对于做 Java 开发的朋友,可能会更加的赞...
  • 专升本计算机综合-数据结构

    千次阅读 2021-04-09 23:09:05
    数据结构数据结构是数据的组织形式,可以用来表征特定的对象数据。...1.1 什么是数据结构数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下
  • 王道考研数据结构笔记

    万次阅读 多人点赞 2021-04-15 22:43:48
    ##2022王道考研数据结构笔记 第二章 线性表(更新中) 我也看得太慢了吧sos 2.1 线性表的定义和基本操作 要点: 线性表的基本操作——创销、增删、改查 传入参数时,何时要用引用 & 2.2 线性表的顺序表示 ...
  • 数据结构与算法必知基础知识

    千次阅读 多人点赞 2021-01-06 22:58:12
    原创公众号:bigsai 文章已收录在 全网都在关注的数据结构与算法学习仓库 欢迎star 前言 数据结构与算法是程序员内功体现的重要标准...为什么学习数据结构与算法?如果你还是学生,那么这门课程是必修的,考研基本也.
  • 数据结构中的有序和无序

    千次阅读 2021-05-13 10:53:54
    数据结构中的有序和无序 文章开头首先感谢正在学C++博主 个人最起始的迷惑 我的迷惑来自有序列表这个名词。 在我的印象中有序的数据结构是可以保留插入顺序的一种数据结构。而无序则是指在插入数据时进行了排序、...
  • 数据结构分别为逻辑结构、存储结构(物理结构)和数据的运算。1.数据的逻辑结构是从具体问题抽象出来的数学模型,是描述数据元素及其关系的数学特性的,有时就把逻辑结构简称为数据结构。数据必须在计算机内存储,数据...
  • 王道数据结构笔记

    千次阅读 2021-03-23 16:19:01
    王道数据结构笔记2.2 线性表的顺序表示顺序表的实现——动态分配顺序表的特点总结 2.2 线性表的顺序表示 顺序表的实现——动态分配 由于需要将数据复制到新的区域因此时间开销大 #include <stblib.h> #define ...
  • 数据结构时间复杂度

    千次阅读 2021-01-09 18:55:49
    数据结构的角度分析时间复杂度
  • 数据结构大总结!

    千次阅读 2021-11-23 00:23:51
    前几天,小灰给大家介绍了什么是算法。说到算法,就不能不说起数据结构。今天我来讲一讲,什么是数据结构?程序员怎么学好数据结构?我们介绍算法的时候说过,计算机当中的算法,本质就是一系列程序指令...
  • C++中常用的数据结构

    千次阅读 2021-01-25 23:14:51
    一直以来虽然写的都是C++的代码但是基本上用的都是C的数据结构。这次实现一个相对大型的C++项目,发现了很多很有用的数据结构,通过使用这些数据结构,可以极大程度的提高开发效率。所以计划逐渐整理下C++的数据结构...
  • 数据结构:树(Tree)【详解】

    千次阅读 多人点赞 2021-02-22 10:22:25
    二叉树的顺序存储结构和链式存储结构;二叉树的遍历;线索二叉树的基本概念和构造 树、森林 树的存储结构;森林与二叉树的转换;树和森林的遍历 树与二叉树的应用 二叉排序树;平衡二叉树;哈夫曼树和哈弗编码...
  • 顺序查找 折半查找的平均查找长度分析 ASL:平均查找长度 其中n为查找表中元素个数,Pi为查找第i个元素的概率,通常假设每个元素查找概率相同,Pi=1/n,Ci是找到第i个元素的比较次数。 ASL=∑i=1npici ...
  • 《算法和数据结构》学习路线指引

    万次阅读 多人点赞 2021-07-01 11:16:15
    本文已收录于专栏 《画解数据结构》 饭不食,水不饮,题必须刷 C语言免费动漫教程,和我一起打卡! 《光天化日学C语言》 LeetCode 太难?先看简单题! 《C语言入门100例》 数据结构难?不存在的! 《画解数据结构》 ...
  • 数据结构论文参考文献

    千次阅读 2021-05-26 02:19:04
    数据结构论文参考文献[1]严蔚敏.数据结构C语言版[M].清华大学出版社,2007.[2]舞动的排序算法.http://v.youku.com/v_show/id_XMjU4MTg3MTU2.html.[3]丽水学院在线联系和考试系统.http://acm.lsu.edu.cn.[4]范德宝...
  • 数据结构之单链表

    万次阅读 多人点赞 2021-09-26 18:16:58
    单链表详解一、前言二、什么是链表?2.1、链表的概念:2.2、两种重要的单链表2.3、关于单链表的一些基础知识三、单链表的实现3.1、穷举法创建一个简单的链表3.2、遍历链表3.3、得到链表的长度3.4、头插法3.5、尾插法...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,263,412
精华内容 2,105,364
关键字:

数据结构是什么

数据结构 订阅