前端js写数据结构与算法

news2024/11/19 21:22:17

1、什么是数据结构与算法

数据结构:是指数据对象中数据元素之间的相互关系。包括集合结构、线性结构、树形结构、图形结构。

算法:解决问题的思路。

2、时间复杂度

1.是什么?

执行当前算法所“花费的时间”

2.干什么?

在写代码的过程中,就可以大概知道代码运行的快与慢

3,表示

大0表示法《解析数论》

0表示有很多,例举几个:0(1)、0(n)、0(n^2)、o( logn).. .

列如:

0(1):一般的代码运行一次

0(n):一个for循环

0(n^2):两个for循环

o( logn):while语句

总结:时间复杂度越低运行越快

//0(1)
let a = 1;
//0(n)
let n = 100;
let arr = [];
for (let i = 0; i < n; i++) {
  arr.push(1);
}

3、空间复杂度

1.是什么?

执行当前算法需要占用多少内存空间

2.表示法

0(1)、0(n)、0(n^2)...

和时间复杂度的理解一样

//0(1)
let a = 1;
//0(n)
let n = 100;
let arr = [];
for (let i = 0; i < n; i++) {
  arr.push(1);
}

4、栈-后进先出

5、算法题(栈)——有效的括号(字节考)

解题:

6、算法题(栈)——删除字符串中的所有相邻重复项

解题:

7、算法题(栈)——路径简化

解题:

8、队-先进先出

为什么 JavaScript 是单线程?

(1)JavaScript 语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么为什么 JavaScript 不能有多个线程呢 ?这样能提高效率啊。

(2)JavaScript 的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript 的主要用途是与用户互动,以及操作 DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定 JavaScript 同时有两个线程,一个线程在某个 DOM 节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?

(3)所以,为了避免复杂性,从一诞生,JavaScript 就是单线程,这已经成了这门语言的核心特征,将来也不会改变

JS执行流程

1、主线程读取JS代码,此时同步环境,形容对应的堆和执行栈。

2、主线程遇到异步任务,会推给异步线程进行处理

3.异步进行处理完毕,将对应的异步任务推入任务队列

4,主线程查询任务队列,执行微任务,将其按照顺序执行,全部执行完毕。

5,主线程查询任务队列,执行宏任务,取得第一个宏任务,执行完毕。

6,重复以上4,5步骤

9、算法题(队)最近的请求次数

解题:

10、链表的简介

1.什么是链表

多个元素存储的列表1

2.链表中的元素在内存中不是顺序存储的,而是通过”next"指针联系在一起的。

链表结构***js中的原型链 原理就是 链表结构

二、链表和数组的区别

1.数组:有序存储的,在中间某个位置删除或者添加某个元素其他元素要跟着动。

2.链表中的元素在内存中不是顺序存储的,而是通过"next"指针联系在一起的。

链表

三、链表的种类

单向链表

双向链表

11、instanceof原理(判断数据类型)

通过原型链匹配数据类型

12算法题(链)—环形链表(小米考)

、、

解题:

13算法题(链)—删除链表中的节点

解题:

14算法题(链)—删除排序链表种的重复元素

解题:

15算法题(链)—反转链表

解题:

16、字典和哈希表简介

字典:键值对存储的,类似于is的对象 (键[key]字典:都是字符串类型或者会转换成字符串类型)

字典 ==》map来表示的,map的键不会转换类型

js中没有哈希表,哈希表是字典一种实现

区别一:如果找key对应的value需要遍历key,那么想要省去遍历的过程,用哈希表来表示。

区别二: 排列顺序

字典是根据添加的顺序进行排列的哈希表不是添加的顺序进行排列的

哈希表例子:

17算法题(哈希表)—两数之和

解题:

18算法题(哈希表)—存在重复元素

解题:

方式一:

方式二:

19算法题(哈希表)—两个数组的交集

解题:

20算法题(哈希表)—独一无二的出现次数

解题:

21算法题(哈希表)— 无重复字符的最长子串

解题:

22、树

一种分层数据的抽象模型,

简单来说: 分层级关系的

23、深度优先遍历

主要思路是从图中一个未访问的顶点 V 开始,沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点,再从另一条路开始走到底...,不断递归重复此过程,直到所有的顶点都遍历完成,它的特点是不撞南墙不回头,先走完一条路,再换一条路继续走。

技巧:

1,访问根节点

2.对根节点的children挨个进行深度优先搜索

24、广度优先遍历

广度优先遍历,指的是从图的一个未遍历的节点出发,先遍历这个节点的相邻节点,再依次遍历每个相邻节点的相邻节点。

技巧:

  1. 新建一个队列,把根节点入队
  2. 把队头出队

3、把队头的children挨个入队

4、重复2和3步,直到队列为空为止

25、二叉树

二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。

26算法题(二叉树)——二叉树的前序遍历

前序遍历就是先遍历根节点,然后遍历左节点,最后是右节点;

解题:

方法一:递归思想,数据量少效率高

方法二:栈方法,数据量多的时候效率高

27算法题(二叉树)——二叉树的中序遍历

中序遍历就是先遍历左节点,然后遍历中间的根节点,最后是右节点;

方法一:

方法二:栈方法,数据量多的时候效率高

28算法题(二叉树)——二叉树的后序遍历

后序遍历就是先遍历左节点,然后遍历是右节点,最后是中间的根节点

解题:

方法一:递归思想,数据量少效率高

方法二:栈方法,数据量多的时候效率高

29算法题(二叉树)——二叉树的最小深度

解题:

30算法题(二叉树)——二叉树的最大深度

解题:

31算法题(二叉树)——翻转二叉树

解题:

32算法题(二叉树)——相同的树

解题:

33、堆

1、堆是什么?

堆都能用树来表示,并且一般树的实现都是利用链表

而二叉堆是一种特殊的堆,它用完全二叉树表示,却可以利用数组实现

平时使用最多的是二又堆,它可以用完全二叉树表示,二叉堆易于存储,并且便于索

***堆数据结构像树,但是,是通过数组来实现的 (不是通过链表:二又堆)

2、在堆的实现时,需要注意:

因为是数组,所以父子节点的关系就不需要特殊的结构去维护了,索引之间通过计算就可以得到,省掉了很多麻烦。如果是链表结构,就会复杂很多;

完全二叉树要求叶子节点从左往右填满,才能开始填充下一层,这就保证了不需要对数组整体进行大片的移动。这也是随机存储结构(数组)的短板:删除一个元素之后整体往前移是比较费时的。这个特性也导致堆在删除元素的时候,要把最后一个叶子节点补充到树根节点的缘由

二又堆想树的样子我可以理解,但将它们安排在数组里的话,通过当前下标怎么就能找到父节点和子节点呢?

34算法题(堆)——数组中的第K个最大的元素

解题:(百度。。。)

35、排序算法

工具:通过动画可视化数据结构和算法<br> - VisuAlgo

36、冒泡排序

1. 算法步骤

比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

37、选择排序

首先在未排序序列中找到最小(大) 元素,存放到排序序列的起始位置。

再从剩余未排序元素中继续寻找最小(大)元素,

然后放到已排序序列的末尾。

重复第二步,直到所有元素均排序完毕

38、插入排序

插入排序和冒泡排序一样,也有一种优化算法,叫做拆半插入。

将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。

从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。

39、快速排序

1. 在数组中选一个基准数(通常为数组第一个或者中间值);

2. 将数组中小于基准数的数据移到基准数左边,大于基准数的移到右边;

3. 对于基准数左、右两边的数组,不断重复以上两个过程,直到每个子集只有一个元素,即为全部有序。

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

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

相关文章

C# .NET SQL sugar中 IsAny进行根据条件判断数据是否存在 IsAny的使用

SQL sugar 中控制器直接判断数据是否存在 首先确保你的Service层继承的表名 控制器中使用IsAny进行根据条件判断数据是否存在

算法通关村第十五关—继续研究超大规模数据场景的问题(黄金)

继续研究超大规模数据场景的问题 一、对20GB文件进行排序 题目要求&#xff1a;假设你有一个20GB的文件&#xff0c;每行一个字符串&#xff0c;请说明如何对这个文件进行排序&#xff1f;  分析&#xff1a;这里给出大小是20GB,其实面试官就在暗示你不要将所有的文件都装入到…

墙地砖外形检测的技术方案-图像获取

硬件系统 墙地砖外形检测硬件系统主要由工业相机、光源、瓷砖位置检测电路和上位机组成&#xff0c;其结构如图所示。为了提高系统检测精度和稳定性&#xff0c;系统采用的是较高精度的高速工业相机用于抓取墙地砖表面轮廓图像&#xff0c;图像数据通过USB接口向上位机传送&am…

Maven《一》-- 一文带你快速了解Maven

目录 &#x1f436;1.1 为什么使用Maven 1. Mavan是一个依赖管理工具 ①jar包的规模 ②jar包的来源问题 ③jar包的导入问题 ④jar包之间的依赖 2. Mavan是一个构建工具 ①你没有注意过的构建 ②脱离IDE环境仍需构建 3. 结论 &#x1f436;1.2 什么是Maven &#x…

系列四、Spring Security中的认证 授权(前后端不分离)

一、Spring Security中的认证 & 授权&#xff08;前后端不分离&#xff09; 1.1、MyWebSecurityConfigurerAdapter /*** Author : 一叶浮萍归大海* Date: 2024/1/11 21:50* Description:*/ Configuration public class MyWebSecurityConfigurerAdapter extends WebSecuri…

ZZULIOJ 1110: 最近共同祖先(函数专题)

题目描述 如上图所示&#xff0c;由正整数1, 2, 3, ...组成了一棵无限大的二叉树。从某一个结点到根结 点&#xff08;编号是1 的结点&#xff09;都有一条唯一的路径&#xff0c;比如从10 到根结点的路径是(10, 5, 2, 1)&#xff0c; 从4 到根结点的路径是(4, 2, 1)&#xff0…

x-cmd pkg | qrencode - 二维码生成工具

目录 简介首次用户功能特点竞品和相关作品进一步阅读 简介 qrencode 是一个用于生成二维码的命令行工具。它可以将文本、URL、电话号码等信息转换为二维码图像。生成的二维码图像可以保存为图片文件&#xff0c;方便在电子文档、网页、移动应用等各种场景中使用。 它支持的二维…

python爬虫小练习——爬取豆瓣电影top250

爬取豆瓣电影top250 需求分析 将爬取的数据导入到表格中&#xff0c;方便人为查看。 实现方法 三大功能 1&#xff0c;下载所有网页内容。 2&#xff0c;处理网页中的内容提取自己想要的数据 3&#xff0c;导入到表格中 分析网站结构需要提取的内容 代码 import requests…

Random的使用

作用&#xff1a;生成伪随机数 1.导包&#xff1a;import java.util.Random 2.得到随机数对象&#xff1a;Random r new Random(); 3.调用随机数的功能获取随机数&#xff1a; 这里随机生成一个0-9的整数&#xff1a; int number r.nextInt(10); 实现指定区间的随机数&a…

C语言中关于指针的理解及用法

关于指针意思的参考&#xff1a;https://baike.baidu.com/item/%e6%8c%87%e9%92%88/2878304 指针 指针变量 地址 野指针 野指针就是指针指向的位置是不可知的&#xff08;随机的&#xff0c;不正确的&#xff0c;没有明确限制的&#xff09; 以下是导致野指针的原因 1.指针…

利益兑现期越短,积极性越高

在2023年一次部门项目提成时间节点的调整&#xff0c;引发了相关的销售部门 &#xff0c;项目集成部门&#xff0c;软件开发部门截然不同的工作积极性。 公司案例 公司做项目的时候&#xff0c;采用的是相关部门都可以在项目获取提成 &#xff0c;之前的提成方式为销售部门为…

maven镜像源设置aliyun提升下载速度

一、打开pom.xml project下在添加 <repositories><repository><id>aliyunmaven</id><name>aliyun</name><url>https://maven.aliyun.com/repository/public</url></repository><repository><id>central2&l…

【Arduino】编程语言:定时函数、数学函数、字符函数(功能、语法格式、参数说明、返回值) | 软件开发环境:安装步骤介绍(EXE安装版、ZIP安装版)

你的负担将变成礼物,你受的苦将照亮你的路。———泰戈尔 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌟[3] 2022年度博客之星人工智能领域TOP4🌟 🏅[4] 阿里云社区…

prometheus常用exporter

一、node-exporter node_exporter&#xff1a;用于监控Linux系统的指标采集器。 未在k8s集群内的linux机器监控 GitHub - prometheus/node_exporter: Exporter for machine metrics 常用指标&#xff1a; •CPU • 内存 • 硬盘 • 网络流量 • 文件描述符 • 系统负载 •…

电子电器架构车载软件 —— 集中化架构软件开发

电子电器架构车载软件 —— 集中化架构软件开发 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任…

vulnhub靶场之DC-8

一.环境搭建 1.靶场描述 DC-8 is another purposely built vulnerable lab with the intent of gaining experience in the world of penetration testing. This challenge is a bit of a hybrid between being an actual challenge, and being a "proof of concept&quo…

机器学习入门知识

一、引言 机器学习是当前信息技术中最令人振奋的领域之一。在这门课程中&#xff0c;我们将探索该技术的前沿&#xff0c;并能够亲自实现机器学习的算法。 或许你每天都在不知不觉中使用了机器学习的算法。每次你打开谷歌或必应搜索你需要的内容&#xff0c;正是因为它们拥有出…

如何使用vite框架封装一个js库,并发布npm包

目录 前言介绍 一、创建一个vite项目 1、使用创建命令&#xff1a; 2、选择others 3、 模板选择library 4、选择开发语言 ​编辑 二、安装依赖 三、目录介绍 1、vite.config.ts打包文件 2、package.json命令配置文件 三、发布npm 1、注册npm账号 2、设置npm源 3、登…

深信服超融合HCI版本升级,6.0.0R5升级至6.8.0R2

超融合升级&#xff0c;需要满足以下条件及前期准备&#xff1a; 确认HCI的升级序列号有效升级时长大概在一个半小时&#xff0c;安全起见&#xff0c;需预留至少三至四小时窗口期升级前&#xff0c;需要将所有虚拟机关机&#xff0c;涉及到业务无法访问&#xff0c;需提前通知…

车规MCU开发之E2E协议

啥是E2E&#xff1f; E2E的原理&#xff1a; 1. 发送端&#xff1a;发送数据包添加E2E保护头 2. 接收端&#xff1a;接收数据包校验E2E保护头 E2E例子 - profile 11为例 E2E_P11ConfigType wk_stP11Cfg { .CounterOffset 8, .CRCOffset 0, .DataID …