记一次看到的小心得(数据结构和算法)

Posted oo猫饼oo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次看到的小心得(数据结构和算法)相关的知识,希望对你有一定的参考价值。

学习数据结构和算法,一定会在你的工作中派上用场

经常会感觉学习数据结构和算法没有什么大的用处,因为工作基本用不上。写完代码就丢了不去优化所以觉得算法没意义,又难又容易忘记。

例如下边代码:

data.filter(({id}) => {
  return selectedIds.includes(id);
})

逻辑就是筛选出 data 里面已经被勾选的数据。当200条数据,完全没压力,性能没影响。但当数据调到了2万条再去测试,代码弊端就暴露出来了,界面进入卡顿,重新选择的时候也会卡顿。然后就开始了优化,思路如下:

按照代码来看,这是一个两层循环的暴力搜索时间复杂度为 O(n^2) 。从 selectedIds.includes(id) 这句入手优化

改变暴力搜索的方法基本都是:

  1. 上指针
  2. 数组升维
  3. 利用 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 用完之后垃圾回收机制会把它回收的。

以上是关于记一次看到的小心得(数据结构和算法)的主要内容,如果未能解决你的问题,请参考以下文章

springMvc前端传递参数为json数组形式,记一次心得

记一次nacos配置中心使用心得

记一次寒假小尝试心得体会

Android记一次后台保活设计心得2018

记一次刻苦铭心得安装zabbix经历

记一次sql注入实战