数据结构学习记录

数据结构

数组 & 链表
相连性 | 指向性
数组可以迅速定位到数组中某一个节点的位置
链表则需要通过前一个元素指向下一个元素,需要前后依赖顺序查找,效率较低

实现链表

//    head => node1 => node2 => ... => nullclass Node {constructor(element) {this.element = element;this.next = null;}
}class LinkList {constructor() {this.length = 0;//    1.空链表特征 => 判断链表的长度this.head = null;}//    返回索引对应的元素getElementAt(position) {//    边缘检测if (position < 0 || position >= this.length) {return null;}let _current = this.head;for (let i = 0; i < position; i++) {_current = _current.next;}return _current;}//    查找元素所在位置indexOf(element) {let _current = this.head;for (let i = 0; i < this.length; i++) {if (_current === element) return i;_current = _current.next;}return -1;}//    添加节点 在尾部加入append(element) {_node = new Node(element);if (this.head === null) {this.head = _node;} else {this.getElementAt(this.length - 1);_current.next = _node;}this.length++;   }//    插入节点    在中间插入insert(position, element) {if (position < 0 || position > this.length) return false;let _node = new Node(element);if (position === 0) {_node.next = this.head;this.head = _node;} else {let _previos = this.getElementAt(position - 1);_node.next = _previos;_previos.next = _node;}this.length++;return true;}//    删除指定位置元素removeAt(position) {if (position < 0 || position > this.length) return false;if (position === 0) {this.head = this.head.next;} else {_previos = this.getElementAt(position - 1);let _current = _previos.next;_previos.next = current.next;            }this.length--;return true;}//    删除指定元素remove(element) {}
}

特点:先入后出(薯片桶)

队列

特点:先入先出(排队)

哈希

特点:快速匹配定位

遍历 前序遍历(中左右) 中序遍历(左中右) 后序遍历(左右中)
1.二叉树 or 多子树
2.结构定义
a.树是非线性结构
b.每个节点都有0个或多个后代

面试真题:

判断括号是否有效自闭合

算法流程:
1.确定需要什么样的数据结构,满足模型的数据 - 构造变量 & 常量
2.运行方式 简单条件执行 | 遍历 | 递归 - 算法主体结构
3.确定输入输出 - 确定流程

    //    '{}[]' 和 '[{}]' true,   //    '{{}[]' false
const stack = [];const brocketMap = {'{': '}','[': ']','(': ')'
};let str = '{}';function isClose(str) {for (let i = 0; i < str.length; i++) {const it = str[i];if (!stack.length) {stack.push(it);} else {const last = stack.at(-1);if (it === brocketMap[last]) {stack.pop();} else {stack.push(it);}}}if (!stack.length) return true;return false;
}isClose(str);

遍历二叉树

//    前序遍历
class Node {constructor(node) {this.left = node.left;this.right = node.right;this.value = node.value;}
}
//    前序遍历
const PreOrder = function(node) {if (node !== null) {console.log(node.value);PreOrder(node.left);PreOrder(node.right);}
}
//    中序遍历
const InOrder = function(node) {if (node !== null) {InOrder(node.left);console.log(node.value);InOrder(node.right);}
}
//    后序遍历
const PostOrder = function(node) {if (node !== null) {PostOrder(node.left);PostOrder(node.right);console.log(node.value);}
}

树结构深度遍历

const tree = {value: 1,children: [{value: 2,children: [{ value: 3 },{value: 4, children: [{ value: 5 }]}]},{ value: 5 },{value: 6, children: [{ value: 7 }]}]
}
//    优先遍历节点的子节点 => 兄弟节点
//    递归方式
function dfs(node) {console.log(node.value);if (node.children) {node.children.forEach(child => {dfs(child);})   }
}//    遍历 - 栈
function dfs() {const stack = [node];while (stack.length > 0) {const current = stack.pop();console.log(current.value);if (current.children) {const list = current.children.reverse();stack.push(...list);}}}

树结构广度优先遍历

const tree = {value: 1,children: [{value: 2,children: [{ value: 3 },{value: 4, children: [{ value: 5 }]}]},{ value: 5 },{value: 6, children: [{ value: 7 }]}]
}//    1. 递归
function bfs(nodes) {const list = []nodes.forEach(child => {console.log(child.value);if (child.children && child.children.length) {list.push(...child.children);}})if (list.length) {bfs(list);    }
}
bfs([tree]);//    1.递归 - 方法2
function bfs(node, queue = [node]) {if (!queue.length) return;const current = queue.shift();if (current.children) {queue.push(...current.children);}bfs(null, queue);
}
bfs(tree);//    2. 递归
function bfs(node) {const queue = [node];while(queue.length > 0) {const current = queue.shift();if (current.children) {queue.push(...current.children);}}
}

实现快速构造一个二叉树

1.若他的左子树非空,那么他的所有左子节点的值应该小于根节点的值
2.若他的右子树非空,那么他的所有右子节点的值应该大于根节点的值
3.他的左 / 右子树 各自又是一颗满足下面两个条件的二叉树

class Node {constructor(key) {this.key = keythis.left = null;this.right = null;}
}class BinaryTree {constructor() {//    根节点this.root = null;}//    新增节点insert(key) {const newNode = new Node(key);const insertNode = (node, newNode) => {if (newNode.key < node.key) {//    没有左节点的场景 => 成为左节点node.left ||= newNode;//    已有左节点的场景 => 递归改变参照物,与左节点进行对比判断插入位置inertNode(node.left, newNode);} else {//    没有左节点的场景 => 成为左节点node.right ||= newNode;//    已有左节点的场景 => 递归改变参照物,与左节点进行对比判断插入位置inertNode(node.right, newNode);}}this.root ||= newNode;//    有参照物后进去插入节点insertNode(this.root, newNode);}//    查找节点contains(node) {        const searchNode = (referNode, currentNode) => {if (currentNode.key === referNode.key) {return true;}if (currentNode.key > referNode.key) {return searchNode(referNode.right, currentNode);}if (currentNode.key < referNode.key) {return searchNode(referNode.left, currentNode);}return false;}return searchNode(this.root, node);}//    查找最大值findMax() {let max = null;//    深度优先遍历const dfs = node => {if (node === null) return;if (max === null || node.key > max) {max = node.key;}dfs(node.left);dfs(node.right);}dfs(this.root);return max;}//    查找最小值findMin() {let min = null;//    深度优先遍历const dfs = node => {if (node === null) return;if (min === null || node.key < min) {min = node.key;}dfs(node.left);dfs(node.right);}dfs(this.root);return min;}//    删除节点remove(node) {const removeNode = (referNode, current) => {if (referNode.key === current.key) {if (!node.left && !node.right) return null;if (!node.left) return node.right;if (!node.right) return node.left;}}return removeNode(this.root, node);}
}

平衡二叉树

在这里插入图片描述

class Node {constructor(key) {this.key = key;this.left = null;this.right = null;this.height = 1;}
}class AVL {constructor() {this.root = null;}// 插入节点insert(key, node = this.root) {if (node === null) {this.root = new Node(key);return;}if (key < node.key) {node.left = this.insert(key, node.left);} else if (key > node.key) {node.right = this.insert(key, node.right);} else {return;}// 平衡调整const balanceFactor = this.getBalanceFactor(node);if (balanceFactor > 1) {if (key < node.left.key) {node = this.rotateRight(node);} else {node.left = this.rotateLeft(node.left);node = this.rotateRight(node);}} else if (balanceFactor < -1) {if (key > node.right.key) {node = this.rotateLeft(node);} else {node.right = this.rotateRight(node.right);node = this.rotateLeft(node);}}this.updateHeight(node);return node;}// 获取节点平衡因子getBalanceFactor(node) {return this.getHeight(node.left) - this.getHeight(node.right);}rotateLeft(node) {      const newRoot = node.right;        node.right = newRoot.left;        newRoot.left = node;//    这里是为了校准更新的这两个节点的高度。只需要把他的左右节点的高度拿来 加1即可node.height = Math.max(this.getHeight(node.left),this.getHeight(node.right)) + 1;newRoot.height = Math.max(this.getHeight(newRoot.left),this.getHeight(newRoot.right)) + 1;return newRoot;}getHeight(node) {if (!node) return 0;return node.height;}
}

红黑树

参考写法

let RedBlackTree = (function() {let Colors = {RED: 0,BLACK: 1};class Node {constructor(key, color) {this.key = key;this.left = null;this.right = null;this.color = color;this.flipColor = function() {if(this.color === Colors.RED) {this.color = Colors.BLACK;} else {this.color = Colors.RED;}};}}class RedBlackTree {constructor() {this.root = null;}getRoot() {return this.root;}isRed(node) {if(!node) {return false;}return node.color === Colors.RED;}flipColors(node) {node.left.flipColor();node.right.flipColor();}rotateLeft(node) {var temp = node.right;if(temp !== null) {node.right = temp.left;temp.left = node;temp.color = node.color;node.color = Colors.RED;}return temp;}rotateRight(node) {var temp = node.left;if(temp !== null) {node.left = temp.right;temp.right = node;temp.color = node.color;node.color = Colors.RED;}return temp;}insertNode(node, element) {if(node === null) {return new Node(element, Colors.RED);}var newRoot = node;if(element < node.key) {node.left = this.insertNode(node.left, element);} else if(element > node.key) {node.right =this.insertNode(node.right, element);} else {node.key = element;}if(this.isRed(node.right) && !this.isRed(node.left)) {newRoot = this.rotateLeft(node);}if(this.isRed(node.left) && this.isRed(node.left.left)) {newRoot = this.rotateRight(node);}if(this.isRed(node.left) && this.isRed(node.right)) {this.flipColors(node);}return newRoot;}insert(element) {this.root = insertNode(this.root, element);this.root.color = Colors.BLACK;}}return RedBlackTree;
})()

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

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

相关文章

基于springboot+vue+Mysql的社区维修平台

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

软件产品许可证书 Licence 全流程研发(使用非对称加密技术,既安全又简单)

本篇博客对应的代码地址&#xff1a; Gitee 仓库地址&#xff1a;https://gitee.com/biandanLoveyou/licence 源代码百度网盘链接: https://pan.baidu.com/s/1_ZhdcENcrk2ZuL11hWDLTQ?pwdbmxi 提取码: bmxi 1、背景介绍 公司是做软件 SAAS 服务的&#xff0c;一般来说软件部…

RabbitMQ项目实战(一)

文章目录 RabbitMQ项目实战选择客户端基础实战 前情提要&#xff1a;我们了解了消息队列&#xff0c;RabbitMQ的入门&#xff0c;交换机&#xff0c;以及核心特性等知识&#xff0c;现在终于来到了激动人心的项目实战环节&#xff01;本小节主要介绍通过Spring Boot RabbitMQ S…

2021年全国大学生电子设计竞赛D题——基于互联网的摄像测量系统(三)

13 测试方案和测量结果 测量一个边长为1米的正方形&#xff0c;取三个顶点分别作为O、A、B点。 在O点上方&#xff0c;用细线悬挂激光笔&#xff0c;激光笔常亮向下指示&#xff0c;静止时激光笔的光点和O点重合。 将两个D8M摄像头子卡插到DE10-Nano开发板上&#xff0c;放…

MySQL Linux环境安装部署

目录 1、mysql安装包下载 2、安装mysql服务 3、启动mysql服务 4、登录mysql服务 1、mysql安装包下载 1、查看centos的版本 cat /etc/redhat-release 2、进入官网地址下载对应系统版本的安装包 地址&#xff1a;MySQL :: Download MySQL Yum Repository 2、安装mysql服务 …

恒峰智慧科技-森林消防便捷泵:轻松应对火灾危机!

在广袤无垠的森林中&#xff0c;绿色是生命的象征&#xff0c;是自然的馈赠。然而&#xff0c;当火魔无情地吞噬这片生命的绿洲时&#xff0c;我们需要一种快速、高效、可靠的消防工具来守护这片绿色。此时&#xff0c;森林消防便捷泵应运而生&#xff0c;成为了守护森林安全的…

Oracle数据库 :查询表结构脚本

查询脚本 &#xff1a; SELECT CASE WHEN a.column_id1 THEN a.TABLE_NAME ELSE END AS 表名, a.column_id AS 序号, a.column_name as 列名, REPLACE(comments, CHR(10), ) as 列说明, a.data_type || ( || a.data_length || ) as 数据类型, a.DATA_LENGTH AS 长度, a.DATA_…

idea中停止运行Vue

在里面敲入Ctrlc 输入y确定即可。

【微服务-Ribbon】什么是负载均衡?微服务中负载均衡有哪些策略呢?

前面几篇文章&#xff0c;我们了解了一下Nacos的单机部署、集群部署以及微服务接入Nacos的步骤。从本篇开始&#xff0c;我们来看一下微服务第二个通用组件-负载均衡&#xff08;Ribbon&#xff09;。 1、Ribbon负载均衡器 负载均衡顾名思义&#xff0c;是指通过软件或者硬件…

电能质量分析仪是什么

TH-6500电能质量分析仪是一种用于记录和分析现场电能质量参数的设备。它能够检测并记录电力系统的电压波动、频率偏差、谐波、三相不平衡等参数&#xff0c;帮助用户了解电力系统的运行状态&#xff0c;及时发现并解决潜在的电能质量问题。 该设备具备多种测量功能&#xff0c…

嵌入式工程师有哪些必备技能,和电子爱好者有很大区别!

要掌握的技能实际上是非常多的。在这里&#xff0c;我来结合自己亲身经历&#xff0c;从技术、思维、项目管理等方面来谈一下我认为嵌入式开发需要掌握的技能。 技术方面 C语言和汇编语言能力 C语言是嵌入式开发最核心的编程语言。在我的初学阶段&#xff0c;我花费了很多时间…

生成人工智能体:人类行为的交互式模拟论文与源码架构解析(4)——架构分析 - 核心操作提示词构造

4.4.4.核心操作与提示词构造 &#xff08;1&#xff09;感知 0.根据vision_r参数&#xff0c;获取NPC周边(2*vision_r 1) **2个tile 1.将这些空间信息存储在NPC的空间记忆字典树 2.基于0的范围&#xff0c;获取当前NPC所在arena的所有事件&#xff0c;计算事件源距离NPC的…

我用AI帮我画刘亦菲写真,绘画写真某一天是否可以取代照相馆?

我用AI帮我画刘亦菲写真&#xff0c;绘画写真某一天是否可以取代照相馆&#xff1f; 最近我试了用FaceChain人物写真生成来测试帮我绘图&#xff0c;为了不翻车&#xff0c;我在网上随便找了刘亦菲的日常照片10多张左右作为训练原图。 真随便找的 生成效果有多种选择 下面…

【问题处理】银河麒麟操作系统实例分享,服务器操作系统VNC远程问题分析

1.服务器环境以及配置 【内核版本】 4.19.90-23.8.v2101.ky10.aarch64 【OS镜像版本】 0518-server 2.问题现象描述 服务器通过vncserver:1.service服务启动的vnc服务后&#xff0c;普通用户用vnc连接时&#xff0c;锁屏后&#xff0c;然后输入登陆密码会报密码错误&…

备考2024年小学生古诗文大会:吃透历年真题和知识点(持续讲题)

对上海小学生的小升初和各种评优争章来说&#xff0c;语文、数学、英语的含金量较高的证书还是很有价值和帮助的。对于语文类的竞赛&#xff0c;小学生古诗文大会和汉字小达人通常是必不可少的&#xff0c;因为这两个针对性强&#xff0c;而且具有很强的上海本地特色。 根据往…

【nnUNetv2进阶】六、nnUNetv2 魔改网络-小试牛刀-加入注意力机制CBAM

nnUNet是一个自适应的深度学习框架&#xff0c;专为医学图像分割任务设计。以下是关于nnUNet的详细解释和特点&#xff1a; 自适应框架&#xff1a;nnUNet能够根据具体的医学图像分割任务自动调整模型结构、训练参数等&#xff0c;从而避免了繁琐的手工调参过程。 自动化流程&a…

Shopee虾皮批量上传全球产品指南

当shopee虾皮需要大量上架新产品时&#xff0c;批量工具可以更好的提升效率。通过本指南&#xff0c;你将了解如何批量上传全球商品&#xff0c;本指南适用于所有站点。 一、什么是批量上传&#xff1f; 您可以通过【中国卖家中心>>全球商品>>批量上传】功能&…

一文教您理解Playwright是如何实现动态等待的

使用过Playwright的同学都会有这样的感受&#xff0c;Playwright对UI页面中元素的识别非常稳定&#xff0c;这离不开其强大的动态等待机制&#xff01;简单的解释就是&#xff0c;Playwright在对UI页面中的任何元素操作之前&#xff0c;都需要做出一些列的校验工作来确保能够稳…

GaussDB数据库SQL系列-聚合函数

背景 在这篇文章中&#xff0c;我们将深入探讨GaussDB数据库中聚合函数的使用和优化。聚合函数是数据库查询中非常重要的工具&#xff0c;它们可以对一组值执行计算并返回单个值。例如&#xff0c;聚合函数可以用来计算平均值、总和、最大值和最小值。 这些功能在数据分析和报…

【Linux】网络与守护进程

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;进程状态、类型、优先级、命令行参数概念、环境变量(重要)、程序地址空间 目录 &#x1f449;&#x1f3fb;守护…