算法学习

162 阅读2分钟

一起学算法~

扁平结构转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 },
];

const getTreeData2 = (tree) => {
  const map = {};
  const res1 = [];
  tree.forEach((item) => {
    map[item.id] = item;
  });
  tree.forEach((item) => {
    // 找到他的父节点
    const parent = map[item.pid];
    if (parent) {
      // 找到父节点,将这个item 放到父节点的children 下面
      (parent.children || (parent.children = [])).push(item);
    } else {
      // 直接放入
      res1.push(item);
    }
  });
  return res1;
};

getTreeData2(arr);

javaScript 中的dfs和bfs

在项目中常常遇到树形的数据结构,然后去找到里面的某一条数据,这里我们常常会使用递归查找,也可以使用深度优先遍历或者广度优先遍历

const trees = {
  name: 'test',
  children: [
    {
      name: '北京',
      children: [
        {
          name: '朝阳群众',
          children: [
            {
              name: '西宁市',
              code: '0521',
            },
          ],
        },
        {
          name: '海淀区',
        },
        {
          name: '昌平区',
        },
      ],
    },
    {
      name: '浙江省',
      children: [
        {
          name: '杭州市',
          code: '0571',
        },
        {
          name: '嘉兴市',
        },
        {
          name: '绍兴市',
        },
        {
          name: '宁波市',
        },
      ],
    },
  ],
};

// 递归
const getNode = (tree, name) => {
  if (tree.name === name) return tree;
  if (!tree.name && !tree.children) return null;
  for (const i in tree.children) {
    const results = getNode(tree.children[i], name);
    if (results) {
      return results;
    }
  }
};

// 深度优先,先进后出(在一个栈里面先按深度依次入栈然后出栈)
const dfsNode = (tree, name) => {
  const stack = [];
  stack.push(tree);
  while (stack.length !== 0) {
    const current = stack.pop();
    if (current.name === name) {
      return current;
    }
    if (current.children && current.children.length !== 0) {
      for (let i = 0; i < current.children.length; i++) {
        stack.push(current.children[i]);
      }
    }
  }
};

// 广度优先,利用队列,先进先出,按照层级进行遍历,将childer 依次放到队列中

const bfsNode = (tree, name) => {
  const queue = [];
  let result = {};
  queue.push(tree);
  while (queue.length !== 0) {
    const current = queue.shift();
    if (current.name === name) {
      result = current;
      break;
    }
    if (current.children && current.children.length !== 0) {
      for (let i = 0; i < current.children.length; i++) {
        queue.push(current.children[i]);
      }
    }
  }
  return result;
};

console.log(getNode(trees, '朝阳群众'));
console.log(dfsNode(trees, '朝阳群众'), '-->dfs');
console.log(bfsNode(trees, '朝阳群众'), '-->bfs');

二分查找

1.数组为有序数组 (生序或者降序) 2.数组中没有重复元素

/**
 *
 *  二分查找
 *  前提条件
 *  1. 数组为有序数组 (生序或者降序)
 *  2. 数组中没有重复元素
 *
 */
let arr = [5, 4, 3, 2, 1];

const search = (target, nums) => {
  let left = 0;
  let right = nums.length - 1;

  while (left <= right) {
    let middle = Math.floor((right + left) / 2);
    if (nums[middle] > target) {
      right = middle - 1; // 升序
      // left = middle + 1;
    } else if (nums[middle] < target) {
      left = middle + 1; // 升序
      // right = middle - 1;
    } else {
      return middle;
    }
  }

  return -1;
};

search(5, arr);

leetcode 题目