一、数据结构概述 -------川川

概述

1、数据结构是计算机中对数据的一种存储和组织方式,同时也泛指相互之间存在一种或多种特定关系的数据的集合。
2、计算机科学家尼克劳斯·沃思提出了“数据结构+算法=程序”的著名公式,这是因为不同数据结构所采用的处理方法不同,计算的复杂程度也不同,因此算法往往依赖于某种数据结构,即数据结构是算法实现的基础。

什么是数据结构

Sartaj Sahni的经典著作《数据结构、算法与应用》一书中提出“数据结构是数据对象、存在于该对象的实例以及组成实例的数据元素之间的各种关系,并且这种关系可以通过定义相关的函数来给出。”,他将数据对象定义为一个实例或值的集合。
数据结构可以简单地理解为:一个数据结构是由数据元素依据某种逻辑联系组织起来的,对数据元素间逻辑关系的描述称为数据的逻辑结构。

数据结构中的基本概念

  • 数据(Data): 数据是信息的载体,能被计算机识别、存储和加工处理,是计算机程序加工的“原材料”。
  • 数据元素(Data Element): 数据元素是数据的基本单位,也称为元素、结点、顶点、记录等。
  • 数据结构(Data Structure): 数据结构指的是数据之间的相互关系,即数据的组织形式。

数据结构的内容

  • 数据的逻辑结构(Logical Structure): 即数据元素之间的逻辑关系。数据的逻辑结构是从逻辑关系上描述数据的,与数据在计算机中如何存储无关,也就是独立于计算机的抽象概念。从数学分析的角度来看,数据的逻辑结构可以看作从具体问题抽象出来的数学模型。
  • 数据的存储结构(Storage Structure): 即数据元素及其逻辑关系在计算机存储器中的表现形式。数据的存储结构依赖于计算机语言,是逻辑结构用计算机语言的实现。一般来说,只有在高级语言的层次上才会讨论存储结构,在低级的机器语言中,存储结构是具体的。
  • 数据的运算: 能够对数据施加的操作。数据运算的基础为数据的逻辑结构,每种逻辑结构都可以归纳为一个运算的集合。在数据结构范畴内,最常用的运算包括检索、插入、删除、更新、排序等。

直接前趋(Immediate Predecessor): 某结点相邻且在其之前的结点被称为直接前趋。对任意一个结点,直接前趋结点最多只有一个。只有一个结点没有直接前趋,即开始结点。
直接后继(Immediate Successor): 某结点相邻且在其之后的结点被称为直接后继。对任意一个结点,直接后继结点最多只有一个。只有最后一个结点没有直接后继,即终端结点。

数据的逻辑结构、数据的存储结构和数据的运算是一个整体,孤立的理解这三者中的任何一个都是不全面的。

  • 同一逻辑结构可有不同的存储结构。
  • 同一逻辑结构可有不同的数据运算集合。

数据的逻辑结构、数据的存储结构和数据的运算任何一个发生变化都将导致一个全新的数据结构出现。

数据结构的分类

1.线性结构:

定义: 表中各个结点具有线性关系。

  • 线性结构是非空集。
  • 线性结构有且仅有一个开始结点和一个终端结点。
  • 线性结构所有结点最多只有一个直接前趋结点和一个直接后继结点。

前面提到的线性表就是典型的线性结构,还有栈、队列和串等都是线性结构。

2.非线性结构:

定义: 表中各个结点之间具有多个对应关系。

  • 非线性结构是非空集。
  • 非线性结构的一个结点可能有多个直接前趋结点和直接后继结点。

在实际应用中,数组、广义表、树结构和图结构等数据结构都是非线性结构。

数据结构的存储方式

1.顺序存储方式:

定义: 在一块连续的存储区域一个接着一个的存放数据。
方式: 把逻辑上相邻的结点存储在物理位置上相邻的存储单元里,结点间的逻辑关系由存储单元的相邻关系来体现。
顺序存储方式也称为顺序存储结构(Sequential Storage Structure),一般采用数组或结构数组来描述。
此存储方式主要用于线性逻辑结构的数据存放,而对于图和树等非线性逻辑结构则不适用。

2.链接存储方式:

定义: 链接存储方式较为灵活,其不要求逻辑上相邻的结点在物理位置上相邻,结点间的逻辑关系由附加的引用字段表示。
链接存储方式也叫链式存储结构(Linked Storage Structure),一般在原数据中增加引用类型来表示结点间位置关系。

3.索引存储方式:

定义: 采用附加的索引表的方式来存储结点信息的一种存储方式。

  • 稠密索引(Dense Index): 每个结点在索引表中都有一个索引项,索引项的地址指示结点所在的存储位置。
  • 稀疏索引(Spare Index): 一组结点在索引表中只对应一个索引项,索引项的地址指示一组结点的起始存储位置。

4.散列存储方式:

定义: 根据结点的关键字直接计算出该结点的存储地址的一种存储方式。

数据类型

定义: 数据类型就是一个值的集合及在这些值上定义的一系列操作的总称。
分类: 按照数据类型的值是否可以分解,数据类型可分为基本数据类型聚合数据类型

  • 基本数据类型: 其值不能进一步分解,一般是用程序设计语言自身定义的一些数据类型。
  • 聚合数据类型: 其值可进一步分解为若干分量,一般是用户自定义的数据类型。

抽象数据类型(Abstract Type,ADT):

  • 概念: 指的是数据的组织及其相关的操作。ADT可看做数据的逻辑结构及其在逻辑结构上定义的操作。
  • 定义的形式:
ADT抽象数据类型名
{
	数据对象:(数据元素集合)
	数据关系:(数据关系二元组结合)
	基本操作:(操作函数的罗列)
}ADT抽象数据类型名
  • 特征: ①数据抽象: 使用抽象数据类型ADT时,其强调的是实体的本质特征,所能够完成的功能,以及与外部用户的接口。 ②数据封装: 用于将实体的外部特性和其内部实现细节进行分离,并且对外部用户隐藏其内部实现细节。
  • 优点: 将数据和操作封装在一起,使得用户程序只能在ADT里定义的某些操作来访问其中数据,从而实现了信息隐藏。

在Java语言中,是使用接口来表示抽象数据类型ADT,用接口的实现类来实现ADT的。
抽象数据类型ADT和接口的概念很好的表现了程序设计中的两层抽象。
ADT是概念层上的抽象,接口属于实现层上的抽象。

常用的数据结构

数组(Array):

  • 是一种聚合数据类型,是将具有相同类型的若干变量有序的组织在一起的集合。
  • 数组可以说是最基本的数据结构。

栈(Stack):

  • 是一特殊的线性表,其只能在一个表的一个固定端进行数据结点的插入和删除操作。
  • 栈按后进先出的原则来存储数据。
  • 先插入的数据将被压如栈低,最后插入的数据在栈顶,读出数据时,从栈顶开始逐个读出。
  • 栈中没有数据时,称为空栈。

队列(Queue):

  • 队列只允许在表的一端进行插入操作,在另一端进行删除操作。
  • 进行插入操作的一端称为队尾,进行删除操作的一端称为对头。
  • 队列中没有元素时,称为空队列。

链表(Linked List):

  • 链表是一种数据元素按照链式存储结构进行存储的数据结构,此存储结构在物理上具有非连续的断点。
  • 链表由一系列数据结点构成,每个数据结点包括数据域和引用域两部分。
  • 引用域保存了数据结构中下一个元素存放的地址。
  • 数据元素的逻辑顺序是通过链表中的引用链接次序来实现的。

树(Tree):

  • 树是典型的非线性结构,其中包括n个结点的有穷集合K。
  • 有且仅有一个根结点,该结点没有前驱结点。
  • 在树结构中的其他结点都有且仅有一个前驱结点,而且可以有m个后继结点,m≥0。

图(Graph):

  • 图是另外一种非线性数据结构。
  • 数据结点一般称为顶点,而边是顶点的有序偶对。
  • 若两个顶点之间存在一条边,那么就表示这两个顶点间具有相邻关系。

堆(Heap):

  • 堆是一种特殊的树型数据结构,一般讨论的堆都是二叉堆。
  • 特点是其根结点的值是所有结点中最小的或者最大的,而且根结点的两个子树也是一个堆结构。

散列表(Hash):

  • 散列表源自于散列函数(Hash function)。
  • 其思想是若在结构中存在关键字和T相等的记录,那么必定在F(T)的存储位置可以找到该记录,这样就不用进行比较而直接取得所查记录。

选择合适的数据结构解决计算机问题

计算机所能处理的问题包括数值计算问题非数值计算问题
非数值计算问题大约占据了80%的计算机工作时间,若要高效的解决这类问题,则需要设计合理的数据结构。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个昵称被占用的川川

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值