前端JavaScript数据结构和算法——基本概念
简介:本部分主要是介绍数据结构和算法的基本概念,尤其是讲解了时间复杂度,提及了空间复杂度。
第一部分:
1.数据结构基本概念
a.数据
数据是信息的载体,是描述事物属性的数,字符串,以及所有能输入到计算机中并被计算机识别和处理的符号集合
b.数据元素
数据元素是数据的基本单位,一个数据元素可由多个数据项构成
c.数据对象
是具有相同性质的数据元素的集合。是数据的一个子集
d.数据类型
数据类型是一个值的集合和定义在此集合上的一组操作的总称
(1)原子类型:其值不能再分割的数据类型
(2)结构类型:其值可再分为若干成分的数据类型
(3)抽象数据类型:抽象数据组织及相关操作
e.抽象数据类型
指的是一个数学模型及定义在该模型上的一组操作。(抽象数据类型的定义仅仅取决于它的一组逻辑特性,与其在计算机内如何表示和实现无关。也就是说不管他内部结构如何变化,只要他的数学特性不变,就不影响其外部使用),通常用(数据对象、数据关系、基本操作集)这样三元组来表示抽象数据类型。
f.数据结构
任何问题中,数据元素都不是孤立的。他们之间的关系称为结构。也就是数据结构是相互之间存在一种或多种特定关系的数据元素的集合。一般包括这三个方面(逻辑结构、存储结构、和数据的运算)。(数据的逻辑结构和存储结构是密不可分的。一个算法的设计取决于所选定的逻辑结构,算法的实现依赖于所采用的存储结构)
2.数据结构三要素
a.逻辑结构
指的是数据之间的逻辑关系。与数据的存储无关是独立于计算机的。(一般分为线性结构[例如:线性表]和非线性结构[例如集合、树、图])
(1)线性结构:数据之间只存在一对一的关系
(2)树形结构:数据之间存在一对多的关系
(3)图或网状结构:数据之间存在多对多的关系
b.数据的存储结构
即数据结构在计算机中的表示(物理结构),(数据的存储结构是由计算机语言实现的逻辑结构(比如JavaScript),依赖于计算机语言),数据的存储结构主要有:顺序存储、链式存储、索引存储、散列存储
第二部分:
3.算法
算法是对特定问题求解步骤的一种描述
算法5特性如下:
a.有穷性
b.确定性
c.可行性
d.输入
e.输出
4.时间复杂度
一条语句的频度是指该语句在算法中被重复执行的次数。算法中所有语句的频度之和记为T(n),他是问题规模n的函数。时间复杂度主要是分析T(n)的数量级。因为算法中基本运算的频度与T(n)通数量级,所以采用算法基本运算频度f(n)来分析算法的时间复杂度。
一般有一条准则就是:一般是考虑最坏时间复杂度,以保证算法的运行时间不会比它更长。
时间复杂度的加法规则:T(n,m)=T1(n)+T2(n)=O(max(f(n),g(m))
时间复杂度的乘法规则:
(1)T(n,m)=T1(n)∗T2(m)=O(f(n)∗g(m))T(n,m)=T1(n)∗T2(m)=O(f(n)∗g(m))
(2)O(n)∗O(m)=O(n∗m
常见的渐进的时在这里插入代码片间复杂度为:O(1)<O(log2n)<O(n)<O(nlog2n)<O(n²)<O(n³)<O(2ⁿ)<O(n!)<O(nⁿ)
5.时间复杂度的实例分析:
//分析函数text1的时间复杂度
function test1(n){
let a = 1;
while(a<=n){
a = a*2;
}
}
//分析函数text2的时间复杂度
function test2(n){
let a = 1
for(let i = 0;i<n;i++){
a ++;
}
}
首先分析函数test1。
设执行a= a * 2 这条语句执行了t次,根据a = a*2,a=1 有a= 2^t那么又while中的条件可知 2^t = n;推出t = log2n 因此次函数的时间复杂度为O(log2n)
函数test1就比较简单了,a++这条语句一直执行n次因此时间复杂度为O(n)
//分析其时间复杂度
function test3(n){
let i = 0,sum = 0;
while(sum<n){
sum += ++i;
return i;
}
}
test3函数的时间复杂度是O(n^(1/2));具体解决见下期(js算法——数组(线性表))
5.空间复杂度
空间复杂度是指:算法的空间复杂度S(n)定义为该算法所耗费的存储空间。他是问题规模n的函数。(一般来说:一段程序除了本身所用的指令、常数、变量、和输入数据以外,还需要一些对数据进行操作的工作单元和存储为实现计算所需要的一些信息的辅助空间,比如递归是常见的空间复杂度很高的一种场景)