当前位置:首页>python>Python学习【92】:Python 的数据结构之“非线性结构”的实现,并与c语言进行比较

Python学习【92】:Python 的数据结构之“非线性结构”的实现,并与c语言进行比较

  • 2026-10-21 13:27:22
Python学习【92】:Python 的数据结构之“非线性结构”的实现,并与c语言进行比较

Python学习

一、学前花絮

数据结构是所有的计算机语言中非常重要的一部分,前面文章讲述了线性结构的“数组”、“栈”、“队列”、“链表”的实现和用途。今天我们继续数据结构部分的学习,重点讲述一下非线性数据结构的“树”、“图”和“多维数组”,也以C语言和python进行对比。

根据数据元素之间的逻辑关系来划分,我们可以把“数据结构”想象成一个社交网络:

  • 线性结构就像是排队,每个人只和前后两个人有关系,队伍是直的。

  • 非线性结构就像是朋友圈,一个人可以认识很多人,关系是网状的。

下面拆解这两者的区别和特点:

1. 线性结构 (Linear Structure)

核心定义: 数据元素之间存在一对一的线性关系。

形象理解:  就像一条线,把所有的数据串起来。除了第一个和最后一个元素,其他的每个元素都只有一个前驱(前面的元素)和只有一个后继(后面的元素)。

主要特征:

  • 有序性: 元素是按顺序排列的。

  • 单一关系: 逻辑上是直的,没有分叉。

常见的线性结构:

  • 数组 (Array): 最基础的线性结构,内存连续。

  • 链表 (Linked List): 通过指针链接,内存可以不连续。

  • 栈 (Stack): 只能在一端操作(后进先出 LIFO)。

  • 队列 (Queue): 在两端操作(先进先出 FIFO)。

2. 非线性结构 (Non-linear Structure)

核心定义: 数据元素之间存在一对多或多对多的关系。

形象理解: 这就像是一个复杂的网状关系。一个元素可能对应多个前驱或多个后继,数据不再是简单的“一条线”,而是有了“层级”或“网络”。

主要特征:

  • 非顺序性: 元素之间没有严格的先后顺序。

  • 复杂关系: 逻辑上是分叉的、网状的。

常见的非线性结构:

① 树 (Tree):

关系: 一对多(层级关系)。

  • 例子: 像家族族谱或公司的组织架构图。一个“父亲”节点可以有多个“孩子”节点,但每个“孩子”只有一个“父亲”。

  • 应用: 文件系统目录、DOM 树。

② 图 (Graph):

关系: 多对多(网状关系)。

  • 例子: 像地图上的城市和道路,或者社交网络。一个节点可以连接到任意多个其他节点,没有固定的层级。

  • 应用: 地图导航、社交网络好友关系。

③ 多维数组:

虽然也是数组,但因为涉及多个下标(如矩阵),元素之间不再是简单的线性对应,通常也被归类为非线性结构。

下面是线性结构和非线性结构的对比:

二、Python和C语言如何实现非线性数据结构

2.1 非线性数据结构的树、图和多维数组简单示例

1. 树 (Tree)

核心概念: 一对多的层级关系。像家谱、目录结构。

Python 实现 (二叉树节点)

Python 的类写法非常直观,直接定义节点的“左孩子”和“右孩子”。

输出结果:

C 语言实现 (二叉树节点)

C 语言需要手动管理内存和指针。

输出结果:

树的适合场景

  • 文件系统: 目录和子目录的层级关系。

  • DOM 树: 网页 HTML 标签的嵌套结构。

  • 数据库索引: B+树用于加速数据查询。

  • 决策逻辑: 游戏 AI 或专家系统的决策树。

2. 图 (Graph)

核心概念: 多对多的网状关系。节点之间可以任意连接。

Python 实现 (邻接表)

使用字典来表示图是最 Pythonic 的方式,键是节点,值是相邻节点的列表。

输出结果:

C 语言实现 (邻接表)

C 语言实现稍微复杂,我们用结构体来模拟一个简单的无向图节点连接。

输出结果:

图的适合场景

  • 社交网络: 好友关系(你关注我,我也关注你)。

  • 地图导航: 城市是节点,道路是边,用于计算最短路径(如 Dijkstra 算法)。

  • 推荐系统: 用户和商品之间的关联网络。

3.多维数组 (Multi-dimensional Array)

  • 核心概念: 线性数组的扩展,通过多个下标访问数据(如矩阵)。

  • Python 实现 (二维列表)

  • Python 原生没有多维数组,通常使用列表的列表,或者更推荐使用 NumPy 库。

输出结果:

C 语言实现 (二维数组)

C 语言对多维数组有原生支持,内存是连续的。

输出结果:

多维数组的适合场景

  • 图像处理: 图像本质上就是像素矩阵(二维数组)。

  • 科学计算/矩阵运算: 机器学习算法中的权重矩阵。

  • 游戏地图: 棋盘类游戏(如五子棋、扫雷)的地图状态存储。

2.2非线性数据结构总结对比:

对于数据结构中的线性和非线性总结:

  • 如果你只需要处理简单的列表数据(如待办事项),线性结构(数组或链表)就足够了。

  • 如果你需要处理复杂的层级关系(如文件夹)或网络关系(如地图路径),非线性结构(树或图)则是唯一的选择,用线性结构去处理这些问题会非常低效甚至无法实现。

三、小结

本文针对非线性数据结构的树、图和多维数组进行了论述,并举例说明。至此,我们对于数据结构的学习暂告一个段落。应该说数据结构是任何计算机语言学习中的重点,我们通过python与C语言的对比,才知道为什么说python语法简单:其实本质原因是python隐藏了特别难以理解的底层知识比如指针、内存管理等,Python 让你从繁琐的“系统级”操作中解放出来,专注于“应用级”的逻辑实现。

让我们保持学习热情,多做练习。我们下期再见!

最新文章

随机文章