博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
前端的数据结构与算法(1)-- dfs
阅读量:6182 次
发布时间:2019-06-21

本文共 1613 字,大约阅读时间需要 5 分钟。

dfs

dfs

前端在开发过程中接触到的算法最多的莫过于排序和 dfs(深度优先遍历) 。 dfs 算法广泛用于图(树是图的一种)的遍历,如:没有 querySelectorAll 的时候,根据 classname 或者 tag 查找 element。

关于 dfs 算法的遍历过程,我简略的画了一个示例图:

dfs.gif

实例:

最近在实际业务场景中,跟后端约定页面中所有组件的消息根据页面上的组件 id 聚合到一个对象中,后端返回的是类似如下的一个树形数据结构。前端需要把所有的错误信息都拿出来,按照页面上所有组件的顺序聚合显示在一个全局信息面板组件上(至于按照组件顺序排序算法本文暂且略过)

let tree = {    'id1': {        message: 'hello'    },    'id2': {        message: 'world',        children: {          'id2-1': {              message: 'haha',              children: {              }          },          'id2-2': {              message: 'heihei'          }        }    }}

由于某些大组件可能是由多个小组件层层嵌套组合而来,且每个小组件都有相应的 message 需要展示,所以就选择了上述的树形结构来表达组件的信息。这个时候就会有人问,为什么不让后端把所有 message 都聚合到数组里面?因为前端不仅需要把这些错误信息聚合到一起展示,也需要把错误定位到具体组件上

递归版本实现

function dfs(tree = {}, messages = []) {    let i = 0;    if(!messages) messages = [];    if(tree.message) messages.push(tree.message);        const keys = Object.keys(tree.children || {});    while (i < keys.length) {        dfs(tree.children[keys[i]], messages);        i += 1;    }    return messages;} tree = {    message: null,    children: tree };    dfs(tree);

非递归版本实现

function dfs(tree = {}) {    const array = [tree];    let messages = [];    while (array.length) {      const top = array.pop();      if (top.message) {        messages.push(top.message);      }      const keys = Object.keys(top.children || {});      let i = keys.length;      while (i > 0) {        i -= 1;        array.push(top.children[keys[i]]);      }    }    return messages  }   tree = {    message: null,    children: tree };    dfs(tree);

在实际使用中,考虑到数据结构的层数没那么多,其实尾递归版本和非递归版本所消耗的时间在浏览器的优化下几乎可忽略了。

转载地址:http://ijdda.baihongyu.com/

你可能感兴趣的文章
Elasticsearch之元数据(meta-fields)介绍
查看>>
基于Django+Bootstrap框架,可视化展示内存监控信息
查看>>
Pytorch | BERT模型实现,提供转换脚本【横扫NLP】
查看>>
biostar handbook: 第七周笔记汇总+调整通知
查看>>
涨薪必备|给你一份超详细Spring Boot知识清单
查看>>
YII2 关联查询,不修改search, 使用 GridView::widget 输出
查看>>
DNS服务-了解篇
查看>>
Apache Shiro在web开发安全技术中的应用
查看>>
源码安装MySQL 5.1 GA
查看>>
苹果电脑获取Android Studio的发布版SHA1和开发版SHA1
查看>>
How to troubleshooting RAC Vip Problem
查看>>
jar 命令 打包装class文件的文件夹
查看>>
CentOS 7.2 部署Saltstack
查看>>
centos7下安装MPlayer
查看>>
docker容器中安装vim
查看>>
smokeping 监控
查看>>
NTB EEPROM设置与跨节点数据传输
查看>>
IEEE 802.1Q Tunneling
查看>>
linux服务器之lamp(傻瓜式)
查看>>
OSPF邻居关系建立过程详解
查看>>