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

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

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

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

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

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

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

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

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

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

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

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 就不是抽象数据类型,因为这两种具体的数据结构已经是线性表的具体实现了,并不具有抽象性。

三者的关系总结

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

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

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

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

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

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

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

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    6518 引用 • 29299 回帖 • 248 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 455 关注
  • 区块链

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

    91 引用 • 751 回帖
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 17 关注
  • 创业

    你比 99% 的人都优秀么?

    82 引用 • 1398 回帖 • 2 关注
  • 996
    13 引用 • 200 回帖 • 1 关注
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 132 关注
  • danl
    61 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    28 引用 • 108 回帖 • 1 关注
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    84 引用 • 139 回帖 • 1 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 621 关注
  • ReactiveX

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

    1 引用 • 2 回帖 • 126 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    333 引用 • 323 回帖 • 70 关注
  • 友情链接

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

    24 引用 • 373 回帖 • 4 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    82 引用 • 122 回帖 • 614 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    20 引用 • 245 回帖 • 228 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 8 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    45 引用 • 113 回帖 • 317 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 53 关注
  • FreeMarker

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

    23 引用 • 20 回帖 • 427 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    83 引用 • 165 回帖 • 47 关注
  • 微软

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

    8 引用 • 44 回帖
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    25 引用 • 215 回帖 • 163 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    22 引用 • 31 回帖 • 3 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    138 引用 • 268 回帖 • 199 关注
  • Caddy

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

    10 引用 • 54 回帖 • 131 关注