替你读《你不知道的JavaScript》-作用域和闭包
您好,我是沧沧凉凉,是一名前端开发者,目前在掘金、知乎以及个人博客上同步发表一些学习前端时遇到的趣事和知识,欢迎关注。
最近在LeetCode上刷题,在刷题的过程还是比较有趣的,但是由于很多概念上的东西我之前并不了解,比如哈希表、二叉树等等,所以很多题目虽然有了解题思路,但是时间和空间复杂度非常高,导致运行超过规定的时间,所以决定系统性的学习一下数据结构和算法。
算法,前端开发者往往不会重视它,而且通常对于大部分前端开发者来说对于数据的处理也非常简单,所以数据结构对于前端开发者来说相对比较陌生,比如我问过很多人,声明一个数组它是声明在堆上还是声明在栈上?基本都回答不出来,甚至不少人根本不清楚堆和栈。
对于我自己而言,由于我并非科班出身,所以对于数据结构也知之甚少,但是由于各方面原因,所以我决定从《大话数据结构》这本书,开始系统的学习数据结构相关的知识。
现在很多大厂都喜欢考算法,所以如果想去大厂,那么数据结构就是一个绕不过去的坎,必须要踏平它。
前言
早期人们都把计算机理解为数值计算工具,就是感觉计算机当然是用来计算的(这不是计算器嘛~),所以计算机解决问题,应该是先从具体问題中抽象出一个适当的数据模型,设计出一个解此数据模型的算法,然后再编写程序,得到一个实际的软件。
可现实中,我们更多的不是解决数值计算的问题,而是需要一些更科学有效的手段(比如表、树和图等数据结构)的帮助,才能更好地处理问题。所以数据结构是门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。
数据
描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。数据不仅仅包括整型、实型等数值类型,还包
括字符及声音、图像、视频等非数值类型。
比如我们现在常用的搜素引擎,一般会有网页、MP3、图片、视频等分类。MP3就是声音数据,图片当然是图像数据,视频就不用说了,而网页其实指的就是全部数据的搜索,包括最重要的数字和字符等文字数据。
也就是说,我们这里说的数据,其实就是符号,而且这些符号必须具备两个前提:
- 可以输入到计算机中。
- 能被计算机程序处理。
对于整型、实型等数值类型,可以进行数值计算。
对于字符数据类型,就需要进行非数值的处理。而声音、图像、视频等其实是可以通过编码的手段变成字符数据来处理的。
数据元素
组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录。
这里跟面向对象思想非常相似,我们使用面向对象的编程方式时,往往会将某一类别抽取成一个对象,比如:人、鸡、牛、羊、飞机等等,而这些恰好都是数据元素。
数据项
一个数据元素可以由若干个数据项组成。
正如上面所说,所谓的数据项可以理解成为对象的属性,比如人有眼睛、鼻子、耳朵,甚至还有姓名、性别、年龄等等,这些都是数据项,具体有哪些数据项,这个完全由你设计的应用需要哪些来决定。
数据项是数据不可分割的最小单位。在数据结构中,我们把数据项定义为最小单位,是有助于我们解决问题。但其实我们建立数据模型的着眼点一般是数据元素,比如我们在抽象对象时,一定是先从一个数据元素进行出发,比如说人、鸡、牛、羊、飞机等,不会从什么年龄、性别上来考虑抽象。
数据对象
性质相同的数据元素的集合,是数据的子集。
什么叫做性质相同呢?比如说人,一般情况下都有性别、年龄、身高、体重等等数据项。
既然数据对象是数据的子集,在实际应用中,处理的数据元素通常具有相同性质,在不产生混淆的情况下,我们都将数据对象简称为数据。
好了,说了这么多,终于可以开始谈谈到底什么是数据结构。
数据结构
结构,简单的理解就是关系,比如分子结构,就是说组成分子的原子之间的排列方式。严格点说,结构是指各个组成部分相互搭配和排列的方式。在现实世界中,不同数据元素之间不是独立的,而是存在特定的关系,我们将这些关系称为结构。那数据结构是什么?
相互之间存在一种或多种特定关系的数据元素的集合。
在计算机中,数据元素之间肯定会存在着一种或多种特定关系,也就是数据的组织形式。
那么我们就来看看到底存在哪些特定关系!
逻辑结构
指数据对象中数据元素之间的相互关系。
这是我们之后关注的重点,而逻辑结构分为以下4类:
- 集合结构
- 线性结构
- 树形结构
- 图形结构
下面我们就分别来讲解这4种结构:
集合结构
集合结构中的数据元素除了同属于一个集合外,它们之间没有其他关系。各个数据元素是“平等”的,它们的共同属性是“同属于一个集合”。数据结构中
的集合关系就类似于数学中的集合。
线性结构
线性结构中的数据元素之间是一对一的关系。
树形结构
树形结构中的数据元素之间存在一种一对多的层次关系
图形结构
图形结构的数据元素是多对多的关系
我们在用示意图表示数据的逻辑结构时,要注意两点:
- 将每一个数据元素看做一个结点,用圆图表示。
- 元素之间的逻辑关系用结点之间的连线表示,如果这个关系是有方向的,那么用带箭头的连线表示。
物理结构
指数据的逻辑结构在计算机中的存储形式,又被称为存储结构。
存储结构这个名字就非常容易理解,顾名思义就是如何将数据元素储存到计算机的内存中(存储器)。而像硬盘、软盘、光盘等外部存储器的数据组织通常用文件结构来描述。
顺序存储结构
顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。
打个比方就是现实生活中的买东西排队,人与人之间排成一排,每个人之间不允许插队,数组就是这样的顺序存储结构。
但是这个时候就会出现一些比较复杂的情况,比如说有人排了很久,突然想要去上厕所,而上了厕所回来后你可能无法再回到你原来的位置,因为那个位置上没有标明你的名字,还有就是当有人想要插队,有人放弃排队等等情况,这些复杂情况顺序存储结构就非常难进行处理。所以就产生了下面的一种结构。
链表存储结构
数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。数据元素的存储关系并不能反映其逻辑关系,因此需要用个指针存放数据元素的地址,这样通过地址就可以找到相关联数据元素的位置。
上面提到了两个重要的名词,指针和地址这两个概念非常重要。
现在很多餐厅、银行、医院都设置了叫号系统,一般来说你去取一张票,上面有一个号码,它会按顺序依次叫号,这个时候无论你去干什么,只要在叫到你之前及时回来就行,这就比上面说的那种排队方式要好的多。
也就是说数据存储在哪儿不重要,只要有一个指针存放了数据在内存中对应的地址,那么就能够找到这个数据。
但是这也会存在一个弊端,如果指针被意外删除或者丢失后了,那么就无法找到那个指针对应的数据。
逻辑结构是面向问题的,而物理结构就是面向计算机的,其基本的目标就是将数据及其逻辑关系存储到计算机的内存中。
抽象数据类型
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!