程序员必须掌握哪些算法?——前端开发工程师需要掌握的算法

news2024/11/18 4:37:23

文章目录

  • 📋前言
  • 🎯什么是算法?
  • 🎯前端开发工程师需要掌握的算法
    • 🧩排序算法(如快速排序、归并排序)
    • 🧩搜索算法(如二分搜索)
    • 🧩图算法(如广度优先搜索、最短路径算法)
    • 🧩扁平数据结构转Tree
  • 📝最后


在这里插入图片描述

📋前言

一个程序员一生中可能会邂逅各种各样的算法,但总有那么几种,是作为一个程序员一定会遇见且大概率需要掌握的算法。作为一名前端开发工程师,今天就通过这个话题和文章来聊聊前端开发工程师需要掌握的算法有哪些呢。


🎯什么是算法?

算法(Algorithm) 是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间,空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
在这里插入图片描述
算法具有以下特点:

  • 明确性:算法必须使用精确的、明确的步骤来解决问题,没有歧义。
  • 有限性:算法必须在执行有穷步骤后终止,无限循环的算法将无法得出结果。
  • 输入:算法具有零个或多个输入,这些输入是算法的初始数据。
  • 输出:算法产生一个或多个输出,这些输出是以某种形式表示问题的解。
  • 可行性:算法必须是能够实际执行的,它使用有限的计算资源来解决问题。

然后下面举一个简单的算法示例——冒泡排序算法。冒泡排序是一种基础的排序算法,在排序过程中,它会不断交换相邻元素的位置,将较大的元素逐步“冒泡”到数组的末尾。具体步骤如下:

  • 从数组的第一个元素开始,比较相邻的两个元素并交换它们的位置,如果前一个元素大于后一个元素,则交换它们的位置。
  • 继续比较数组的下一对相邻元素,并重复步骤1,直到遍历完整个数组。
  • 重复执行步骤 1 和步骤 2 ,直到没有交换操作发生,即数组已经完全排序。

以下是使用冒泡排序算法对一个数组进行排序的示例代码:

function bubbleSort(arr) {
  const length = arr.length;
  
  for (let i = 0; i < length - 1; i++) {
    for (let j = 0; j < length - 1 - i; j++) {
      if (arr[j] > arr[j + 1]) {
        // 交换相邻元素的位置
        const temp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = temp;
      }
    }
  }

  return arr;
}

const arr = [6, 2, 9, 5, 1, 8];
console.log(bubbleSort(arr));  // 输出:[1, 2, 5, 6, 8, 9]

在这里插入图片描述


🎯前端开发工程师需要掌握的算法

作为前端开发工程师,了解和掌握一些常用的算法可以帮助你更好地解决问题,优化代码性能,并提高开发效率。以下是几个常见的算法及其应用场景。

🧩排序算法(如快速排序、归并排序)

排序算法用于将一组数据按照指定的顺序进行排列。前端开发中常用于对列表数据进行排序,如表格中的行排序、搜索结果的排序等。

示例代码(快速排序):

function quickSort(arr) {
  if (arr.length <= 1) {
    return arr;
  }

  const pivotIndex = Math.floor(arr.length / 2);
  const pivot = arr.splice(pivotIndex, 1)[0];
  const left = [];
  const right = [];

  for (const num of arr) {
    if (num < pivot) {
      left.push(num);
    } else {
      right.push(num);
    }
  }

  return [...quickSort(left), pivot, ...quickSort(right)];
}

const arr = [6, 2, 9, 5, 1, 8];
console.log(quickSort(arr)); // 输出: [1, 2, 5, 6, 8, 9]

在这里插入图片描述

🧩搜索算法(如二分搜索)

搜索算法用于在一个有序或部分有序的数据集合中查找特定的值。在前端开发中,常用于对数组或列表进行快速查找,如在一个有序的下拉选项列表中搜索某个值。

示例代码(二分搜索):

function binarySearch(arr, target) {
  let left = 0;
  let right = arr.length - 1;

  while (left <= right) {
    const mid = Math.floor((left + right) / 2);

    if (arr[mid] === target) {
      return mid;
    }

    if (arr[mid] < target) {
      left = mid + 1;
    } else {
      right = mid - 1;
    }
  }

  return -1;
}

const arr = [1, 2, 5, 6, 8, 9];
console.log(binarySearch(arr, 6)); // 输出: 3

在这里插入图片描述

🧩图算法(如广度优先搜索、最短路径算法)

图算法用于解决与图相关的问题,如寻找两个节点之间的最短路径、查找连通性等。在前端开发中,常用于处理网络拓扑、关系图等场景。

示例代码(最短路径算法 - Dijkstra 算法):

class PriorityQueue {
  constructor() {
    this.queue = [];
  }

  enqueue(element) {
    if (this.isEmpty()) {
      this.queue.push(element);
    } else {
      let added = false;
      for (let i = 0; i < this.queue.length; i++) {
        if (element.priority < this.queue[i].priority) {
          this.queue.splice(i, 0, element);
          added = true;
          break;
        }
      }
      if (!added) {
        this.queue.push(element);
      }
    }
  }

  dequeue() {
    if (!this.isEmpty()) {
      return this.queue.shift();
    }
  }

  isEmpty() {
    return this.queue.length === 0;
  }
}
function dijkstra(graph, startNode, endNode) {
    
  const distances = {};
  const visited = new Set();
  const queue = new PriorityQueue();

  for (const node in graph) {
    distances[node] = Infinity;
  }

  distances[startNode] = 0;
  queue.enqueue({ node: startNode, priority: 0 });

  while (!queue.isEmpty()) {
    const { node } = queue.dequeue();

    if (node === endNode) {
      return distances[endNode];
    }

    if (visited.has(node)) {
      continue;
    }

    visited.add(node);

    const neighbors = graph[node];
    for (const neighbor in neighbors) {
      const distance = neighbors[neighbor];
      const totalDistance = distances[node] + distance;

      if (totalDistance < distances[neighbor]) {
        distances[neighbor] = totalDistance;
        queue.enqueue({ node: neighbor, priority: totalDistance });
      }
    }
  }

  return -1;
}

const graph = {
  A: { B: 5, C: 2 },
  B: { A: 5, C: 1, D: 3 },
  C: { A: 2, B: 1, D: 2 },
  D: { B: 3, C: 2 }
};

console.log(dijkstra(graph, "A", "D")); // 输出: 4

在这里插入图片描述

🧩扁平数据结构转Tree

在前端开发中,我们经常需要将扁平数据结构转换为树形结构(Tree)。比如在网站菜单、商品分类等场景下,都需要使用树形结构来实现数据的层级呈现。在本篇博客中,我将介绍一种常见的方法,使用递归方式来将扁平数据结构转换成树形结构。详情请看文章:浅理解扁平数据结构转Tree(树形结构)


📝最后

一个程序员一生中可能会邂逅各种各样的算法,但总有那么几种,是作为一个程序员一定会遇见且大概率需要掌握的算法。

文章介绍的这些算法仅仅是前端开发中常见的一部分,实际应用还要根据具体需求来选择。通过熟练掌握这些算法,你能更好地解决问题,提升代码质量和效率。同时,了解这些算法的底层原理也有助于你在面试等场合更好地展现自己的能力。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/734128.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Unity造轮子】2D横版平台跳跃游戏实现多段跳完美手感(含源码)

文章目录 前言先看效果&#xff0c;手感很丝滑原理开始1. 看到检测点的检测范围2. 二段跳实现3. 动画控制器配置 源码扩展完结 前言 随着游戏技术的不断发展&#xff0c;2D横版平台跳跃游戏成为许多玩家的最爱。这类游戏以其简单而有趣的玩法和精致的视觉效果吸引着无数游戏爱…

Kotlin~Decorator装饰器模式

概念 装饰模式指的是在不必改变原类文件和使用继承的情况下&#xff0c;动态地扩展一个对象的功能。它是通过创建一个包装对象&#xff0c;也就是装饰来包裹真实的对象。可以运行时动态添加新的功能&#xff0c;而无需改变原来的代码。 特点&#xff1a; 灵活扩展新的功能动态…

接口设计的总结

目录 前言 设计好接口的 36 个锦囊 总结 前言 作为后端开发&#xff0c;不管是什么语言&#xff0c;Java、Go 还是 C&#xff0c;其背后的后端思想都是类似的。我们做后端开发工程师&#xff0c;主要工作就是&#xff1a;如何把一个接口设计好。所以&#xff0c;今天就给大家…

北京大学考研机试题:二叉树

【题目来源】https://www.acwing.com/problem/content/description/3474/【题目描述】 如上图所示&#xff0c;由正整数 1&#xff0c;2&#xff0c;3…… 组成了一颗特殊二叉树。 我们已知这个二叉树的最后一个结点是 n。 现在的问题是&#xff0c;结点 m 所在的子树中一共包括…

MobileNeRF在Windows上的配置

MobileNeRF于2023年提出&#xff0c;源码地址&#xff1a;https://github.com/google-research/jax3d/tree/main/jax3d/projects/mobilenerf &#xff0c;论文为&#xff1a;《MobileNeRF: Exploiting the Polygon Rasterization Pipeline for Efficient Neural Field Renderin…

QT自定义工具条渐变背景颜色一例

使用样式定义&#xff1a; QWidget* toolbar new QWidget(this);toolbar->setObjectName("main_tool");toolbar->setStyleSheet("#main_tool{background: qlineargradient(x1:0 , y1:0 , x2:1 , y2:0,""stop:0 rgba(0,255,0, 0.2),"&q…

Nuxt3 components公共组件

1.目录结构 效果实现&#xff1a;写一个公共的right组件&#xff0c;在index和about页面同时引用它 2.index页面引入 index页面显示效果 about页面引用及效果

组件的自定义事件

src/components/School.vue <template><div class"school"><h2>学校名称&#xff1a;{{ name}}</h2><h2>学校地址&#xff1a;{{ address }}</h2><button click"sendSchoolName">把学校名给App</button>…

数据集成的强大联盟:Elasticsearch、Kibana、Logstash、MySQL

通常&#xff0c;很多关系数据项目都使用 MySQL。 它对于标准的 CRUD 操作是有益的&#xff0c;但有时我们需要做额外的过程。 当我们搜索某些内容时&#xff0c;我们会消耗资源或合并多个表。 有时&#xff0c;即使不是&#xff0c;可能仍然需要复杂的 SQL 查询。 也许这不是正…

如何查看OpenAI的AccessToken?

如何查看OpenAI的AccessToken&#xff1f; 记录一下如何查看 OpenAI的 AccessToken 文章目录 如何查看OpenAI的AccessToken&#xff1f;前提具体操作总结 前提 &#x1f4a7;首先&#xff0c;在获取AccessToken前&#xff0c;你需要达成 以下两个条件: 拥有一个可用的OpenA…

ARM CORETEX M0简介

ARM CORETEX M0简介 1. M0处理器简单框图 处理器内核&#xff1a;逻辑控制与运算 内部总线系统&#xff1a;单总线将处理器与外部的存储器和外部连接&#xff0c;进行数据交互&#xff08;冯诺依曼架构&#xff0c;数据与指令一起&#xff09; NVIC&#xff1a;嵌套向量中断控…

【Matlab】智能优化算法_亨利气体溶解度优化算法HGSO

【Matlab】智能优化算法_亨利气体溶解度优化算法HGSO 1.背景介绍2.数学模型2.1 亨利定律2.2 HGSO 3.文件结构4.伪代码5.详细代码及注释5.1 Create_Groups.m5.2 Evaluate.m5.3 fun_checkpoisions.m5.4 fun_getDefaultOptions.m5.5 HGSO.m5.6 main.m5.7 sumsqu.m5.8 update_posit…

机器学习总览

机器学习 1.什么是机器学习&#xff1f; 机器学习是使计算机像人类一样学习与行动的科学&#xff0c;并通过观察与现实世界交互的形式向计算机提供数据和信息&#xff0c;从而随着时间的推移以自主的方式改善其学习。 通过经验提高某些任务性能的计算机程序。 人工智能>机器…

FreeRTOS ~(六)信号量 ~ (1/3)信号量解决同步缺陷

前情提要 FreeRTOS ~&#xff08;四&#xff09;同步互斥与通信 ~ &#xff08;1/3&#xff09;同步的缺陷 FreeRTOS ~&#xff08;五&#xff09;队列的常规使用 ~ &#xff08;1/5&#xff09;队列解决同步缺陷 举例子说明&#xff1a;利用信号量解决前述的"同步的缺陷&…

最具价值开源项目收藏--持续更新

轻量级开源笔记应用&#xff08;memos&#xff09; 该项目基于 Go React.js SQLite 技术栈开发&#xff0c;兼具高性能与可定制性&#xff0c;适用于日常生活办公中的各类笔记管理场景。 开源地址&#xff1a;https://github.com/usememos/memos 跨平台无缝传输文件&#…

揭秘python函数:编程艺术的核心力量(3)

文章目录 前言递归lambda表达式lambda 的参数形式无参数位置参数关键字参数缺省参数可变参数1.包裹位置传递2.包裹关键字传递 带判断条件的lambda表达式列表数据按照字典key的值进行排序 高阶函数的使用内置高阶函数1.map()2.reduce()3.filter() 前言 前面我们已经学习了 pyth…

7-测试模型(2个)

目录 1.软件测试V模型 2.软件测试W模型&#xff08;双V模型&#xff09; 1.软件测试V模型 V模型最早是由Paul Rook在2&#xff10;世纪&#xff18;&#xff10;年代后期提出的&#xff0c;目的是改进软件开发的效率和效果。是瀑布模型的变种。 明确地标注了测试过程中存在的…

前端工程打包部署

打包 直接执行第二个脚本build即可 打包后的文件将会放在dist目录下 部署 NGINX&#xff1a;是一款轻量级的Web服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器。其特点是占用内存少&#xff0c;并发能力强&#xff0c;在各大型互联网公司都有非…

R中高效安装包,以ComplexHeatmap包为例

包安装问题解决方案 1. Biocmanager安装 [2. 手动安装]&#xff08;正在更新……&#xff09; 目录 包安装问题解决方案前言1. install.packages()的介绍1.1 install.packages()的工作原理1.2 install.packages()安装失败的原因1.3 解决方案 2. BiocManage安装ComplexHeatmap总…

kubernetes的概念以及部署

简介&#xff1a; kubernetes&#xff0c;是一个全新的基于容器技术的分布式架构领先方案&#xff0c;是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本&#xff0c;于2014年9月发布第一个版本&#xff0c;2015年7月发布第一个正式版本。 kubernetes的本质是…