Python数据结构与算法基础|第一期:公共基础知识——数据结构基本概念与简单的线性结构


学习Python基础语法的过程中,在分析一个问题并试图写出实际解决问题的代码时,我常常发现写出的代码比较混乱,解决问题的过程并不是很清晰。所以,我希望通过学习一些数据结构与算法的知识来解决这个问题,并在这个过程中练习Python语言的使用、加深对Python语言的认识。

这个系列中我们将简单介绍一些数据结构与算法的基础概念,通过代码实现来更好的加深理解,为其它复杂的数据结构与算法的学习打好基础。


数据结构的基本概念与表示方式

  1. 数据结构:有相互关联的数据元素的集合,包含“数据”与“结构”两个要素。
  • 数据:需要处理的数据元素的集合,一般来说具有某个共同的特征。
  • 结构:集合中各个数据元素间存在的某种关系,具体包括逻辑结构存储结构
    • 逻辑结构:通过两两元素之间的前后件关系(即直接前驱与直接后继关系)来反映数据元素间的逻辑结构。
    • 存储结构:又称数据的物理结构,是数据的逻辑结构在计算机中的存放方式。
  1. 数据结构的表示:
    (1). 通过二元组B = (D,R)表示。其中B表示数据结构,D是数据元素的集合,R是数据元素间的前后件关系构成的集合,其中数据元素间的前后件关系也用二元组表示。
    (2).通过由方框与箭头构成的图表示。其中标有元素值的方框用来表示数据元素,一般称之为数据节点。由前件指向后件的箭头用来表示数据元素间的逻辑结构。
  2. 由前后件关系引出的节点的基本概念:
    (1).根节点:没有前件的节点。
    (2).叶子节点:没有后件的节点。
    (3).内部节点:除了根节点与叶子节点以外的全部节点。
  3. 线性结构与非线性结构: 线性结构指满足有且只有一个根节点、每一个节点最多只有一个前件也最多只有一个后件的非空数据结构。不满足这些特点的数据结构称为非线性结构。常见的非线性结构包括树形结构与网状结构。

简单的线性结构:栈、队列、线性链表以及循环链表

注:我们不讨论空的线性表。

a. 线性表:

线性结构常称为线性表。可以用元组

来表示,节点个数n称为线性表的长度。

线性表具有以下结构特点:

  1. 只有一个根节点。
  2. 有且只有一个终端节点(叶子节点)。
  3. 除根节点与终端节点外,其他所有节点有且只有一个前件,也有且只有一个后件。
b. 顺序表:采用顺序存储的线性表

线性表可以采用顺序存储与链接存储两种存储结构。其中顺序存储的特点为

  1. 线性表中所有元素所占的存储结构是连续的。
  2. 线性表中各数据元素在存储空间中是按照逻辑顺序依次存放的。

在顺序表中,其前后件在存储空间中是紧邻的,且前件元素一定在后件元素之后。

c. 栈(Stack)

栈是一种特殊的线性表,其原则是“Last In First Out”,即栈的插入与删除都限定在表的同一端进行,允许插入与删除的一端称为栈顶、不允许的一端称为栈底。当栈中没有元素时,称此时的栈为空栈。我们可以用图示
在这里插入图片描述
来表示栈,其中有两个指针分别指向栈顶元素与栈底元素,指向栈顶元素的指针反映栈的状态变化,a1为栈底元素,an为栈顶元素,栈中所有元素按照a1、a2、… 、an的顺序进入,相应的,退栈的第一个元素为栈顶元素an。

栈的基本运算包括

  1. 入栈
  2. 退栈
  3. 读取栈顶元素
d. 队列(Queue)

队列是一种First In First Out 的线性表,即允许在表的一端(队头或排头)进行删除、在表的另一端(队尾)进行插入。我们可以用图示
在这里插入图片描述
来表示队列,其中a1称为队头元素,an称为队尾元素,队列中的元素按照a1、a2、… 、an的顺序进入队列,也按照这个顺序依次退出队列。队列的状态由队头指针front和队尾指针rear来反映。

e. 循环队列

在实际中,队列的顺序存储结构一般采用循环队列形式,即将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间。在循环队列中,指针front = rear时无法判断是空队列还是满队列,所有常增加一个标志来区分空队列与满队列。

关于循环队列,在此系列第四、五期进行了介绍并使用Python进行了实现,具体可以阅读后续内容。

f. 线性链表

与顺序表不同,线性链表是线性表的链式存储结构。由于此类链表每个节点只有一个指针域,所以又称单链表。线性链表的存储单元是任意的,节点在存储空间的位置关系与逻辑关系并不一致。各节点的前后件关系通过节点的指针来表示,通过一个特殊指针指向列表中第一个节点,称之为头指针(HEAD),当其为NULL或0时,链表为空。由于没有后件,所以线性链表最后一个节点的指针域为空(即值为NULL或0)。

g. 双向链表

为了更方便的从某个节点出发找到其它节点,我们对线性链表的每个节点设置两个指针,称之为左指针与右指针,分别存放前件与后件的地址。这样的链表称为双向链表,其示意图为
在这里插入图片描述

i. 循环链表

在单链表的第一个节点前增加一个表头节点,HEAD指向表头节点且最后一个节点的指针域由空改为指向表头节点,这样的链表中所有节点构成了环状链,我们称之为循环链表。

表头节点是循环链表中固定的,所以即使表中没有数据元素,也至少存在一个表头节点。在循环链表中,只要指出任何一个节点的位置,就可以从它出发访问表中所有的节点。

发布了16 篇原创文章 · 获赞 0 · 访问量 674

猜你喜欢

转载自blog.csdn.net/weixin_43628432/article/details/103884779