前端算法

4大算法:

  1. 贪心算法:局部最优解
  2. 分治算法:将一个问题分成多个小模块
  3. 动态规划:每一个状态都是过去历史的总结
  4. 回溯算法:不是最优选择的时候退回重新选

一、排序算法

1. 冒泡排序:数字越大越往上

第一次循环 比较当前元素与下一个元素,如果比下一个元素大 就换位置,反之不动

function bubbleSort(arr) {let length = arr.length;// 外层循环用控制 排序进行多少轮for (let i = 0; i < length; i++) {// 内层循环用于每一轮的数据比较// 注意j的长度范围 length - i - 1for (let j = 0; j < length - i - 1; j++) {// 相邻元素,大的放到后面if (arr[j] > arr[j + 1]) {// 交换位置[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];}}}return arr;
}

2. 选择排序

遍历自身以后的元素,选择最小的元素跟自己换位置

chooseSort(arr){let len = arr.length;for(let i=0;i<len-1;i++){for(let j=i+1;j<len;j++){if(arr[i]>arr[j]){[arr[i], arr[j]] = [ arr[j], arr[i]]}}} return arr}

3. 插入排序

把将要排序的元素插入到已经排好的元素中去

 insertSort(arr){for(let i=1;i<arr.length;i++){//外循环从1开始,默认arr[0]已经排序for(let j=i;j>0;j--){//j = i,将arr[j]依次插入有序段中if(arr[j]<arr[j-1]){[arr[j],arr[j-1]] = [arr[j-1],arr[j]]}}}console.log(arr);return arr}

4. 快速排序

通过一趟排序 将数组分成两个部分,其中一边的值比另一边的小,递归调用函数,遍历这两部分进行排序,最后按顺序合并数组

function quickSort(arr){if(arr.length<=1){return arr;}let left=[],right=[];let current=arr.splice(0,1);for(let i=0;i<arr.length;i++){if(arr[i]<current){left.push(arr[i]);}else{right.push(arr[i]);}}return quickSort(left).concat(current,quickSort(right))
}
let arr1=[5,7,1,6,2,3,9,4,8];
quickSort(arr1);//[1,2,3,4,5,6,7,8,9]

5. 归并排序

采用分治法:

  1. 将所有数组项无限细分,得到1个个独立的单元,也就是不断分解。
  2. 将相近的两两进行比较,按照已排序数组合并,形成(n/2)个序列,每个序列包含2个数字。
  3. 将上述两个序列递归合并,按照已排序数组合并,形成(n/4)个序列,每个序列包含4个数字。
  4. 重复步骤2,直到所有元素合并排序完毕。
function MergeSort(array) {let len = array.length;// 当每个子序列中仅有1个元素时返回if (len <= 1) {return array;}// 将给定的列表分为两半let num = Math.floor(len / 2);let left = MergeSort(array.slice(0, num));let right = MergeSort(array.slice(num, array.length));return merge(left, right);function merge(left, right) {let [l, r] = [0, 0];let result = [];// 从 left 和 right 区域中各个取出第一个元素,比较它们的大小while (l < left.length && r < right.length) {// 将较小的元素添加到result中,然后从较小元素所在的区域内取出下一个元素,继续进行比较;if (left[l] < right[r]) {result.push(left[l]);l++;} else {result.push(right[r]);r++;}}// 如果 left 或者 right 有一方为空,则直接将另一方的所有元素依次添加到result中result = result.concat(left.slice(l, left.length));result = result.concat(right.slice(r, right.length));return result;}
}

二、列表转成树

输入一组列表如下,转化成树形结构

// 输入
[{ id: 1, title: "chil1", parentId: 0 },{ id: 2, title: "chil2", parentId: 0 },{ id: 3, title: "chil1-1", parentId: 1 },{ id: 4, title: "chil1-2", parentId: 1 },{ id: 5, title: "chil2-1", parentId: 2 },
]
// 输出
tree = [{"id": 1,"title": "chil1","parentId": 0,{"id": 3,"title": "chil1-1","parentId": 1,},{"id": 4,"title": "chil1-2","parentId": 1,},},{"id": 2,"title": "chil2","parentId": 0,{"id": 5,"title": "chil1-1","parentId": 2,},},
]
listToTree(arr){// 使用对选哪个重新存储数据let map = {}// 最终结果let treeData = []// 遍历元原始数据 存到map中,值为数据for(let i=0;i<arr.length;i++){map[data[i].id] = data[i]}// 遍历对象for(let i in map){// 根据parentId找到父节点if(map[i].parentId){if(!map[map[i].parentId].children){map[map[i].parentId].children = []} else {// 将子节点放到父节点的children中map[map[i].parentId].children.push(map[i])}} else {// 没有父节点 说明是根节点 直接插到跟数组中treeData.push(map[i])}}}

三、深度优先遍历

对树进行遍历,然后对他的第一个子节点进行遍历,直到所有的子节点都遍历完毕,然后遍历它所有的兄弟节点


四、广度优先遍历

对树进行遍历,然后对他的第一个子节点进行遍历,遍历他的所有兄弟节点,再遍历第一个节点的子节点 一层层往下遍历


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

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

相关文章

IDEA 全局查找 ctrl + shift + F 快捷键失效

全局查找&#xff1a;ctrl shift F 需要关闭微软输入法简体/繁体切换&#xff0c;不然被占用了无效 (装了搜狗输入法的同理,找一下是不是这个快捷键冲突了 ) 另外还有 IDEA 中 重构变量名 &#xff1a;shift F6 需要关闭微软输入法最新版本 ( 使用以前版本的微软输入法就没…

CSS渐变色理论与分类、文字渐变色方案、炸裂渐变色方案以及主流专业渐变色工具网站推荐

渐变色彩可以增加视觉层次感和动态效果&#xff0c;使网页界面更加生动有趣&#xff0c;吸引用户注意力。另外&#xff0c;相较于静态背景图片&#xff0c;CSS渐变无需额外的HTTP请求&#xff0c;减轻服务器负载&#xff0c;加快页面加载速度&#xff1b;同时CSS渐变能够根据容…

windows下git提交修改文件名大小写提交无效问题

windows系统不区分大小写&#xff0c;以及git提交忽略大小写&#xff0c;git仓库已存在文件A.js&#xff0c;本地修改a.js一般是没有提交记录的&#xff0c;需要手动copy一份出来A.js&#xff0c;再删除A.js文件提交仓库删除后&#xff0c;再提交修改后的a.js文件。 windows决…

C/C++程序设计实验报告4 | 函数实验

本文整理自博主本科大一《C/C程序设计》专业课的课内实验报告&#xff0c;适合C语言初学者们学习、练习。 编译器&#xff1a;gcc 10.3.0 ---- 注&#xff1a; 1.虽然课程名为C程序设计&#xff0c;但实际上当时校内该课的内容大部分其实都是C语言&#xff0c;C的元素最多可能只…

SV-7041T IP网络有源音箱 教室广播多媒体音箱(带本地扩音功能)教学广播音箱 办公室背景音乐广播音箱 2.0声道壁挂式网络有源音箱

SV-7041T IP网络有源音箱 教室广播多媒体音箱&#xff08;带本地扩音功能&#xff09; 教学广播音箱 办公室背景音乐广播音箱 一、描述 SV-7041T是深圳锐科达电子有限公司的一款2.0声道壁挂式网络有源音箱&#xff0c;具有10/100M以太网接口&#xff0c;可将网络音源通过自带…

tailwindcss在使用cdn引入静态html的时候,vscode默认不会提示问题

1.首先确保vscode下载tailwind插件&#xff1a;Tailwind CSS IntelliSense 2.需要在根目录文件夹创建一个tailwind.config.js文件 export default {theme: {extend: {// 可根据需要自行配置&#xff0c;空配置项可以正常使用},}, }3.在html文件的标签中引入配置文件&#xf…

【JavaScript】axios

基础使用 <script src"https://cdn.bootcdn.net/ajax/libs/axios/1.5.0/axios.min.js"></script> <script>axios.get(https://study.duyiedu.com/api/herolist).then(res> {console.log(res.data)}) </script>get - params <script s…

数据仓库与数据挖掘(实验一2024.4.24)

实验准备&#xff1a; 1.下载conda 2.配置环境C:\ProgramData\miniconda3\Scripts 3.创建文件夹panda进入虚拟环境qq 激活虚拟环境&#xff1a;activate qq 启动jupyter lab&#xff08;python语言环境编译&#xff09;&#xff1a;jupyter lab 4.panda下载 &#xff08;…

HTB Runner

Runner User Nmap ──(root㉿kali)-[/home/…/machine/SeasonV/linux/Runner] └─# nmap -A runner.htb -T 4 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-22 23:07 EDT Stats: 0:00:01 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Sca…

用户中心 -- 代码理解

一、删除表 & if 删除表 1.1 DROP TABLE IF EXISTS user 和 DROP TABLE user 网址&#xff1a; 用户管理第2节课 -- idea 2023.2 创建表--【本人】-CSDN博客 二、 代码 2.1 清空表中数据 的 命令 【truncate 清空】 网址&#xff1a; 用户管理第2节课 -- idea 2…

iOS开发进阶(二十):Xcode 断点调试详解

文章目录 一、前言二、断点调试技巧2.1 设置断点2.2 断点的自定义设置2.3 断点类型 一、前言 所谓断点&#xff0c;其实就是一个让应用暂停运行的机制&#xff0c;这是为了方便开发人员执行调试&#xff0c;查看寄存器的某些值。既然设置了断点&#xff0c;可以让应用停在某一…

Ajax和axios基础

AJAX Asynchronous JavaScript And XML 异步的JavaScript和XML 作用 数据交换: 通过Ajax可以给服务器发送请求,服务器将数据直接响应回给浏览器. 异步交互: 可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术. 同步和异步 同步发送请求: 浏览器发…

Linux中Ctrl+C和Ctrl+Z的区别_实战讲解(超详细)

1、CtrlC和CtrlZ的区别&#xff1a; CtrlZ&#xff1a;暂停进程 即挂起进程 暂停当前进程并将其放到后台。可以在后续恢复执行。 暂停的进程仍然占用系统内存 CtrlC&#xff1a;终止进程 终止进程后&#xff0c;程序代码占用的内存会释放掉 2、实战讲解 跑人工智能代码的时候…

redis故障中出现的缓存击穿、缓存穿透、缓存雪崩?

一、背景&#xff1a; 在维护redis服务过程中&#xff0c;经常遇见一些redis的名词&#xff0c;例如缓存击穿、缓存穿透、缓存雪崩等&#xff0c;但是不是很理解这些&#xff0c;如下就来解析一下缓存击穿、缓存穿透、缓存雪崩名词。 二、缓存穿透问题&#xff1a; 常见的缓存使…

flutter ios Firebase 消息通知错误 I-COR000005,I-FCM001000 解决

*前提是已经 使用firebase-tools 已经给 Flutter 加入了 消息通知相关配置。教程>> 一、I-COR000005 10.22.0 - [FirebaseCore][I-COR000005] No app has been configured yet. import Firebase....FirebaseApp.configure() 10.22.0 - [FirebaseMessaging][I-FCM001000…

mysql事故复盘: 单行字节最大阈值65535字节(原创)

背景 记得还在银行做开发&#xff0c;投产上线时&#xff0c;项目发版前&#xff0c;要提DDL的sql工单&#xff0c;mysql加1个字段&#xff0c;因为这张表为下游数据入湖入仓用的&#xff0c;长度较大。在测试库加字段没问题&#xff0c;但生产库字段加不上。 先说结论 投产…

QT初识

通过图形化界面输出helloworld 既然学习了QT&#xff0c;那么自然要做经典的输出helloworld字符串的实验。 QT有两好几种方案输出helloworld&#xff0c;一种是通过图形化界面输出&#xff0c;一种是通过代码实现。 这里先了解图形化界面的方案。 创建项目后&#xff0c;点…

LeetCode:2385. 感染二叉树需要的总时间(DFS Java)

目录 2385. 感染二叉树需要的总时间 题目描述&#xff1a; 实现代码与解析&#xff1a; DFS 原理思路&#xff1a; 2385. 感染二叉树需要的总时间 题目描述&#xff1a; 给你一棵二叉树的根节点 root &#xff0c;二叉树中节点的值 互不相同 。另给你一个整数 start 。在第…

【论文阅读】互连网络的负载平衡路由算法 (RLB RLBth)

前言Oblivious Load Balancing 不经意路由负载平衡 1. oblivious routing 不经意/无关路由的背景知识 1. oblivious routing, adaptive routing & minimal/non-minimal routing algorithms 2. Balancing a 1-Dimensional ring: RLB and RLBth 一维 ring 的 RLB and RLBth 1…

如何设计一个安全的系统架构?

本文转自 公众号 ByteByteGo&#xff0c;如有侵权&#xff0c;请联系&#xff0c;立即删除 如何设计一个安全的系统架构&#xff1f; 如何设计安全的系统&#xff1f;我们总结了 12 条原则供架构师们参考。 设计安全的系统非常重要&#xff0c;原因有很多&#xff0c;从保护敏…