数据结构的基本概念

可以想象,将一大堆杂乱无章的数据交给计算机处理是很不明智的,结果是计算机处理的效率非常低,有时甚至根本无法进行处理。于是人们开始考虑如何更有效地描述、表示、存储数据,这就是数据结构需要解决的问题。

▶1.数据结构的发展

早期计算机的主要功能是处理数值计算问题。由于当时涉及的运算对象是简单的整数(整型)、实数(浮点型数值)或布尔类型的逻辑数据,因此人们的主要精力集中于程序设计的技巧上,而无须重视数据结构。随着计算机应用领域的不断扩大,非数值计算问题越来越广泛。非数值计算问题涉及的数据类型更为复杂,数据之间的相互关系很难用数学方程式加以描述。因此,解决非数值计算问题的数学模型不再是数学分析和计算方法,而是要设计出合适的数据结构,才能有效地解决问题。
1968年,高德纳(Donald Ervin Knuth)开创了数据结构的最初体系,他所著的《计算机程序设计艺术》第一卷《基本算法》是第一本系统阐述数据结构的著作。瑞士计算机科学家尼古拉斯·沃斯(Niklaus Wirth,1984年获图灵奖)在1976年出版的著作中指出:算法+数据结构=程序,可见数据结构在程序设计中的重要性。

▶2.实际工作中的数据结构问题

对无法用数学公式描述的非数值计算问题,其数学模型集中在数据结构的建立。在解决现实中的许多非数值型问题时,数据结构发挥了非常重要的作用。
例:利用表对问题进行描述。学生基本情况表记录了一个班学生的学号、姓名等信息。表中每个学生的各项信息排在一行中,这一行称为记录,这个表就是一个数据结构。对整个表来说,每个记录就是一个节点,只有一个开始节点(它的前面无记录)和一个终端节点(它的后面无记录),其他记录的前面和后面均只有一个记录,因此这些关系确定了这个表在逻辑上是线性结构。对于表中的一条记录来说,学号、姓名等数据元素,也符合一一对应的线性关系。这个表可以用一片连续的内存单元(如数组)来存放这些记录,也可以用链表的形式随机存放各个记录,这就是数据的存储结构。在这个存储结构的基础上,可实现对表中的数据进行查询、修改、删除等操作。

例:利用树形结构描述回题。计算机文住系统中,根口录下有很多子目录和文件,每个子目录又包含多个下级子日录和文件,但每个子日录只有一个父日录。这是一种典型的树形结构,数据与数据之间成一对多的关系(一个日录下存在多个文件),这是一种典型的非线性关系结构。在各种棋类活动中,存在不同的棋盘状态,不回的前量预测。不同的对弈策略,这些状态和方法很难用数学公式进行表达,因为棋局之间的关系往往不是线性的。因此需要用非数值型数据进行描述,而利用“树形结构”描述棋盘状态,非常有利于回题分析和解决。

例:利用图形结构对问题进行描述。美国化学与生物工程师阿马尔(Luis Amaral)发明了一种足球评分系统,在模型中,球队被看作网络,球员就是其中的节点,模型重点分析球员之间的传球而不是个人表现。传球线路构成了一个网状图形结构,节点与节点之间成多对多的关系,是一种非线性结构。另外,交叉路口交通灯的管理问题、哥尼斯堡七桥问题、逻辑电路设计问题、数据库管理系统等问题,用传统的数学模型无法进行描述,必须采用数据结构中的“图”进行描述。

由以上案例可见,描述非数值计算问题的数学模型不再是数学方程式,而是表、树、图之类的数据结构。

▶3.数据结构的定义

数据是计算机处理符号的总称。数据可以是数值型数据,也可以是非数值型数据。数值数据主要有整数和浮点数等,它们主要用于工程计算和科学计算。非数值数据则包括字母、表格、程序代码、符号序列、图形,以及工程问题中的树、图、网、节点等
数据元素之间的关系称为“结构”,数据结构是研究数据的逻辑结构和物理存储结构以及它们之间的相互关系,并对这种结构定义相应的运算,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。数据结构主要研究三个方面的内容:数据的逻辑结构;数据的物理存储结构;对数据的操作(或运算)。算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。

▶4.数据结构的类型

在任何问题中,数据元素之间都不会是孤立的,在它们之间都存在这样或那样的关系,这种数据元素之间的关系称为结构。根据数据元素间关系的不同特性,数据的逻辑结构有4种基本类型:集合结构(无序的松散关系)、线性结构(一一对应关系)、树形结构(一对多关系)和图形结构(多对多关系)。

1)集合结构

集合结构中,数据元素之间的关系是“属于同一个集合”。由于集合是数据元素之间关系极为松散的一种结构,因此也可用其他数据结构来表示。

2)线性结构

线性数据结构的数据元素之间存在一对一关系。线性数据结构有线性表(一维数组、顺序表、链表等),栈,队列等。
数组的优点是数据插入速度快。数组的缺点是查找慢、删除慢、大小固定。因此,数组主要用于数据量较小,或数据量大小事先可预测的情况。如果对插入速度要求高,可以使用无序数组;如果查找速度很重要,可以使用有序数组,并用二分查找算法。在有序数组中进行遍历很快,而无序数组不支持这种功能。
链表的优点是在空间上,链表可以随意扩大,动态地添加或删除元素,不会引起元素的移动,因为元素增减只需要调整指针即可。顺序链表的缺点是查找不方便,只能通过指针顺序访问,不能随机查找。如果需要存储的数据不能预知,或者需要频繁插入和删除数据时,可以考虑使用链表。当有新的元素加入时,链表可以开辟新的存储空间。
栈的优点是提供后进先出的存取方式;缺点是存取数据项很慢。

队列提供先进先出的存取方式;缺点是存取数据项很慢。

3)树形结构

树形数据结构的数据元素之间存在一对多的关系。树形数据结构有二叉树、B树、B+树(注意没有B—树)、最优二叉树(哈夫曼树)、二叉搜索树(二叉排序树)、红黑树等。树是一种最常用的高效数据结构,许多高效算法可以用这种数据结构来实现。树的优点是查找、插入、删除都很快(如果树保持平衡);缺点是删除算法复杂。

4)图形结构

图形数据结构的数据元素之间存在多对多的关系,图形结构有无向图和有向图。如果图形结构中的边具有不同的值,这种图形结构称为网形结构。图的优点是对现实世界建模方便;缺点是算法相对复杂。

相关推荐

  1. 数据结构基本概念

    2023-12-21 17:58:02       52 阅读
  2. 数据结构--查找基本概念

    2023-12-21 17:58:02       35 阅读
  3. 数据结构——概念基础

    2023-12-21 17:58:02       36 阅读
  4. 数据结构】图基本概念

    2023-12-21 17:58:02       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-21 17:58:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-21 17:58:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-21 17:58:02       82 阅读
  4. Python语言-面向对象

    2023-12-21 17:58:02       91 阅读

热门阅读

  1. win10 golang下载安装,及环境变量配置

    2023-12-21 17:58:02       67 阅读
  2. TypeScript常用的内置工具

    2023-12-21 17:58:02       58 阅读
  3. 客户服务常用的ChatGPT通用提示词模板

    2023-12-21 17:58:02       65 阅读
  4. 11、Qt:创建/删除文件夹、拷贝文件

    2023-12-21 17:58:02       45 阅读
  5. copilot运用技巧和实战经验分享

    2023-12-21 17:58:02       51 阅读
  6. Golang leetcode977 有序数组的平方 双指针法

    2023-12-21 17:58:02       77 阅读