替你读《你不知道的JavaScript》-作用域和闭包

您好,我是沧沧凉凉,是一名前端开发者,目前在掘金知乎以及个人博客上同步发表一些学习前端时遇到的趣事和知识,欢迎关注。


最近在LeetCode上刷题,在刷题的过程还是比较有趣的,但是由于很多概念上的东西我之前并不了解,比如哈希表、二叉树等等,所以很多题目虽然有了解题思路,但是时间和空间复杂度非常高,导致运行超过规定的时间,所以决定系统性的学习一下数据结构和算法。

算法,前端开发者往往不会重视它,而且通常对于大部分前端开发者来说对于数据的处理也非常简单,所以数据结构对于前端开发者来说相对比较陌生,比如我问过很多人,声明一个数组它是声明在堆上还是声明在栈上?基本都回答不出来,甚至不少人根本不清楚堆和栈。

对于我自己而言,由于我并非科班出身,所以对于数据结构也知之甚少,但是由于各方面原因,所以我决定从《大话数据结构》这本书,开始系统的学习数据结构相关的知识。

现在很多大厂都喜欢考算法,所以如果想去大厂,那么数据结构就是一个绕不过去的坎,必须要踏平它。


前言

早期人们都把计算机理解为数值计算工具,就是感觉计算机当然是用来计算的,所以计算机解决问题,应该是先从具体问題中抽象出一个适当的数据模型,设计出一个解此数据模型的算法,然后再编写程序,得到一个实际的软件。

可现实中,我们更多的不是解决数值计算的问题,而是需要一些更科学有效的手段(比如表、树和图等数据结构)的帮助,才能更好地处理问题。所以数据结构是门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。

数据

数据:是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。数据不仅仅包括整型、实型等数值类型,还包
括字符及声音、图像、视频等非数值类型。

比如我们现在常用的搜素引擎,一般会有网页、MP3、图片、视频等分类。MP3就是声音数据,图片当然是图像数据,视频就不用说了,而网页其实指的就是全部数据的搜索,包括最重要的数字和字符等文字数据。

也就是说,我们这里说的数据,其实就是符号,而且这些符号必须具备两个前提

  1. 可以输入到计算机中。
  2. 能被计算机程序处理。

对于整型、实型等数值类型,可以进行数值计算。

对于字符数据类型,就需要进行非数值的处理。而声音、图像、视频等其实是可以通过编码的手段变成字符数据来处理的。

数据元素

数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录。

数据项

数据项:一个数据元素可以由若干个数据项组成。

数据项是数据不可分割的最小单位。

数据对象

数据对象:是性质相同的数据元素的集合,是数据的子集。

数据结构

数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。

逻辑结构

逻辑结构:是指数据对象中数据元素之间的相互关系。

集合结构

线性结构

树形结构

图形结构

物理结构

指数据的逻辑结构在计算机中的存储形式

顺序存储结构

链表存储结构