记一次看到的小心得(数据结构和算法)
Posted oo猫饼oo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次看到的小心得(数据结构和算法)相关的知识,希望对你有一定的参考价值。
学习数据结构和算法,一定会在你的工作中派上用场
经常会感觉学习数据结构和算法没有什么大的用处,因为工作基本用不上。写完代码就丢了不去优化所以觉得算法没意义,又难又容易忘记。
例如下边代码:
data.filter(({id}) => {
return selectedIds.includes(id);
})
逻辑就是筛选出 data
里面已经被勾选的数据。当200条数据,完全没压力,性能没影响。但当数据调到了2万条再去测试,代码弊端就暴露出来了,界面进入卡顿,重新选择的时候也会卡顿。然后就开始了优化,思路如下:
按照代码来看,这是一个两层循环的暴力搜索时间复杂度为 O(n^2)
。从 selectedIds.includes(id)
这句入手优化
改变暴力搜索的方法基本都是:
- 上指针
- 数组升维
- 利用
hash
表
利用 hash
表思想解决这个问题,因为 js
里面有一个天然的 hash
表结构就是对象。我们知道 hash
表的查询是 O(1)
的,所以将代码改写如下:
const ids = {};
selectedIds.forEach(id => ids[id] = 1);
data.filter(({id}) => {
return !!ids[id];
})
将从 selectedIds
查询变成从 ids
查询,这样时间复杂度就从 O(n^2)
变成了 O(n)
了,这段代码增加了
const ids = {};
selectedIds.forEach(id => ids[id] = 1);
其实增加了一个 selectedIds
遍历也是一个 O(n)
的复杂度,总来说复杂度是 O(2n)
,但是从时间复杂度长期期望来看还是一个 O(n)
的时间复杂度,只不过额外增加了一个对象,所以这也是一个典型的空间换时间的例子,但是也不要担心,ids
用完之后垃圾回收机制会把它回收的。
以上是关于记一次看到的小心得(数据结构和算法)的主要内容,如果未能解决你的问题,请参考以下文章