算法和数据结构--学习笔记一

153 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情

1. 算法

数学领域的算法是用于解决某一类问题的公式和思想。

计算机科学领域的算法,它的本质是一系列程序指令,用于解决特定的运算和逻辑问题。

衡量算法好坏(高效、拙劣)的重要标准:

a. 时间复杂度

时间复杂度是对一个算法运行时间长短的量度,用大O表示,记作 T(n)=O(f(n))。

常见的时间复杂度按照从低到高的顺序,包括O(1)、O(logn)、 O(n)、O(nlogn)、O(n2 )等。

b. 空间复杂度

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量 度,用大O表示,记作S(n)=O(f(n))。

常见的空间复杂度按照从低到高的顺序,包括O(1)、O(n)、O(n2 ) 等。其中递归算法的空间复杂度和递归深度成正比。

2. 数据结构

数据结构是算法的基石,是数据的组织、管理和存储格式,其使用目的是为了高效地访问和修改数据。

a. 线性结构

线性结构是最简单的数据结构,包括数组、链表,以及由它们衍生 出来的栈、队列。

1. 数组

数组对应的英文是array,是有限个相同类型的变量所组成的有序集合,数组中的每一个变量被称为元素。数组是最为简单、最为常用的数据结构。

数组的基本操作

读取元素:根据下标读取元素。 eg: array[0]

更新元素: 要把数组中某一个元素的值替换为一个新值。 eg: array[5] = 10;

//创建数组 
let arrayName = [1,2,3,4,5,6,7]  //let arrayName = new Array() new关键字初始化数组

// 获取数据长度
let len = arrayName.length

//添加元素 添加到数组最后的位置
arrayName.push(4)
// 在数组首位插入数据
arrayName.unshift(-1)

//删除元素 最后的元素
arrayName.pop()
//删除首位元素
arrayName.shift()

// 通过splice删除数据  删除索引起始位置为5的2个元素
arrayName.splice(5, 2)

常用方法:

原数组会改变的方法

方法名方法描述举例说明
push添加元素到数组最后的位置,并返回新长度项目流程的增加、删除 =>> 数组增加对象,删除不常用,使用splice删除数据。this.sdata = {};this.nodearr = [];sdata.value = this.sname;this.nodearr.push(this.sdata)
unshift添加元素到数组首位
shift删除数组首位元素
pop删除数组最后的元素
splice删除或者添加任意指定位置的任意元素删除当前点击删除按钮的数据 pro_data.splice(index, 1);第二个参数为0时表示不是删除数据, 而是插入数据 arrayName.splice(5, 0, 8, 7)
sort按照字母顺序对数组排序,支持传入指定排序方法的函数作为参数
reverse颠倒数组中元素的顺序

原数组不变的方法

方法名方法描述举例说明
every对数组中的每一项运行给定函数,如果该函数对每一项都返回 true,则返回true, 否则返回false
some对数组中的每一项运行给定函数,如果任一项返回 true,则结果为true, 并且迭代结束判断客户(两个或者一个)的手机号中任意一个匹配登录的手机号this.cusData.item_customer.some(item =>{return this.cusInfo.tel == item.tel})
filter对数组中的每一项运行给定函数,该函数返回值为 true的项组成的新数组需要筛选出任务列表中是普通任务的数据lists.filter(item=>item.groups == 'normal')
map对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组
includes在数组中寻找与给定参数相等的元素,找到则返回true,找不到则返回false用于判断一个元素是否存在于数组中
indexOf返回第一个与给定参数相等的数组元素的索引,没有找到则返回-1用于查找一个元素的位置
lastIndexOf返回指定元素在数组中的最后一个的索引,如果不存在,则返回-1
slice传入索引值,将数组里对应索引范围内的元素作为新数组返回,但是不包括最后索引值的元素
concat连接数组,返回一个新数组
join将所有的数组元素连接成一个字符串
toString将数组作为字符串返回

2. 链表

单向链表

单向链表的每一个节点又包含两部分,一部分是存放数据的变量 data,另一部分是指向下一个节点的指针next。

双向链表

每一个节点除了拥有data 和next指针,还拥有指向前置节点的prev 指针

3. 栈

栈(stack)是一种线性数据结构,栈中的元素只能先入后出 (First In Last Out,简称FILO )。最早进入的元素存放的位置叫作栈底 (bottom),最后进入的元素存放的位置叫作栈顶 (top)。

4. 队列

队列(queue)是一种线性数据结构,队列中的元素只能先入先出 (First In First Out,简称FIFO )。队列的出口端叫作队头 (front),队列的 入口端叫作队尾 (rear)

b. 非线性数据结构

  1. 树是相对复杂的数据结构,其中比较有代表性的是二叉树,由它又衍生出了二叉堆之类的数据结构。
  2. 散列表也叫作哈希表(hash table),这种数据结构提供了键(Key) 和值(Value) 的映射关系。只要给出一个Key,就可以高效查找到它所匹配的Value,时间复杂度接近O(1)。