数据结构专题——那些难以理解的数据结构基本概念

本贴最后更新于 2610 天前,其中的信息可能已经事过景迁

不知有没有人和博主一样,在上大学的时候最头疼的一门课就是数据结构与算法了,其中枯燥的概念、冗长的伪代码都让博主昏昏欲睡。

尤其是严大妈在《数据结构》中开篇讲述的数据结构、数据类型与抽象数据类型的概念,让博主完美地将这三个概念混淆了很久(这里没有黑严大妈的意思……但是数据结构确实给当时没有认真听课的博主留下了深刻的印象)。

博主希望在这个系列的博文中将自己眼中的数据结构与各位同学进行分享,希望大牛们能不吝赐教或是对初学者能有一点帮助。

在本篇博文中我主要谈谈我对以下三个概念的理解,欢迎大家与我一起讨论。

  • 数据结构
  • 数据类型
  • 抽象数据类型

首先来看数据结构的概念:

数据结构: 是相互之间存在一种或多种特定关系的数据元素的集合。这种结构可以是逻辑结构或者是物理结构

逻辑结构是指数据之间的逻辑关系,比如

  • 当所有数据都属于一个集合,而彼此之间没有别的关系时,这就是逻辑上的集合关系,如下图;

c25091822d4541918a8b13f87773cf48-2017102821.11.48.png

  • 当数据之间有下图所展示的一一对应的关系时,就属于线性结构
    ceacc21e91f54dad9047fdca4835f8a2-2017102821.24.04.png

  • 当数据之间有下图所展示的一对多的关系时,就属于树形结构
    663d1a8bf22a46fe8ffee8be8c576860-2017102821.25.42.png

  • 当数据之间有下图所展示的多对多的关系时,就属于图形结构
    2fb5453f54464a8aacdac735766e1acb-2017102821.26.50.png

物理结构是指数据如何计算机中存储的形式

若数据被存放在连续的存储单元中,则属于顺序存储结构,这种数据结构中数据间的逻辑关系和物理关系是一致的。这种数据结构很简单,最常见的例子就是数组。当我们向计算机申请创建一个装有 10 个整型元素的数组时,计算机会在内存中找一块连续的空间,按照一个整型元素所需的内存大小乘以 10,为这个数组开辟所需的内存空间,其中第一个元素放在第一个位置,第二个元素放在第二个位置,依次摆放,如下图所示。

d6e8c50c58844f36bccc2b9c270983e0-2017102821.43.12.png

若数据被存放在任意的存储单元中,则属于链式存储结构,这种数据结构中的数据存放位置可以是连续的,也可以是不连续的。数据间的存储关系并不能反应它的逻辑关系,因此需要指针来存放元素的位置,这样通过地址就可以找到相关联元素的位置了,如下图所示。
ec1a2da5af3a4a67a4a46be266ced158-2017102821.47.38.png

根据上述的概念来看,我们平常所说的树(Tree)、线性表(List)、图(Graph)都属于数据结构,因为它们的元素满足逻辑结构中元素的特定逻辑关系。

同样,以 Java 语言为例,ArrayList(基于数组实现的线性表)、LinkedList(链表)也属于数据结构,因为他们的元素在计算机中是以顺序与链式的物理结构来存储的。

逻辑结构是面向逻辑关系的结构,而物理结构是面向计算机存储的结构。对于我们程序员来说我们更倾向于关注物理结构,因此我们更习惯叫 ArrayList 这种线性表的实现为数据结构。

接下来我们来看数据类型的概念:

数据类型:是指一组性质相同的值的集合及在此集合上的一些操作的总称。

同样以 Java 语言为例,每一个变量在被声明的时候我们都需要指明它的数据类型。因为内存需要知道你这个数据应该被分配多大的空间。

同样的一个变量 i=12, 如果它被声明为 byte 类型就会被分配 8 bits 的空间,而被声明为 int 类型就会被分配 32 bits 的空间。

通常来说,数据类型分为原子类型结构类型

原子类型就是不可再分的基本类型:整型、浮点型等等

结构类型就是由若干个原子类型组成符合类型。

以 Java 为例,原子类型就是 8 个基本数据类型,而结构类型就是引用类型。对于 C 语言、或是 C++ 而言,原子类型就是基本类型,结构类型就是 struct。

但是不同的硬件系统在将这些数据类型转换为底层语言时肯定会有不同。这点对于 C 语言来说尤为明显,比如 int 类型没有固定的取值范围,而是依赖于硬件系统来决定。

因此这些我们人为为数据划定的“类型”就有硬件的局限性了。

这也是抽象数据类型出现的原因。

抽象数据类型:是指一个数据模型及定义在该模型上的一组操作

抽象数据类型可以解决上述 int 类型在不同硬件上有不同取值的问题。

比如说,我们可以抽象出一个数据类型叫做整型。那么在任何硬件系统中需要用到的整数类型以及整数的操作都可以在这个抽象类型中声明。至于在某种编程语言中将它实现为 32 位的 int 类型还是 16 位的 int 类型抽象类型都不需要关心。

以 Java 语言为例,线性表 List 是一个抽象数据类型;但 ArrayList 与 LinkedList 就不是抽象数据类型,因为这两种具体的数据结构已经是线性表的具体实现了,并不具有抽象性。

三者的关系总结

  • 数据结构数据类型的关系

数据结构是由一个个的数据元素组成的,而这些数据在声明的时候都会属于某一种数据类型。

  • 数据结构抽象数据类型的关系

逻辑数据结构一般也可以看作抽象数据类型;但物理数据结构不是抽象数据类型,而是抽象数据类型的具体实现。

  • 数据类型抽象数据类型的关系

数据类型是人为规定的平台相关的类型;而抽象数据类型是将数学模型和模型的相关操作抽象出来

注:本文图片来源于程杰老师的《大话数据结构》

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Spark

    Spark 是 UC Berkeley AMP lab 所开源的类 Hadoop MapReduce 的通用并行框架。Spark 拥有 Hadoop MapReduce 所具有的优点;但不同于 MapReduce 的是 Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的 MapReduce 的算法。

    74 引用 • 46 回帖 • 559 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 164 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    12 引用 • 54 回帖 • 159 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 7 关注
  • 电影

    这是一个不能说的秘密。

    121 引用 • 604 回帖 • 1 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 464 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    36 引用 • 37 回帖 • 535 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 161 关注
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 15 关注
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    93 引用 • 113 回帖
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 683 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 53 关注
  • 工具

    子曰:“工欲善其事,必先利其器。”

    288 引用 • 734 回帖 • 2 关注
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 159 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    58 引用 • 22 回帖
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    88 引用 • 1235 回帖 • 410 关注
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    132 引用 • 1114 回帖 • 125 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    76 引用 • 1737 回帖 • 1 关注
  • Jenkins

    Jenkins 是一套开源的持续集成工具。它提供了非常丰富的插件,让构建、部署、自动化集成项目变得简单易用。

    53 引用 • 37 回帖 • 3 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖 • 1 关注
  • 自由行
    4 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    77 引用 • 430 回帖 • 1 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    171 引用 • 512 回帖