八、数据结构

数据结构:

  数据元素的集合(数据对象)及元素间的相互关系(逻辑结构)、构造方法

  目标:学会从问题出发,分析、研究计算机加工的数据结构的特性,以便为应用所涉及的数据选择适当的逻辑结构、存储结构、相应的操作方法,为提高用计算机解决问题的效率服务。

  是算法设计的基础。

  按逻辑关系分类:线性结构、非线性结构(树结构、图结构)  

1.线性结构

  对客观世界中具有单一的前驱、后继的数据关系进行描述

  特点:数据元素之间呈现一种线性关系,即元素"一个接一个地排列"

  存储方法:

    1.顺序存储:用一组地址连续的存储单元依次存储线性表中的数据元素

    

    插入时移动的概率:

    删除时移动的概率:

    2.链式存储:用节点来存储数据元素

    节点:。数据域:存储数据元素的值;指针域:指针,链。存储直接前驱、直接后继的信息

    不能对数据随机访问,但是插入、删除不需要移动元素

    分类:线性链表、双向链表、循环链表、静态链表

    线性链表:单链表。节点中只有一个指针域

    添加、删除:

      示例:

    

    

    

    

    

  栈:“后进先出”。只能通过访问它的一端(栈顶)来实现数据存储、检索的一种线性数据结构

    相关概念:栈底、空栈

    存储结构:

    1.顺序存储:预先定义,容量有限,插入需判断是否栈满

    2.链式存储:不必设置头节点,链表的头指针就是栈顶指针

    

  队列:“先进先出”。只允许在表的一端(队尾)插入元素,另一端(队首)删除元素

     存储结构:

    1.顺序存储:预先定义,容量有限,插入需判断队尾指针是否到达上限。

      队列空、满,队头、队尾都指向相同的位置,区分?:1.设置标志位,指示队列空?满?2.牺牲一个存储单元,约定以“队尾指针所指的位置的下一个位置是队头指针”,表示队满

    

    

    2.链式存储:链队添加一个头节点,并另头指针指向队头

      队列空、满,队头、队尾都指向相同的位置,区分?:头指针和尾指针的值相同,且均被头节点指向,则为空

    

    示例:

    

    

   串(字符串):一种特殊的线性列表,数据元素为字符。

    仅由字符构成的有序序列,是取值范围受限的线性表

    相关概念:空串、空格串、字串、串相等、串比较(ASCII码值比较,第一个值开始比较,相等则继续比较第二个值)

    存储结构:

    1.定长存储:静态存储、顺序存储。可事先定义存储空间,也可根据串长的需要动态申请字符串的空间

    2.链式存储:每个节点可以存储一个字符、多个字符。节点大小决定对串的处理效率

    匹配模式:子串的定位操作

    1.朴素的模式匹配算法:布鲁特-福斯算法。从第一个位置比较,相等,则逐字对后续字符比较。不等,则从第二个位置比较。

    

    最好情况下匹配:,时间复杂度 O(m+n)

    最坏情况下匹配:,时间复杂度 O(m*n),因为n>>m

    2.改进的模式匹配算法:KMP算法。匹配结果不相等,不需要回溯主串的字符位置指针,而是利用已经得到的“部分匹配”结果,将其向右“滑动”尽可能远的距离,再继续进行比较 

    原理:一句模式串的next函数值实现子串的滑动。若next[j]=k,表示当模式串中的Pj与主串中相应的字符不想等时令模式串的Pk与主串的相应字符进行比较。

    

    示例:

    ????

    

    

2.数组、矩阵、广义表

数组:定长线性表在维数上的扩张,即线性表中的元素又是一个线性表。n维数组是一种“同构”的数据结构,其每个数据元素类型相同,结构一致

  特点:

  1.数目固定,一旦定义了一个数组结构,就不再有元素个数的增减变化。

  2.数据元素具有相同的类型

  3.数据元素的下标关系具有上下界的约束且下标有序

  存储:顺序存储

    why:数组一般不做插入、删除运算,一旦定义,数据个数、元素间关系不再发生变动。

    how:计算机内存结构是一维线性的,因此多维数组必须今年习惯降维处理,将数组元素排列成一个线性序列

      一旦确定了维数、各维长度,便可为它分配存储空间

      存储结构:以行为主序,以列为主序

      

      a[m,n]的存储地址计算:

矩阵:

  为了节省存储空间,可以对矩阵进行压缩:多个值相同的元素只分配一个存储单元,对0不分配存储单元

  分类:

  1.特殊矩阵:矩阵中元素的分布有一定的规律。

  包括:对称矩阵、三角矩阵、对角矩阵……

  n阶对称矩阵:n²个元素存放在 n(n+1)/2 个元素udall存储空间中

    (1<=k<=n(n+1)/2)

  对角矩阵:所有非0元素都集中在以主对角线为中心的带状区域中,其余元素都为0

       (1<=k<=3n-2)  ???

  2.稀疏矩阵:非0元素的的个数远远少于0元素的个数,且非0元素的分布没有规律

    常用的顺序存储结构:三元组顺序表

    常用的链式存储结构:十字链表

    

    三元组表:

广义表:由0个或多个单元素或子表组成的有限序列。是线性表的推广

  表头:非空表的第一个元素

  表尾:除表头外,其余元素构成的表

  特点:

  1.多层次结构。元素的可以是子表,子表的元素还可以是子表

  2.可被其他广义表共享。元素可以是已经定义的广义表的名字

  3.一个递归的表。元素可以是本广义表的名字

  存储结构:链式存储结构

    why:元素本身又可以具有结构,是一种带有层次的非线性结构

    

树:非线性结构

  递归的(元素可由子树构成,子树又更小的子树构成)

  元素间有明显的层次关系

  凡是分等级的分类方案都可以用具有严格层次关系的树结构来描述。

  

  二叉树:树节点最大度为2。要区分左子树、右子树

    

    

    存储结构:

    1.顺序存储:多用于完全二叉树。

    一般二叉树也要完全按照完全二叉树的形式存储,因此要添加许多并不存在的“虚结点”,造成空间浪费

    

    2.链式存储:三叉链表、二叉链表

    

    遍历:先序、中序、后序。

      树中每个节点,且仅访问一次。

      对一个非线性结构进行线性化的过程

    

    

    时间复杂度O(n)

    借助一个栈,可将二叉树的递归遍历算法转换为非递归算法

    

    

    层序遍历

    

  线索二叉树:在每个节点中增加两个指针来存放前驱、后继信息。缺点:降低存储空间的利用率

    why:二叉链表存储结构中,只能找到一个节点的左、右孩子,不能直接得到节点在任一遍历序列中的前驱、后继,这些信息只有在遍历的动态过程中才可以得到。

    

    

    

    

      

  

3.树

4.图

5.查找

6.排序

原文地址:https://www.cnblogs.com/panpanwelcome/p/5709646.html