1.1 什么是数据结构 ?

与其说数据结构是一门学科,我更加希望我们可以把它看作一种艺术。更加贴近生活的话,像是一门手艺。我们掌握了这门手艺再去干活才能干得干净利索。

当然,要掌握这门手艺是需要付出一些代价的,这包括但不限于交大学学费、安装相关软件以及依赖环境、从舒服的宿舍赶到犯困的教室上课、考试前的紧张以及挂科后的懊恼等等。因为它是一种艺术,自然不像打扫卫生那般简单直接。

那么这到底是一种什么艺术呢 ?我们这里先摘抄一段教材给的定义 —— 尽管我们认为艺术不应该被定义。

数据结构 (Data Structure) 是相互之间存在一种或多种特定关系的数据元素的集合。换句话说,数据结构是带 “结构” 的数据元素的集合, “结构” 就是指数据元素之间存在的关系。

这与悟道很像,我们不能急于理解它是什么,大概能够背诵一下应付考试、面试即可(还有就是在其他专业的人面前聊到这方面的时候,无意间来一句,数据结构不就是 … ,以显示咱们这种科班的人气质不同)。我们应当在实际学习过程中不断地回顾这句话的含义,什么是结构,什么是数据元素之间的关系等等。

1.2 数据相关术语

这是一个非常无聊的事情,但是还经常考这种简答题或填空题,因为它很基础,也很重要。

数据(Data):对客观事物的符号表示,指所有能输入到计算机中并被计算机程序处理的符号的集合总称。凡是存放在计算机操作系统内的内容均是数据。

数据元素(Data Element):数据元素是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。比如我们某一门的考试成绩,某一条聊天记录,或者是聊天记录中的每一个字符,都可以被当作数据元素,这与研究需求相关。

数据项(Data Item): 是组成数据元素的、有独立含义的、不可分割的最小单位。比如学生基本信息表中的学号、姓名、性别等都是数据项,我们强调的是如果强行分割则会导致指代不明或失去原有的意思,那么它就是不可分割的最小单位。

数据对象(Data Object):是性质相同的数据元素的集合,是数据的一个子集。例如:整数数据对象是集合 N = { − 2 , − 1 , 0 , 1 , 2 , . . . } N=\{ -2, -1, 0, 1, 2,...\} N={−2,−1,0,1,2,...} 等。

1.3 数据结构的分类

1.3.1 逻辑结构和存储结构

数据结构包括逻辑结构和存储结构两个层次,这也是我们学习数据结构的时候无时不刻需要明确的问题。比如有一天老师讲 “线性表” 得清楚线性表是逻辑结构的一种;而老师讲到 “顺序存储” 与 “链式存储” 的时候,就应当清楚这讲的是数据的存储结构。并且在实际应用中,也应当思考这个问题 —— 这种情况下应当使用顺序存储还是链式存储更加高效。

1.3.2 逻辑结构分类

总体而言,逻辑结构按照以下结构划分:

这里个人认为教材上的黑白两色多少有点枯燥,故而特意使用xmind绘制了一下


这里我们不去细细查看到底什么结构具有什么属性,但一定要大致熟悉这个大坑里面有哪些小可爱,我们以后还会经常见面。

1.3.2 存储结构分类

)
这个很容易理解,就像考试的时候一般老师发试卷的时候会从第一个传到最后一个,有严格的 “先后顺序”,但是老师点名叫同学回答问题就是 “链式”,大学老师一般记不住所有人的名字,就拿着花名册进行选择,这类似于同学们在链表的位置存储在花名册中。

当然不得不说的是,当老师点名没人答到的时候,这就是一个 “空指针异常”,一般可能会带来一些或大或小的不好的后果,所以各位小伙伴们尽量不要迟到、不要缺席。

1.3.3 数据类型和抽象数据类型

数据类型(Data Type):即数据的类型,比如字符串类型、整数类型、浮点数类型等等;

抽象数据类型(Abstract Data Type, ADT):可以理解为从特殊到一般的抽象结果。比如说上课的时候在课堂下听讲的一般我们可以用学生来概述,而年纪差不多,学校里撞见的我们都可以叫作同学,还有什么小姐姐小哥哥都是一种从特殊到一般的概述。抽象数据类型也是如此,我们希望能够总结出这一类数据所具有的共同特点,并把这些特点总结为某个抽象数据类型。

一般而言,抽象数据类型可以描述为:

ADT抽象数据类型名 {数据对象:(数据对象的定义)  数据关系:(数据关系的定义)基本操作:(基本操作的定义)
}

这里再举个例子:

ADT 大学生 {数据对象:学号编号,数据关系:同专业、同班级、同学院等,基本操作:吃饭、睡觉、打豆豆、学习、考试
}

在高级开发语言中我们常常称这种思想为 “面向对象”,这里的 “大学生” 就是 “面向对象” 里面的 “类” 的概念,而具体的学生,比如小明、马超、诸葛亮就是 “大学生” 这个类的具体 “对象”。

1.4 算法基础

这里主要是一些概念问题以及一个计算问题。

1.4.1 算法的定义以及特征

1.4.2 算法的优劣

1.4.3 为什么要用 n

时间复杂度和空间复杂度一般使用 O ( n ) O(n) O(n) 或 O ( n 2 ) O(n^2) O(n2) 来表示,那么首先我们需要明确 n n n 是指什么,为什么要用一个字母来表示复杂度,用具体的数值不行吗?

原因很简单:我们要解决的问题往往是一个 “看不到头” 的问题。如果老师让小学生求解1到10的整数的和是很容易的,1到100的和勉强也能算出来,但是如果1到10000呢 ? 我们会用到常常会用到等差数列求和公式来求解,而等差序列求和公式中 S ( n ) = n ( n + 1 ) 2 S(n)=\frac{n(n+1)}{2} S(n)=2n(n+1)​ 就是一种概括,因为 n n n 不再是具体的某个数,它适用于所有的正整数。

1.4.4 时间复杂度

一般情况下,算法中基本语句重复执行的次数是问题规模 n n n 的某个函数 f ( n ) f(n) f(n),算法的时间量度记作
T ( n ) = O ( f ( n ) ) T(n) = O(f(n)) T(n)=O(f(n))
它表示随问题规模 n n n 的增大, 算法执行时间的增长率和 f ( n ) f(n) f(n) 的增长率相同, 称做算法的 渐近时间复杂度, 简称时间复杂度(Time Complexity)。

其中数字符号 O O O 的严格定义为:

若 T ( n ) T(n) T(n) 和 f ( n ) f(n) f(n) 是定义在正整数集合上的两个函数,则 T ( n ) = O ( f ( n ) ) T(n)=O(f(n)) T(n)=O(f(n)) 表示存在正的常数 C C C 和 n 0 n_0 n0​,使得当 n ≥ n 0 n \ge n_0 n≥n0​ 时都满足 0 ≤ T ( n ) ≤ C f ( n ) 0\leq T(n) \leq Cf(n) 0≤T(n)≤Cf(n)。

定理 1.1 :若 f ( n ) = a m n m + a m − 1 n m − 1 + . . . + a 1 n + a 0 f(n)=a_m n^m + a_{m-1}n^{m-1} + ... +a_1n + a_0 f(n)=am​nm+am−1​nm−1+...+a1​n+a0​ 是一个 m m m 次多项式,则 T ( n ) = O ( n m ) T(n) = O(n^m) T(n)=O(nm)。

这里我们需要结合高等数学中的求极限的思想,也可以理解为 “抓住主要矛盾”。比如我们定义个函数,函数中有个 时间复杂度 n 2 n^2 n2 的循环以及一个时间复杂度为 n 3 n^3 n3 的循环,那么我们应当认为这个函数的时间复杂度为 O ( n 3 ) O(n^3) O(n3)。因为当 n n n 不断变大的时候, n 2 n^2 n2 的影响力相对越小。

1.4.5 空间复杂度

类似于时间复杂度,这里空间复杂度我们理解为算法执行过程中需要额外申请的空间资源即可。比如我们将一个数组反转,有个很简单的方法就是新建一个和它大小一样的数组,然后反过来记录一遍即可,这里需要申请的空间资源就是原数组的大小的资源,即空间复杂度为 O ( n ) O(n) O(n)。

一般而言,由于现在存储技术的快速发展,我们越来越在意的是时间复杂度问题。

1.5 本章小结

本章粗略地过了一遍数据结构的基础内容,主要包括一些术语的介绍以及算法的基本内容。内容较为简单,需要计算的地方应该在于时间复杂度的计算上,并且期末考、考研等都常常遇到这种问题,但由于篇幅问题这里不做介绍。

各位小伙伴们应当一直提醒一下自己是在做一件伟大的事情 —— 学习一门叫作数据结构的艺术课,所以就不那么无聊了吧。现在还没有到创作的时间,我们先把基本工打好。

共勉!

Smileyan
2023.04.27 01:06

趣说数据结构 —— 1. 绪论相关推荐

  1. 【数据结构】绪论部分

    今天由我来跟大家讲一下数据结构的绪论部分吧.数据结构整体复习主要靠理解.理解了学习起来其实是很轻松的事情,学进去了你也会发现很好玩.这篇只是个结构概括,理解就行. 1.1 基本概念 1.数据:即信息. ...

  2. 算法模版:模拟数据结构之绪论【沈七】

    算法模版:模拟数据结构之绪论 前言 什么是数据结构? 先看数据 再看结构 一些术语 逻辑结构 储存结构 完结散花 参考文献 前言 唤我沈七就好. 算下来应该是有两周没更新了. 是因为最近一直在研究数据 ...

  3. 严版数据结构总结--绪论

    严版数据结构总结--绪论 一.绪论 1.1什么是数据结构 1.2基本概念和术语 1.3抽象数据类型的表示与实现 1.4算法与算法分析 抱着试一试的心态在CSDN上写博客,记录下我对严版数据结构的粗浅认 ...

  4. 趣学数据结构--第六章:树

    趣学数据结构---->第六章:树 二叉树 线索二叉树 树的应用 二叉树的深度 二叉树的叶子数 二叉树的结点数 三元组创建二叉树 遍历序列还原树 哈夫曼树 二叉树 二叉树的创建(询问创建以及补空创 ...

  5. 《趣学数据结构》新书预售!

    <趣学数据结构>终于出版了,好事多磨,欢迎大家捧场! 当当:http://product.dangdang.com/27914358.html 京东:https://item.jd.com ...

  6. 数据结构-王道-绪论

    目录 绪论 四种逻辑关系 储存方式 空间复杂度 绪论 数据:客观事物的符号表示.在计算机科学中指的是所有能输入到计算机中冰杯计算机程序处理的符号的总称. 数据又分为数值型数据,非数值型数据 数据元素: ...

  7. 《王道》数据结构之绪论(一)

    数据结构入门之绪论(一) 大纲 一.数据结构 1.1 基本概念 1.2 数据结构三要素 1.2.1 逻辑结构 1.2.2 物理结构 1.2.3 数据运算 二.算法 2.1 基本概念 2.1.1 五个特 ...

  8. 数据结构复习——绪论

    临近期末,线上考试的科目还没有定下来 但想着数据结构本身对计算机专业的人就很重要,那就趁此机会重新过一遍! 今天略有空当,就先总结绪论一篇 有兴趣的同学可以跟我一起学习呀QWQ 本文章以 严书--&l ...

  9. 数据结构One——绪论

    本喵是FW视频封面最终版 宝子,你不点个赞吗?不评个论吗?不收个藏吗? 最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重要. 目录 前言 绪论 1.1数据结构 ...

最新文章

  1. 张和平:益生菌、肠道菌群与健康 |《科学通报》专辑
  2. python opencv-4.1.0 cv2.getTextSize()函数 (计算文本字符串的宽度和高度)
  3. Vue之通过代理设置跨域访问
  4. (六)ElasticSearch 6.1.1聚合查询
  5. java plug机制_插件机制 - OpooPress - 基于 Java 的静态博客生成器
  6. vtigercrm中添加用户字段_linux笔记(一):linux添加用户并赋予root权限
  7. Style Lessons in Clarity and Grace (11th Edition)中文翻译
  8. 求数组中最长连续递增子序列
  9. 网站选择按钮点击无反应?_Win10系统电脑鼠标左键单击没有反应的解决办法
  10. redis面试题简义
  11. 学生签到系统c代码_C++实现简单的学生管理系统
  12. 泛微oa系统服务器怎么填写,泛微协同办公平台Ecology8安装部署手册(105页)-原创力文档...
  13. 微信小程序广告接入,小程序加广告
  14. 管理信息系统需求调研分析指南
  15. 零伽壹浅谈:区块链存证机制之探索
  16. matlab张正友摄像机标定算法应用,张正友摄像机标定的研究(MATLAB+OpenCV)
  17. 合格的CTO应该是什么样?雷军王海峰王小川等共谈「技术创新」| CNCC2020-1
  18. android中小火箭动态喷射动画的简单实现
  19. 求树的直径的两种方法
  20. 2022年中职组网络安全数据库渗透题目

热门文章

  1. NOI的1.7.4石头剪子布
  2. Fly-Buck知识科普以及电路布局
  3. python 读取PDF(tabula和pdfminer和pdfplumber的简单操作)
  4. ES6 的扩展运算符
  5. 00942 ora 表存在_ORA-00942:写入数据库中的表时,表或视图不存在错误
  6. 桂平北回归线标志公园
  7. java drawstring 中文_java中Graphics类drawString()方法问题
  8. Postgresql中plpgsql异常处理方法与实例(RAISE EXCEPTION)
  9. 战争升级谷歌限制华为使用android,谷歌“神助攻”!Android12将不支持华为手机,鸿蒙迎来新挑战...
  10. Java容器接口及其实现类(JCF)