使用JavaScript学习数据结构和算法(4) | 小册免费学

562 阅读3分钟

系列文章

搜索算法

顺序搜索

顺序或线性搜索是最基本的搜索算法,它的机制是,将每一个数据结构中的元素和我们要找的元素做比较,顺序搜索是一种抵消的算法。

步骤

  • 遍历这个呢个数组,并将每个元素和搜索项比较
  • 如果搜索到就返回 true 或索引,搜素不到返回 false 或-1,

二分搜索

二分搜索采用分而治之的方法,这个算法要求被搜索的数据结构已排序,然后将数据一分为二。直到找到该值为止。

步骤

  • 选择选中值的中间值
  • 如果选择的值是待搜索值,那么算法执行结束(找到了)
  • 如果待搜索的值比选中值要小,则返回步骤 1 并在选中值左边的子数组中寻找
  • 如果待搜索的值比选中值要大,则返回步骤 1 并在选中值右边的子数组中寻找。

二分.png

JS 实现 | 循环版本

function binarySeachFindIndex(arr, target) {
  let low = 0;
  let high = arr.length - 1;
  let mid = null;
  while (low <= high) {
    mid = Math.floor((low + high) / 2);
    if (target === arr[mid]) {
      return mid;
    }
    if (target > arr[mid]) {
      low = mid + 1; // 猜大了 +1
    } else {
      high = mid - 1; // 猜小了 -1
    }
  }
  return -1; // 没找到 返回 -1
}
let result = binarySeachFindIndex([1, 2, 3, 4, 5, 6], 5);
console.log(result); // 4

JS 实现 | 循环版本

function binarySeachFindIndex(arr, target, low = 0, high = arr.length - 1) {
  let mid = Math.floor((low + high) / 2);
  let cur = arr[mid];
  if (cur === target) {
    return mid;
  } else if (cur > target) {
    return binarySeachFindIndex(arr, target, low, mid - 1);
  } else if (cur < target) {
    return binarySeachFindIndex(arr, target, mid + 1, high);
  } else {
    return -1;
  }
}
let result = binarySeachFindIndex([1, 2, 3, 4, 5, 6], 5);
console.log(result); // 4

补充知识

递归

能够调用自身的方法或函数就是递归函数,每个递归函数都必须有一个边界条件,即一个不再递归的条件(停止点),以防止无限递归,无限递归会导致栈溢出(stack overflow error)。

  • 自己调用自己函数
  • 存在一个边界条件 JS 数组扁平化
Array.prototype.flat = function() {
  let arr = [];
  this.forEach((item, index) => {
    if (Array.isArray(item)) {
      arr = arr.concat(item.flat()); //是数组 连接数组+继续递归
    } else {
      arr.push(item); // 非数组,push
    }
  });
  return arr; // 递归出口
};
let arr = [
  1,
  2,
  3,
  [4, 5, 6, [7, 8, 9, [10]]],
  [10, 11],
  [12, 13, [14, 15, [16, 17, [18, 19, [20]]]]],
];
console.log(arr.flat());
//  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

斐波那契数列

定义

  • 1 和 2 的斐波那契数是 1
  • n(n > 2) 的斐波那契数是(n + 1)的斐波那契数加上(n - 2)的斐波那契数
  • 参考爬楼梯

动态规划

动态规划,是一种将复杂问题分解成更小问题来解决的优化技术。

贪心算法

贪心算法遵循一种近似解决问题的技术,期盼通过每个阶段的局部最优选择,从而达到全局的最优。

大 O 表示法

即时间复杂度,通常使用最差的时间复杂度来衡量一个算法的好坏,即 CUP 运行一个算法所需的时间。

  • O(1):只运行一次
  • O(log(n)): 运行 n 的对数次
  • O(n):运行 n 次,n 是(输入)数组的大小
  • O(n^2):运行 n^2,输入值的平方

OIP.jpg

参考

来自九旬的原创:博客原文链接

本文正在参与「掘金小册免费学啦!」活动, 点击查看活动详情