文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

web前端怎么将扁平数据结构转Tree

2023-07-02 08:40

关注

这篇文章主要介绍“web前端怎么将扁平数据结构转Tree”,在日常操作中,相信很多人在web前端怎么将扁平数据结构转Tree问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”web前端怎么将扁平数据结构转Tree”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

我们看下题目:打平的数据内容如下:

let arr = [    {id: 1, name: '部门1', pid: 0},    {id: 2, name: '部门2', pid: 1},    {id: 3, name: '部门3', pid: 1},    {id: 4, name: '部门4', pid: 3},    {id: 5, name: '部门5', pid: 4},]

输出结果

[
    {
        "id": 1,
        "name": "部门1",
        "pid": 0,
        "children": [
            {
                "id": 2,
                "name": "部门2",
                "pid": 1,
                "children": []
            },
            {
                "id": 3,
                "name": "部门3",
                "pid": 1,
                "children": [
                    // 结果 ,,,
                ]
            }
        ]
    }
]

我们的要求很简单,可以先不用考虑性能问题。实现功能即可,回头分析了面试的情况,结果使我大吃一惊。

10%的人没思路,没碰到过这种结构

60%的人说用过递归,有思路,给他个笔记本,但就是写不出来

20%的人在引导下,磕磕绊绊能写出来

剩下10%的人能写出来,但性能不是最佳

感觉不是在招聘季节遇到一个合适的人真的很难。

接下来,我们用几种方法来实现这个小算法

什么是好算法,什么是坏算法

判断一个算法的好坏,一般从执行时间和占用空间来看,执行时间越短,占用的内存空间越小,那么它就是好的算法。对应的,我们常常用时间复杂度代表执行时间,空间复杂度代表占用的内存空间。

时间复杂度

时间复杂度的计算并不是计算程序具体运行的时间,而是算法执行语句的次数。

随着n的不断增大,时间复杂度不断增大,算法花费时间越多。 常见的时间复杂度有

计算方法

举个例子:如f(n)=3*n^4+3n+300 则 O(n)=n^4

通常我们计算时间复杂度都是计算最坏情况。计算时间复杂度的要注意的几个点

    let x = 1;    while (x <100) {     x++;    }
  for (i = 0; i < n; i++){         for (j = 0; j < n; j++) {             // ...code         }     }
    for(var i = 0; i<n && arr[i] !=1; i++) {    // ...code    }

空间复杂度

空间复杂度是对一个算法在运行过程中临时占用存储空间的大小。

计算方法:

计算空间复杂度的简单几点

仅仅只复制单个变量,空间复杂度为O(1)。举例如下:空间复杂度为O(n) = O(1)。

   let a = 1;   let b = 2;   let c = 3;   console.log('输出a,b,c', a, b, c);

递归实现,调用fun函数,每次都创建1个变量k。调用n次,空间复杂度O(n*1) = O(n)。

    function fun(n) {       let k = 10;       if (n == k) {           return n;       } else {           return fun(++n)       }    }

不考虑性能实现,递归遍历查找

主要思路是提供一个递getChildren的方法,该方法递归去查找子集。 就这样,不用考虑性能,无脑去查,大多数人只知道递归,就是写不出来。。。

const getChildren = (data, result, pid) => {  for (const item of data) {    if (item.pid === pid) {      const newItem = {...item, children: []};      result.push(newItem);      getChildren(data, newItem.children, item.id);    }  }}const arrayToTree = (data, pid) => {  const result = [];  getChildren(data, result, pid)  return result;}

从上面的代码我们分析,该实现的时间复杂度为O(2^n)。

不用递归,也能搞定

主要思路是先把数据转成Map去存储,之后遍历的同时借助对象的引用,直接从Map找对应的数据做存储

function arrayToTree(items) {  const result = [];   // 存放结果集  const itemMap = {};  //   // 先转成map存储  for (const item of items) {    itemMap[item.id] = {...item, children: []}  }  for (const item of items) {    const id = item.id;    const pid = item.pid;    const treeItem =  itemMap[id];    if (pid === 0) {      result.push(treeItem);    } else {      if (!itemMap[pid]) {        itemMap[pid] = {          children: [],        }      }      itemMap[pid].children.push(treeItem)    }  }  return result;}

从上面的代码我们分析,有两次循环,该实现的时间复杂度为O(2n),需要一个Map把数据存储起来,空间复杂度O(n)

最优性能

主要思路也是先把数据转成Map去存储,之后遍历的同时借助对象的引用,直接从Map找对应的数据做存储。不同点在遍历的时候即做Map存储,有找对应关系。性能会更好。

function arrayToTree(items) {  const result = [];   // 存放结果集  const itemMap = {};  //   for (const item of items) {    const id = item.id;    const pid = item.pid;    if (!itemMap[id]) {      itemMap[id] = {        children: [],      }    }    itemMap[id] = {      ...item,      children: itemMap[id]['children']    }    const treeItem =  itemMap[id];    if (pid === 0) {      result.push(treeItem);    } else {      if (!itemMap[pid]) {        itemMap[pid] = {          children: [],        }      }      itemMap[pid].children.push(treeItem)    }  }  return result;}

从上面的代码我们分析,一次循环就搞定了,该实现的时间复杂度为O(n),需要一个Map把数据存储起来,空间复杂度O(n)

小试牛刀

方法1000(条)10000(条)20000(条)50000(条)
递归实现154.596ms1.678s7.152s75.412s
不用递归,两次遍历0.793ms16.499ms45.581ms97.373ms
不用递归,一次遍历0.639ms6.397ms25.436ms44.719ms

从我们的测试结果来看,随着数量的增大,递归的实现会越来越慢,基本成指数的增长方式。

到此,关于“web前端怎么将扁平数据结构转Tree”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯