JS实现数据结构与算法

队列

1、普通队列

利用数组push和shif 就可以简单实现

 2、利用链表的方式实现队列 

class MyQueue {
	constructor(){
		this.head = null
		this.tail = null
		this.length = 0
	}

	add(value){
		let node = {value}
		if(this.length === 0){
			this.head = node
			this.tail = node
		}else{
			this.tail.next = node
			this.tail = node
		}
		this.length++
	}

	delete(){
		if(this.length <= 0) {return null}
		let value = null

		if(this.length === 1){
			value = this.head.value
			this.head = null
		}else{
			value = this.head.value
			this.head = this.head.next
		}
		return value
		this.length--
	}
}

// 功能测试
const queue = new MyQueue()
queue.add(100)
console.log('length1', queue.length) // 1
queue.add(200)
console.log('length2', queue.length) // 2
console.log('delete1', queue.delete()) // 100
queue.add(300)
console.log('length3', queue.length) // 2
console.log('delete2', queue.delete()) // 200
console.log('length4', queue.length) // 1
console.log('delete3', queue.delete()) // 300
console.log('length5', queue.length) // 0

 

 栈 

1、普通栈

2、用Js链表实现入栈和出栈 

class MyNode{
	//这个类似于一个替换值t
	constructor(val){
		this.value = val
		this.next = null
	}
}
class MyStack{
	constructor(){
		this.stack = null
	}
	add(val){
		const node = new MyNode(val)
		//首先将入栈的值给t.value里:{value:100,next:null}
		node.next = this.stack
		//其次将上一个入栈的值赋值给t.next
		//形成新入的值在最外层,{value:200,next:{value:100,next:null}}
		this.stack = node
		//最后将t的整体包裹了新入栈的数据的对象赋值给当前的内容
		console.log('this.next',this.stack);
	}
	delete(){
		const t = this.stack
		//当前栈已空,直接返回,t是 MyStack.stack
		if(t === null){
			return '当前栈已空'
		}else{
			//将内层的next的赋值给原本的值,实现出栈
			this.stack = t.next
			return t.value
		}
	}
}
const stack = new MyStack()
stack.add(100)
stack.add(200)
console.log('delete',stack.delete());
console.log('delete',stack.delete());
console.log('delete',stack.delete());

3、用栈来翻转字符串,只能用push和pop两个API 

function onStack(val){
	let arr1 = []
	//入栈
	for(let i of val){
		arr1.push(i)
	}

	let arr2 = ''
	let popValue = null
	//出栈
	while(arr1.length){
		popValue = arr1.pop()
		arr2 += popValue
	}

	return arr2
}
console.log(onStack('12345'));

排序 

1、冒泡排序

2、选择排序 

3、快速排序

注意:快速排序的规则就是先找中间的数,比中间大的放在左边,小的放在右边,再去对两边的数进行同样的操作。

注意:循环一次是O(n),双层循环是O(n^2),二分查找O(logn),快速排序是O(n*logn)

function quickSort(arr) {
			if(arr.length <= 0){
				return arr
			}
			let midIndex = Math.floor(arr.length/2) 
			let midValue = arr[midIndex]

			let left = []
			let right = []

			for(let i = 0; i < arr.length; i++){
				if(i !== midIndex){
					if(midValue > arr[i]){
						left.push(arr[i])
					}else{
						right.push(arr[i])
					}
				}
			}

			return [...quickSort(left),midValue,...quickSort(right)]
		}

		let arr = [12, 45, 78, 25, 12, 3, 45, 74, 1, 14, 85]
		console.log(quickSort(arr));

 

查找

1、二分查找

注意:二分查找首先是查找的内容是已排序

           时间复杂度是O(logn)

          需要找的数先去找数组中中间的值,去作对比,大于就往右边找,小于就往左边找。下一次继续这个操作。

          方法:递归或循环

          求中间元素的值mid,即:mid = left + (right - left) / 2 得到中间下标

function find(arr, x) {
	let left = 0
	let right = arr.length - 1
	let mid = 0

	while (left <= right) {
		mid = Math.floor(left + (right - left) / 2)
		if (arr[mid] === x) {
			return {
				type: true,
				position: mid
			}
		} else if (arr[mid] < x) {
			left = mid + 1
		} else {
			right = mid - 1
		}
	}

	return {
		type: false,
		position: null
	}
}

let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
let x = 3
console.log(find(arr, x));

 

1、树的优先遍历

 

 一、树的深度优先结果:ABCGDEFHL 

 

 

 注意:

  • 访问根节点;
  • 对根节点的children持续进行深度优先遍历(递归);
function dfs(root) {
	console.log(root.value)
	if(root.children){
		root.children.forEach(dfs)
	}
}
dfs(tree) // 这个tree就是前面定义的那个树

 

 二、广度优先遍历结果:ABECGDFHL

注意:广度优先遍历是,先遍历根节点,再同层从左到右遍历

 

注意:

  • 创建要给队列,把根节点入队;
  • 把队头出队并访问;
  • 把队头的children依次入队;
  • 重复执行2、3步,直到队列为空。
function deep(tree){
	let queue = []
	queue.push(tree)

	while(queue.length > 0){
		const node = queue.shift()
		console.log(node.value);
		if(node.children){
			node.children.forEach(val => {
				queue.push(val)
			})
		}
	}
	
}

 

2、二叉树

 一、用JS对象表达树

let tree = {
	value:'A',
	left:{
		value:'B',
		left:{
			value:'C',
			left:null,
			right:{
				value:'G',
				left:null,
				right:null
			}
		},
		right:{
			value:'D',
			left:null,
			right:null
		}
	},
	right:{
		value:'E',
		left:{
			value:'F',
			left:{
				value:'H',
				left:null,
				right:null
			},
			right:{
				value:'L',
				left:null,
				right:null
			}
		},
		right:null
	}
}

3、二叉树的前、中、后序遍历

 

 1、前序遍历:中、左、右 

 

2、中序遍历:左、中、右  

 

 3、后序遍历:左、中、右

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

强化学习中蒙特卡罗方法

一、蒙特卡洛方法 这里将介绍一个学习方法和发现最优策略的方法&#xff0c;用于估计价值函数。与前文不同&#xff0c;这里我们不假设完全了解环境。蒙特卡罗方法只需要经验——来自实际或模拟与环境的交互的样本序列的状态、动作和奖励。从实际经验中学习是引人注目的&#x…

第二十五节——Vuex--历史遗留

文档地址 Vuex 是什么&#xff1f; | Vuex version V4.x 一、概念 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 库。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。一个状态自管理应用包含以下几个部…

HuggingFace模型头的自定义

在线工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 在本文中我们将介绍如何使HuggingFace的模型适应你的任务&#xff0c;在Pytorch中建立自定义模型头并将其连接到HF模型的主体&#…

大数据Doris(二十一):数据导入演示

文章目录 数据导入演示 一、启动zookeeper集群(三台节点都启动) 二、启动hdfs集群

LLM代码生成器的挑战【GDELT早期观察】

越来越多的研究开始对LLM大模型生成的代码的质量提出质疑&#xff0c;尽管科技行业不断推出越来越多的旨在增强甚至取代人类编码员的工具。 随着我们&#xff08;GDELT&#xff09;继续探索和评估越来越多的此类工具&#xff0c;以下是我们的一些早期观察结果。 在线工具推荐&a…

CCF ChinaSoft 2023 论坛巡礼|机器人大模型与具身智能挑战赛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

银行卡转账记录p图软件,建设邮政工商招商农业,易语言回执单生成开发!

花了好长时间设计出来了这么一个软件&#xff0c;当然各个功能我都做了防范处理界面还有生成的图片都有对应的水印提示&#xff0c;做不了啥坏事&#xff0c;这里就是分享下原理和代码还有运行逻辑&#xff0c;仅此而已&#xff0c;软件加了一个画板&#xff0c;画面上面的图片…

Semantic Kernel 学习笔记1

1. 挂代理跑通openai API 2. 无需魔法跑通Azure API 下载Semantic Kernel的github代码包到本地&#xff0c;主要用于方便学习python->notebooks文件夹中的内容。 1. Openai API&#xff1a;根据上述文件夹中的.env.example示例创建.env文件&#xff0c;需要填写下方两个内…

计网:第一章 概述

目录 1.1计算机网络在信息时代作用 1.2因特网概述 1.3三种交换方式 1.4计算机网络的定义和分类 1.5计算机网络的性能指标 1.6计算机网络的体系结构 基于湖科大教书匠b站计算机网络教学视频以及本校课程老师ppt 整合出的计算机网络学习笔记 根据文章目录&#xff0c;具体内…

删除成绩(数组)

任务要求 设计程序&#xff0c;实现从多名学生某门课程的成绩查找到第一个不及格的成绩&#xff0c;删除其成绩&#xff0c;输出删除成绩后的多名学生这一门课程的成绩。任务保证至少存在1个学生的成绩为不及格。

Vuex:模块化Module :VOA模式

由于使用单一状态树&#xff0c;应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时&#xff0c;store 对象就有可能变得相当臃肿。 这句话的意思是&#xff0c;如果把所有的状态都放在/src/store/index.js中&#xff0c;当项目变得越来越大的时候&#xff0c;Vue…

推荐 8 款OCR工具(二)完结篇

双十一&#xff0c;又要剁手了&#xff0c;但我还是 推荐 8 款OCR工具&#xff01; 当你感到迷茫时&#xff0c;不妨停下来&#xff0c;深呼吸&#xff0c;重新审视自己所处的位置和你的内心。这样的简单行为可能会帮助你找到方向。 SimpleOCR 网址&#xff1a;https://simple…

web:[网鼎杯 2018]Fakebook

题目 点进页面&#xff0c;页面显示为 查看源代码 用dirsearch扫一下&#xff0c;看一下有什么敏感信息泄露 扫出另一个flag.php和robots.txt&#xff0c;访问flag.php回显内容为空 请求robots.txt 网页提示/user.php.bak&#xff0c;直接访问会自动下载.bak备份文件 进行代码…

过去5年,Python生态有什么变化?

你好&#xff0c;我是 EarlGrey&#xff0c;一名双语学习者&#xff0c;会一点编程&#xff0c;目前已翻译出版《Python 无师自通》、《Python 并行编程手册》等书籍。 点击上方蓝字关注我&#xff0c;持续接收优质好书、高效工具和赚钱机会&#xff0c;一起提升认知和思维。 过…

智慧水利整体解决方案:PPT全文43页,附下载

关键词&#xff1a;智慧水利发展前景&#xff0c;智慧水利解决方案&#xff0c;智慧水利建设方案&#xff0c;智慧水利平台系统 一、智慧水利建设背景 传统水利系统存在一些问题&#xff1a; 现有基础感知不能满足更高标准的水利管理需求&#xff1b;决策调度支撑能力亟需加强…

Benchmarking Large Language Models in Retrieval-Augmented Generation-学习翻译

提检索增强生成中大型语言模型的基准测试文献学习 作者将在https://github.com/chen700564/RGB上发布本文的代码和RGB。 y ˇ \check{y} yˇ​ 文章目录 摘要IntroductionRelated workRetrieval-Augmented Generation BenchmarkRAG所需能力数据构建评估指标 ExperimentsSetting…

PCBA表面污染的分类及处理方法

NO.1 引言 在PCBA生产过程中&#xff0c;锡膏和助焊剂会产生残留物质&#xff0c;残留物中包含的有机酸和电离子&#xff0c;前者易腐蚀PCBA&#xff0c;后者会造成焊盘间短路故障。且近年来&#xff0c;用户对产品的清洁度要求越来越严格&#xff0c;PCBA清洗工艺逐渐被电子组…

国际阿里云:无法访问ECS实例中的服务的排查方法!!!

操作场景 无法访问ECS实例中的服务可能有以下原因&#xff1a; 可能原因 排查方案 ECS实例的安全组未开放相应端口 检查ECS实例安全组规则 ECS实例中&#xff0c;该服务未启动/开启或服务对应端口未被监听 检查服务状态及端口监听状态 ECS实例内防火墙设置错误 检查ECS…

Linux下的调试工具——GDB

GDB 1.什么是GDB GDB 是由 GNU 软件系统社区提供的调试工具&#xff0c;同 GCC 配套组成了一套完整的开发环境&#xff0c;GDB 是 Linux 和许多 类Unix系统的标准开发环境。 一般来说&#xff0c;GDB 主要能够提供以下四个方面的帮助&#xff1a; 启动程序&#xff0c;可以按…

FRI的Commit、Query以及FRI Batching内部机制

1. 引言 前序博客见&#xff1a; Reed-Solomon Codes及其与RISC Zero zkVM的关系RISC Zero ZKP协议中的商多项式 FRI用途&#xff1a; 用于证明某vector commitment是&#xff08;接近&#xff09;某Reed-Solomon codeword。即证明某low-degree多项式。 FRI工作原理&#…