当前位置: 首页 > news >正文

(二)链表结构

备注:根据coderwhy数据结构与算法课程进行笔记总结

1.数组缺点:

  • 数组创建通常需要申请一段连续的内存空间,且大小固定,因此当前数组不能满足容量需求时,就需要扩容。
  • 在数组开头或中间位置插入数据成本很高,需要进行大量元素的位移。

2.链表优势:

  • 链表的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用组成。
  • 内存空间不是必须连续的。可利用计算机内存,实现灵活的内存动态管理
  • 不必在创建时就确定大小,并且可以无限延申下去

3.链表缺点:访问元素时,需从头开始一个个找,访问效率比较低

简要介绍

链表类似于火车,有一个火车头,火车头会连接一个节点,节点上有乘客(数据),该节点连接下一个节点,以此类推

 

 

封装类结构

封装一个Node类,用于封装每个节点上的信息;

封装一个LinkedList类,用于表示链表结构

// 1.创建Node节点类
class Node<T> {value:T;next:Node<T> | null = null;constructor(value:T) {this.value = value}
}// 2.创建LinkedList类
class LinkedList<T> {head:Node<T> | null = null;private size:number = 0;
}
export {}

封装链表相关方法

列表常见操作:

 

1.append()

 

2.traverse()方法

3.插入节点:可分两种情况:

从头部插入;从其它地方插入

4.removeAt方法:根据位置移除对应数据; 根据数据,找到相应位置,在移除数据

  • 删除第一项时,直接让head指向第二项;

 

  • 删除其它项时,首先通过while循环找到正确的位置,让上一项的next指向current的next→中间项无引用指向它→就不存在于链表后,后面会被回收掉!!!

 

5.根据索引查找对应元素:get

6.将查找当前节点的逻辑部分抽取出来进行封装→实现复用

7.更新方法

8.indexOf

9.根据value删除节点

10.判断链表是否为空

// 1.创建Node节点类
class Node<T> {value:T;next:Node<T> | null = null;constructor(value:T) {this.value = value}
}// 2.创建LinkedList类
class LinkedList<T> {head:Node<T> | null = null;private size:number = 0;get length() {return this.size}// 封装私有方法// 根据position获取当前的节点private getNode(position:number): Node<T> | null{let current = this.headlet index = 0while(index++ < position && current) {current = current.next}return current}// 1.追加节点append(value:T) {// 1.根据value创建一个新节点const newNode = new Node(value)// 2.判断this.head是否为nulif(this.head === null) {this.head = newNode}else {let current = this.headwhile(current.next){current = current.next}// 直到Node.next为null时,退出循环current.next = newNode}this.size++}// 2.遍历链表traverse() {const values:T[] = []let current = this.headwhile(current) {values.push(current.value)current = current.next}console.log(values.join('->'));//aaa->bbb->ccc->ddd}// 3.插入方法insert(value: T, position: number): boolean {// 1. 边界条件判断if (position < 0 || position > this.size) return false;// 2. 根据 value 创建新的节点const newNode = new Node(value);// 3. 判断是否需要插入头部if (position === 0) {newNode.next = this.head;this.head = newNode;} else {// 4.找到插入位置的前一个节点/* let current = this.head;let previous: Node<T> | null = null;let index = 0;while(current && index < position ){previous = currentcurrent = current.next;index++}previous!.next = newNode;newNode.next = current; */// 重构代码const previous = this.getNode(position - 1);newNode.next = previous?.next ?? null;previous!.next = newNode;}// 6. 更新链表大小this.size++;return true;}// 4.删除方法removeAt(position:number): T | null {// 1.越界判断if(position < 0 || position >= this.size) return null;// 2.判断是否删除第一个节点let current = this.head;if(position === 0) {this.head = current?.next ?? null;}else{/* let previous: Node<T> | null = null;let index = 0;while(index++ < position && current) {previous = current;current = current.next}// 找到需要的节点previous!.next = current?.next ?? null; */// 重构为如下代码const previous = this.getNode(position - 1)previous!.next = previous?.next?.next ?? null;}this.size--;return null;}// 5.获取方法get(position:number): T | null {// 5.1越界命题if(position < 0 || position >= this.size) return null;// 5.2查找元素return this.getNode(position)?.value  ?? null;}// 7.更新方法update(value:T,position:number): boolean {if(position < 0 || position >= this.size) return false;const currentNode = this.getNode(position)currentNode!.value = value;return true;}// 8.根据值获取对应位置的索引indexOf(value:T): number {// 从第一个节点开始,向后遍历let current = this.head;let index = 0;while(current) {if(current.value === value) {return index}index++current = current.next}return -1;}// 9.根据value删除节点remove(value:T): T | null {const index = this.indexOf(value)return this.removeAt(index)}// 10.判断链表是否为空isEmpty(): boolean {return this.size === 0}
}const linkedList = new LinkedList<string>()
linkedList.append('aaa')
linkedList.append('bbb')
linkedList.append('ccc')
linkedList.append('ddd')
linkedList.insert('eee',0)//eee->aaa->bbb->ccc->ddd
linkedList.traverse()
linkedList.insert('abc',3)//eee->aaa->bbb->abc->ccc->ddd
linkedList.traverse()
linkedList.insert('cdn',6)//eee->aaa->bbb->abc->ccc->ddd->cdn
linkedList.traverse()// 测试删除节点
linkedList.removeAt(0)//aaa->bbb->abc->ccc->ddd->cdn
linkedList.traverse()
linkedList.removeAt(2)
linkedList.traverse()//aaa->bbb->ccc->ddd->cdn// 测试get
console.log(linkedList.get(0));
console.log(linkedList.get(1));
console.log(linkedList.get(2));// 测试update
linkedList.update('abc',1)
linkedList.traverse()//aaa->abc->ccc->ddd->cdn// 测试索引值
console.log(linkedList.indexOf('abc'));//1// 测试remove
linkedList.remove('cdn')
linkedList.traverse()//aaa->abc->ccc->ddd
linkedList.remove('aaa')
linkedList.remove('abc')
linkedList.traverse()//ccc->ddd
console.log(linkedList.isEmpty());//falseexport {}

常见面试题

237.删除链表中的节点(237. 删除链表中的节点 - 力扣(LeetCode))

206.反转链表(206. 反转链表 - 力扣(LeetCode))

1.栈结构实现:先存入栈结构中,再从栈结构中一个个取出,但是要注意将最后一个对象的指针指向Null

class ListNode {val: numbernext: ListNode | nullconstructor(val?: number, next?: ListNode | null) {this.val = (val===undefined ? 0 : val)this.next = (next===undefined ? null : next)}
}
function reverseList(head: ListNode | null): ListNode | null {// 生命情况下链表需要处理// 1.head本身为nullif(head === null) return null// 2.head只有一个节点if(head.next === null) return head// 3.head有多个节点// 3.1数组模拟栈结构const stack:ListNode[] = []while(head){stack.push(head)head = head.next}// 依次从栈结构中取出元素,放到一个新的链表中去const newHead: ListNode = stack.pop()!let current = newHeadwhile(stack.length>0) {const node = stack.pop()!current!.next = nodecurrent = current!.next}// 注意:获取到最后一个节点时,需将该节点的next设置为null→否则会出现循环引用的问题// 对象是存在指针的,如果不给它赋值为空,它依旧指向前一个节点current!.next = nullreturn newHead
};// 测试代码
const node = new ListNode(1)
node.next = new ListNode(2)
node.next.next = new ListNode(3)
const newHead = reverseList(node)let current = newHead
while(current){console.log(current.val);current = current.next
}
export{}

2.非递归实现:

 

class ListNode {val: numbernext: ListNode | nullconstructor(val?: number, next?: ListNode | null) {this.val = (val===undefined ? 0 : val)this.next = (next===undefined ? null : next)}
}
function reverseList(head: ListNode | null): ListNode | null {// 1.判断节点为null或只有一个节点,直接返回即可if(head === null || head.next === null) return head//2.反转链表结构 let newHead:ListNode | null = nullwhile(head) {let current: ListNode | null = head.nexthead.next = newHead//即nullnewHead = headhead = current}return newHead
};// 测试代码
const node = new ListNode(1)
node.next = new ListNode(2)
node.next.next = new ListNode(3)
const newHead = reverseList(node)let current = newHead
while(current){console.log(current.val);current = current.next
}export{}

3.递归实现:

class ListNode {val: numbernext: ListNode | nullconstructor(val?: number, next?: ListNode | null) {this.val = (val===undefined ? 0 : val)this.next = (next===undefined ? null : next)}
}
function reverseList(head: ListNode | null): ListNode | null {// 1.如果是递归,必须存在结束条件if(head === null || head.next === null) return headconst newHead = reverseList(head?.next ?? null)// 2.完成想要做的操作,是在这个位置// 第一次来到这里的时候是倒数第二个节点head.next.next = headhead.next = nullreturn newHead
};// 测试代码
const node = new ListNode(1)
node.next = new ListNode(2)
node.next.next = new ListNode(3)
const newHead = reverseList(node)let current = newHead
while(current){console.log(current.val);current = current.next
}export{}

查找算法的性能对比

算法复杂度即算法在输入规模变化时的运行效率

顺序查找的时间复杂度为O(n)

function sequentSearch(array:number[],num:number) {for (let i = 0; i < array.length; i++) {if (array[i] === num) {return i}}return -1
}const index = sequentSearch([1,3,9,10,22,50,66,77,99,100],99)
console.log(index);

二分查找的时间复杂度为O(log n)

function binarySearch(array:number[],num:number) {// 1.定义左边的索引let left = 0// 2.定义右边的索引let right = array.length - 1// 3.开始查找while(left <= right) {let mid = Math.floor((left + right) / 2)const midNum = array[mid]if(midNum === num){return mid}else if (midNum < num) {left = mid + 1}else{right = mid - 1}}return -1
}const index = binarySearch([1,2,5,6,8,9,15,18],15)
console.log(index);export{}

测试不同算法的消耗时间:

import sequentSearch from "./01-查找算法-顺序查找";
import binarySearch from "./02-查找算法-二分查找";const nums = new Array(1000000).fill(0).map((_,index) => index)
const num = 500000// 顺序查找
/* const start = performance.now()
const index = sequentSearch(nums,num)
const end = performance.now()
console.log("索引的位置:",index,"消耗的事件:",(end - start ));//2.4978999998420477ms */// 二分查找
const start = performance.now()
const index = binarySearch(nums,num)
const end = performance.now()
console.log("索引的位置:",index,"消耗的事件:",(end - start ));//0.03710000030696392msexport{}

我们也可以将检查其消耗时间的逻辑封装成一个包,安装后,直接调用

1.安装:

npm install hy-algokit

2.使用:

import {testOrderSearchEfficiency} from "hy-algokit"
import sequentSearch from "./01-查找算法-顺序查找";
import binarySearch from "./02-查找算法-二分查找";testOrderSearchEfficiency(sequentSearch)
testOrderSearchEfficiency(binarySearch)export{}

大O表示由来和 推导过程

推导过程:

 

常见的对数阶:

 

空间复杂度

与时间复杂度类似,通常需要分析程序中需要额外分配的内存空间,如数组、变量、对象、递归等

举例:

  • 对于一个递归算法来说,每次调用都会在内存中分配新的栈帧,这种栈帧占据了额外的空间→其空间复杂度为O(n)
  • 对于迭代算法来说,每次迭代中不需要额外分配空间(无指针直接销毁),故其复杂度为O(1)

数组和链表复杂度对比

1.数组是一种连续的存储结构,通过下标可直接访问到数组中的任意元素

2.链表是一种链式结构,通过指针连接起来的节点组成,访问链表中的元素需从头开始遍历

时间复杂度对比:

操作

数组(Array)

链表(Linked List)

访问元素(按索引)

O(1)

O(n)

插入元素(在头部)

O(n)

O(1)

插入元素(在中间)

O(n)

O(1)(找到位置后)

插入元素(在尾部)

O(1)(动态数组为 O(1) 平均)

O(1)

删除元素(在头部)

O(n)

O(1)

删除元素(在中间)

O(n)

O(1)(找到位置后)

删除元素(在尾部)

O(1)(动态数组为 O(1) 平均)

O(1)

搜索元素

O(n)

O(n)

空间复杂度:

数据结构

空间复杂度

数组

O(n)

链表

O(n)(每个节点包含指针)

在实际开发中的选择:

  • 如果数量不大且需要频繁随机访问元素,使用数组更好;
  • 如果数据量大,或者需要频繁插入和删除元素,使用链表更好

 

相关文章:

(二)链表结构

备注&#xff1a;根据coderwhy数据结构与算法课程进行笔记总结 1.数组缺点&#xff1a; 数组创建通常需要申请一段连续的内存空间&#xff0c;且大小固定&#xff0c;因此当前数组不能满足容量需求时&#xff0c;就需要扩容。在数组开头或中间位置插入数据成本很高&#xff0…...

oracle json笔记

文章目录 json_valuejson_value示例json_value on error如何使用 TODO json_queryjson_query示例 json_tablejson_table 示例 json_existsjson_exists示例json_exists报错 ORA-40458: 在谓词外部使用了 JSON_EXISTS json_objectjson_arrayjson_mergepatchjson_objectaggjson_ar…...

c编译和c++编译有什么区别?

文章目录 c编译和c编译有什么区别多态函数重载虚函数表 vtable 输入输出同步类型检查模板和特化链接 C 标准库 C 能编译 C 的代码吗&#xff1f; c编译和c编译有什么区别 多态 函数重载 C 支持多个同名函数&#xff08;参数不同&#xff09;&#xff0c;这是编译期多态 编译…...

【Mysql】主从复制和读写分离

一、定义 1、什么是读写分离&#xff1f; 在主库master上负责处理事务性写入操作&#xff0c;在从库slave上负责处理查询操作&#xff0c;并通过主从复制将主库上的数据同步给从库。 2、为什么要读写分离&#xff1f; 从集中到分布&#xff0c;最基本的一个需求不是数据存储的…...

泛目录排名——深入理解与优化 SEO:提升网站可见性的关键策略

https://www.zhanqun.xin/ 在数字化时代&#xff0c;互联网上的信息呈爆炸式增长。对于企业和网站运营者而言&#xff0c;如何让自己的网站在海量的网络内容中脱颖而出&#xff0c;吸引目标受众的关注&#xff0c;成为了一项至关重要的挑战。搜索引擎优化&#xff08;SEO&#…...

汇丰eee2

聚合和继承有什么样的优点和区别&#xff0c;什么时候决定用&#xff0c;现实开发中&#xff0c;选择哪一种去使用&#xff1f; 聚合的优点&#xff1a; 灵活性&#xff1a; 聚合是一种弱耦合关系&#xff0c;被聚合对象可以独立存在&#xff0c;可以灵活地替换或修改被聚合对…...

C#网络编程(Socket编程)

文章目录 0、写在前面的话1、Socket 介绍1.1 Socket是什么1.2 Socket在网络中的位置 2、C# 中的Socket参数2.1 超时控制参数2.2 缓冲区参数2.3 UDP专用参数 3、C# 中的Socket API3.1 Socket&#xff08;构造函数&#xff09;3.1.1 SocketType3.1.2 ProtocolType3.1.3 AddressFa…...

使用Python的Schedule库实现定时任务,并传递参数给任务函数

哈喽,大家好,我是木头左! 本文将详细介绍如何使用schedule库来创建定时任务,并展示如何向任务函数传递参数。 安装Schedule库 需要安装schedule库。你可以使用以下命令通过pip进行安装: pip install schedule基本用法 schedule库的基本用法非常简单。你可以通过调用sch…...

Unity Input 2023 Release-Notes

&#x1f308;Input 2023 Release-Notes 版本更新内容2023.2.17Input: Crash on InputDeviceIOCTL when closing Unity editor(UUM-10774)2023.2.16Input: Crash on InputDeviceIOCTL when closing Unity editor(UUM-10774)2023.2.15Input: Crash on InputDeviceIOCTL when clo…...

IP查询能够帮助企业进行数字化转型

企业如今正面临着用户行为碎片化、市场竞争白热化的挑战。那么企业要如何从海量网络数据中精准捕捉用户需求就十分重要了。而IP查询技术也正帮助越来越多的企业在精准营销、风险防控、合规运营等领域开辟新的增长空间。 https://www.ipdatacloud.com/?utm-sourceLMN&utm-…...

Nginx漏洞复现

vulhub起靶场 Nginx 文件名逻辑漏洞&#xff08;CVE-2013-4547&#xff09; 上传1.gif&#xff0c;内容为 <?php phpinfo();?> http://your-ip:8080/uploadfiles/1.gif[0x20][0x00].php访问文件位置&#xff0c;这里0x00要改包 先访问/uploadfiles/1.gif a.php&…...

数据结构|排序算法(二)插入排序 希尔排序

一、插入排序 1.算法思想 插入排序&#xff08;Insertion Sort&#xff09;是一种简单的排序算法&#xff0c;其基本思想是&#xff1a;将待排序的元素插入到已经有序的序列中&#xff0c;从而逐步构建有序序列。 具体过程如下&#xff1a; 把待排序的数组分为已排序和未排…...

OpenBMC:BmcWeb 处理http请求5 检查权限

OpenBMC:BmcWeb 处理http请求4 处理路由对象-CSDN博客 在通过url获取了路由对象后,如果该请求是有session的,那么下一步需要检查权限 1.validatePrivilege调用时传入了一个lambda(1)做为回调 validatePrivilege(req, asyncResp, rule,[req, asyncResp, &rule, params =…...

CentOS 系统磁盘扩容并挂载到根目录(/)的详细步骤

在使用 CentOS 系统时&#xff0c;经常会遇到需要扩展磁盘空间的情况。例如&#xff0c;当虚拟机的磁盘空间不足时&#xff0c;可以通过增加磁盘容量并将其挂载到根目录&#xff08;/&#xff09;来解决。以下是一个完整的操作流程&#xff0c;详细介绍了如何将新增的 10G 磁盘…...

Axure RP 9 for Mac 交互原型设计 安装教程@[TOC](文章目录)

Axure RP 9 for Mac 交互原型设计 安装教程TOC 一、介绍 Axure RP 9是一款功能强大的原型设计和协作工具。它不仅能够帮助用户快速创建出高质量的原型设计&#xff0c;还能促进团队成员之间的有效协作&#xff0c;从而极大地提高数字产品开发的效率和质量。拥有直观易用的界面…...

每日一题(小白)暴力娱乐篇19

样例&#xff1a; 6 1 1 4 5 1 4 输出&#xff1a; 56 66 52 44 54 64 分析题意可以得知&#xff0c;就是接收一串数字&#xff0c;将数字按照下标每次向右移动一位&#xff08;末尾循环到第一位&#xff09;&#xff0c;每次移动玩计算一下下标和数字的乘积且累加。 ①接收…...

LeetCode 第53题:最大子数组和

题目描述&#xff1a; 给你一个整数数组nums&#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。子数组是数组中的一个连续部分。 示例1: 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&#xff…...

顺序表:从数组到高效数据管理的进化之路

一、线性表&#xff1a;数据结构的 “基础骨架” 在数据结构的世界里&#xff0c;线性表是最基础的结构之一。它是由n个具有相同特性的数据元素组成的有限序列&#xff0c;就像一列整齐排列的士兵&#xff0c;每个元素都有唯一的前驱&#xff08;除了第一个&#xff09;和后继…...

TS知识补充第一篇 ✅

目录 1️⃣ any、unknow和never 2️⃣ 函数重载 3️⃣ typeof和keyof&#xff08;配合构建字典类型的Demo&#xff0c;巨好用‼️&#xff09; 4️⃣ TS的条件类型 5️⃣ TS的声明合并 一、any、unknow和never any any类型表示一个值可以是任何类型。通常在不确定变量的类型…...

每日一题(小白)模拟娱乐篇18

今天和大家一起玩个小游戏&#xff0c;给小朋友分糖果&#x1f36c; 由题知就是小朋友每次给左手边的小朋友分一半糖果&#xff0c;一轮下来如果是奇数糖果老师就给他补一个直到所有小朋友拥有相同数量的糖果&#xff0c;问问老师发放了多少糖果。用程序进行模拟的大概思路就是…...

Linux系统学习Day2——在Linux系统中开发OpenCV

一、OpenCV简介 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的跨平台计算机视觉和机器学习库&#xff0c;广泛应用于图像处理、视频分析、物体检测等领域。它提供了丰富的算法和高效的工具集&#xff0c;支持C、Python等多种语言&#xff0c…...

Redisson 实现分布式锁

在平常的开发工作中&#xff0c;我们经常会用到锁&#xff0c;那么锁有什么用呢&#xff1f;锁主要是控制对共享资源的访问顺序&#xff0c;防止多个线程并发操作导致数据不一致的问题。经常可能会听到乐观锁、悲观锁、分布式锁、行锁、表锁等等&#xff0c;那么我们今天总结下…...

(适合中白)数据结构进阶篇——搜索专题(广度优先搜索算法BFS和深度优先搜索算法DFS)

深度优先搜索DFS&广度优先搜索BFS 深度优先搜索广度优先搜索 深度优先搜索 当碰到岔路口时&#xff0c;总是以深度作为前进的关键词&#xff0c;不碰到死胡同就不回头的这种搜索方式被称为深度优先搜索(Depth First Search) 深度优先搜索是一种枚举所有完整路径以遍历所有情…...

SGLang实战问题全解析:从分布式部署到性能调优的深度指南

引言&#xff1a;当高性能推理遇上复杂生产环境 在大型语言模型(LLM)的生产部署中&#xff0c;SGLang以其革命性的RadixAttention和结构化编程能力&#xff0c;正成为越来越多企业的首选推理引擎。然而&#xff0c;当我们将32B/70B级别的大模型部署到实际生产环境时&#xff0…...

Java大视界:解码航天遥测数据的银河密码——从GB到PB的技术革命

当长征火箭划破苍穹的瞬间&#xff0c;每秒产生的遥测数据足以填满一部4K电影。在这场与星辰对话的征程中&#xff0c;Java大数据生态正扮演着解码宇宙密码的"数字炼金师"。本文将带您穿越三个认知维度&#xff0c;揭示Java技术栈如何重构航天数据分析的底层逻辑。 …...

《C++探幽:STL(string类源码的简易实现(下))》

作者的个人gitee▶️ 作者的算法讲解主页 每日一言&#xff1a;“驿寄梅花&#xff0c;鱼传尺素&#xff0c;砌成此恨无重数。&#x1f338;&#x1f338;” 接《C探幽&#xff1a;STL&#xff08;string类源码的简易实现&#xff08;上&#xff09;&#xff09;》&#x1f534…...

求线性表的倒数第K项 (数组、头插法、尾插法)

给定一系列正整数&#xff0c;请设计一个尽可能高效的算法&#xff0c;查找倒数第K个位置上的数字。 输入格式: 输入首先给出一个正整数K&#xff0c;随后是若干非负整数&#xff0c;最后以一个负整数表示结尾&#xff08;该负数不算在序列内&#xff0c;不要处理&#xff09…...

rustdesk自建服务器怎么填写客户端配置信息

目录 # id、api、中继都怎么填&#xff1f;rustdesk程序启动后服务不自动启动 # id、api、中继都怎么填&#xff1f; rustdesk程序启动后服务不自动启动 完全退出RudtDesk程序&#xff08;右下角托盘区有的话&#xff0c;需要右键点退出&#xff09; 创建windows服务&#xff…...

4月8日日记

今天抖音刷到一个视频 记了一下笔记 想做自媒体&#xff0c;直播&#xff0c;抖音是最大的平台&#xff0c;但是我的号之前因为跟人互喷被封号了 今天想把实名认证转移到新号上&#xff0c;试了一下竟然这次成功了&#xff0c;本以为能开直播了但是 还是因为之前的号有违规记…...

VScode添加python解释器

先安装python扩展 然后点ctrlshiftp搜索python:select&#xff0c;选择解析器&#xff08;或者也可以直接点左下方的&#xff09;...

Elasticsearch | ES索引模板、索引和索引别名的创建与管理

关注&#xff1a;CodingTechWork 引言 在使用 Elasticsearch (ES) 和 Kibana 构建数据存储和分析系统时&#xff0c;索引模板、索引和索引别名的管理是关键步骤。本文将详细介绍如何通过 RESTful API 和 Kibana Dev Tools 创建索引模板、索引以及索引别名&#xff0c;并提供具…...

用 Python 造轮子:打造轻量级 HTTP 调试工具

目录 一、为什么需要自建工具&#xff1f; 二、核心功能设计 三、技术选型 四、分步实现 第一步&#xff1a;搭建基础框架 第二步&#xff1a;实现请求转发逻辑 第三步&#xff1a;响应格式化处理 第四步&#xff1a;历史记录存储 五、进阶优化技巧 六、使用示例 七…...

java设计模式-原型模式

原型模式 1、原型模式(Prototype模式)是指&#xff1a;用原型实例指定创建对象的种类&#xff0c;并通过拷贝这些原型&#xff0c;创建新的对象 2、原型模式是一种创见性设计模式&#xff0c;允许一个对象再创建另一个可定制的对象&#xff0c;无需知道如何创建的细节。 3、工作…...

【Java设计模式】第9章 原型模式讲解

9. 原型模式 9.1 原型模式讲解 定义:通过拷贝原型实例创建新对象,无需调用构造函数。特点: 创建型模式无需了解创建细节适用场景: 类初始化消耗资源多对象创建过程繁琐(如属性赋值复杂)循环体中需创建大量对象优点: 性能优于直接new简化创建流程缺点: 必须实现clone()…...

Python 快速搭建一个小型的小行星轨道预测模型 Demo

目录 ✅ Demo 目标&#xff1a; &#x1f9ea; 模型方案选择 方案 1&#xff1a;开普勒 LSTM 混合预测&#xff08;推荐 &#x1f4a1;&#xff09; 方案 2&#xff1a;全 AI&#xff1a;LSTM 直接拟合轨迹 &#x1f6a7; 环境准备 &#x1f527; 示例代码结构&#xff…...

【AI】Ragflow构建本地知识库

https://github.com/infiniflow/ragflow/blob/main/README_zh.md DeepSeek搭建的本地知识库很呆&#xff1f;不符合自己的预期&#xff1f;看完这个视频你就明白了&#xff01;这样部署吊打其他的本地部署&#xff01;跟着教程来&#xff0c;不怕学不会&#xff01;_哔哩哔哩_…...

【Django】教程-12-柱状图

【Django】教程-1-安装创建项目目录结构介绍 【Django】教程-2-前端-目录结构介绍 【Django】教程-3-数据库相关介绍 【Django】教程-4-一个增删改查的Demo 【Django】教程-5-ModelForm增删改查规则校验【正则钩子函数】 【Django】教程-6-搜索框-条件查询前后端 【Django】教程…...

市政消防栓智能监控管理系统(Axure高保真原型)

在城市的运转体系中&#xff0c;市政消防栓扮演着无可替代的关键角色&#xff0c;作为城市公共安全基础设施的核心&#xff0c;它是火灾扑救时的关键水源保障&#xff0c;其重要性不言而喻。当火灾这头 “猛兽” 突然来袭&#xff0c;市政消防栓就是那道阻止火势蔓延、守护生命…...

机器学习课堂6交叉熵代价函数的逻辑回归模型

代码 # 2-10交叉熵代价函数的逻辑回归模型 import pandas as pd import numpy as np import matplotlib.pyplot as plt# 参数设置 iterations 1000 # 迭代次数 learning_rate 0.1 # 学习率 m_train 250 # 训练样本数量# 读入酒驾检测数据集 df pd.read_csv(alcohol_d…...

华为ar1200修改con口密码

<Huawei> <Huawei>sys Enter system view, return user view with CtrlZ. [Huawei]user-interface console 0 进入端口 [Huawei-ui-console0]authentication-mode pass 以pass模式登录 [Huawei-ui-console0]set authentication password cipher …...

Java 集合有序性与重复性总结及记忆技巧

Java 集合有序性与重复性总结及记忆技巧 一、集合分类速查表 集合类型是否有序是否允许重复记忆口诀ArrayList✅ 有序&#xff08;插入顺序&#xff09;✅ 可重复"数组列表&#xff0c;顺序记牢"LinkedList✅ 有序&#xff08;插入顺序&#xff09;✅ 可重复"…...

机器学习--词向量转换

引言 在自然语言处理&#xff08;NLP&#xff09;的广阔领域中&#xff0c;计算机面临的一大挑战是理解人类语言的丰富性和复杂性。文本数据对于机器而言&#xff0c;最初只是一连串难以理解的字符。词向量转换便成为了一座关键的桥梁&#xff0c;它将文本中的单词映射为数值向…...

时序数据异常检测-综述

更新中 异常检测基本概念 广义的Out-of-Distribution(广义的OOD)来描述异常检测的相关问题。OOD包括五个相关的子领域,分别为Anomaly Detection(AD)、Novelty Detection(ND)、Open Set Recogntion(OSR)、Out-of-Distribution(OOD)和Outlier Detection(OD)。这5个…...

2025年Python的主要应用场景

李升伟 编译 Python在2025年仍是最受欢迎和强大的编程语言之一。其简洁易读的语法以及庞大的库生态系统&#xff0c;使其成为各行业开发者的首选。无论是构建复杂的数据管道&#xff0c;还是自动化重复性任务&#xff0c;Python都能提供广泛的应用场景&#xff0c;以实现快速、…...

树的深度遍历和广度遍历

目录 一、深度优先遍历&#xff08;递归&#xff09;二叉树的深度优先遍历&#xff08;递归&#xff09; 二、广度优先遍历二叉树的广度遍历 一、深度优先遍历&#xff08;递归&#xff09; #include<iostream> #include<vector>using namespace std;const int N1…...

C++函数如何返回多个参数

在编程中&#xff0c;我们经常会遇到需要函数返回多个值的场景。虽然 C 函数不能直接返回多个参数&#xff0c;但通过一些间接的方法&#xff0c;我们可以轻松实现这一需求。本文将详细介绍几种常见的实现方式&#xff0c;并分析它们的优缺点和适用场景。 1. 引言 在 C 中&…...

Python 实现的运筹优化系统代码详解(0-1规划指派问题)

一、引言 在数学建模的广阔领域中&#xff0c;指派问题作为一类经典且重要的组合优化问题&#xff0c;频繁出现在各类实际场景里。例如&#xff0c;在人力资源管理中&#xff0c;如何将不同技能水平的员工高效地分配到各个项目&#xff0c;以实现项目成本最小化或收益最大化&am…...

深度集成学习不均衡样本图像分类

用五个不同的网络&#xff0c;然后对分类概率进行平均&#xff0c;得到分类结果。基本上分类精度可以提升10% 1.导入基本库 import torch import copy import torch.nn as nn import torchvision.models as models from torchvision import datasets from torchvision import…...

ubuntu 20.04 复现 LVI-SAM

1.环境配置 ubuntu20.04 ROS-Noetic GTSAM 4.0.2 Ceres 1.14.0 前面的我都安装过了&#xff0c;但Ceres 我安装的是 2.2.0,现在安装Ceres 1.14.0 sudo apt-get update sudo apt-get install cmake libgoogle-glog-dev libgflags-dev libatlas-base-dev libeigen3-dev lib…...

每日OJ题_剑指offer数组篇(剑指offer04+剑指offer11+剑指offer21)

目录 剑指 Offer 04二维数组中的查找 代码解析 剑指 Offer 11旋转数组的最小数字 代码解析1 代码解析2 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 代码解析1 代码解析2 剑指 Offer 04二维数组中的查找 LCR 121. 寻找目标值 - 二维数组 - 力扣&#xff08;LeetCo…...