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

Java中的数据结构与集合源码

目录

一、数据结构

1.1 数据结构概念

1.2 研究对象

1.3 常见存储结构

1.3.1 数组

1.3.2 链表

1.单向链表

2.双向链表

1.3.3 二叉树

1.3.4 栈(FILO,先进后出)

1.3.5 队列(FIFO,先进先出)

二、集合源码

2.1 List

2.1.1 ArrayList

2.1.2 Vector

2.1.3 Linkedlist

2.1.4 小结

2.2 Map

2.2.1 HashMap

2.2.2 LinkedHashMap

2.3 Set

2.4 练习


一、数据结构

1.1 数据结构概念

数据结构,就是一种程序设计优化的方法论,研究数据的`逻辑结构`和`物理结构`以及它们之间相互关系,并对这种结构定义相应的`运算`,目的是加快程序的执行速度、减少内存占用的空间。

1.2 研究对象

研究对象1:数据之间的逻辑关系

  • 集合结构
  • 线性结构:一对一关系
  • 树形结构:一对多关系
  • 图形结构:多对多关系

研究对象2:数据的存储结构(或物理结构)

  • 顺序结构
  • 链式结构
  • 索引结构
  • 散列结构

研究对象3:相关的算法操作

  • 分配资源,建立结构,释放资源
  • 插入和删除
  • 获取和遍历
  • 修改和排序

在开发中,习惯上如下的方式理解存储结构:

  • 线性表(一对一关系):一维数组、单向链表、双向链表、栈、队列
  • 树(一对多关系):各种树。比如:二叉树、B+树
  • 图(多对多关系)
  • 哈希表:比如:HashMap、HashSet

1.3 常见存储结构

1.3.1 数组

  • 数组是一个容器,用于存储一组相同类型的数据。数组在创建时需要指定大小,并且大小在数组创建后不能更改。

大体格式:

// 声明数组
int[] numbers; // 推荐的方式
int numbers[]; // 另一种方式// 初始化数组
numbers = new int[5]; // 创建一个长度为5的整数数组// 也可以在声明时直接初始化
int[] numbers = new int[]{1, 2, 3, 4, 5}; // 显式初始化
int[] numbers = {1, 2, 3, 4, 5}; // 简化的初始化

优点

  • 访问速度快:由于数组的元素是连续存储的,因此可以通过索引快速访问元素。
  • 内存利用效率高:数组在内存中是连续存储的,减少了内存碎片。

缺点

  • 固定大小:数组的大小在创建后不可更改,可能导致空间浪费或不足。
  • 插入和删除操作复杂:在数组中插入或删除元素需要移动元素,效率较低。

1.3.2 链表

链表中的基本单位;Node

1.单向链表

结构

  • 数据域:存储节点的数据。
  • 指针域:指向下一个节点的引用。

特点

  • 单向性:每个节点只能向后访问,不能向前访问。
  • 动态大小:链表的大小可以动态调整,适合需要频繁插入和删除的场景。
  • 不连续存储:链表的节点在内存中不必连续存储。

图示:

大体格式:

//创建对象
public class Test1{ @Test public void test(){ Node node1 = new Node("Aa"); Node node2 = new Node("Bb"); node1.next = node2; }
}
//节点类
class Node{Object date; //数据域Node next;//指针域public void setDate(Object date) {this.date = date;}
}

应用场景

  • 当需要频繁插入和删除元素时。
  • 对于元素数量不确定的场景,链表比数组更合适。
2.双向链表

结构

  • 数据域:存储节点的数据。
  • 前驱指针:指向前一个节点的引用。
  • 后继指针:指向下一个节点的引用。

特点

  • 双向性:每个节点可以向前和向后访问,操作灵活。
  • 动态大小:动态调整链表的大小。
  • 占用空间多:相较于单向链表,节点需要更多的空间来存储前驱指针。

图示

大体格式:

public class Dtest {//创建对象@Testpublic void test(){DNode node1 = new DNode("Aa",null,null);DNode node2 = new DNode("Bb",null,node1);DNode node3 = new DNode("Cc",null,node2);node1.next = node2;node2.next = node3;}  }
class DNode {Object data;   // 数据域DNode next;    // 后继指针DNode prev;    // 前驱指针public DNode(Object data) {this.data = data;}public DNode(Object data, DNode next, DNode prev) {this.data = data;this.next = next;this.prev = prev;}
}

应用场景

  • 当需要频繁进行前向和后向遍历时。
  • 适用于需要双向操作的场景,例如浏览器的前进和后退按钮。

1.3.3 二叉树

两个子节点被称为左子节点和右子节点。

节点

  • 数据
  • 指向左子节点的引用
  • 指向右子节点的引用

二叉树的遍历

  • 前序遍历:根 -> 左 -> 右
  • 中序遍历:左 -> 根 -> 右
  • 后序遍历:左 -> 右 -> 根
  • 层序遍历:逐层访问,每一层从左到右。

大体格式:

class TreeNode {TreeNode left;Object date;TreeNode right;public TreeNode(Object date) {this.date = date;}public TreeNode(Object date, TreeNode left, TreeNode right) {this.date = date;this.left = left;this.right = right;}
}// 测试
public class BinaryTreeTest {@Testpublic void test1(){TreeNode treeNode = new TreeNode("A",null,null);TreeNode leftNode = new TreeNode("B",null,null);TreeNode rightNode = new TreeNode("V",null,null);treeNode.left = leftNode;treeNode.right = rightNode;}
}

1.3.4 栈(FILO,先进后出)

 栈的基本概念

  • 栈的特性

    • 只能在栈顶进行插入和删除操作。
    • 具有栈顶栈底两个指针,栈顶指针指向最近添加的元素,栈底指针指向最早添加的元素。
  • 基本操作

    • push:将元素压入栈顶。
    • pop:将栈顶元素弹出并返回。
    • peek(或 top):查看栈顶元素但不弹出。
    • isEmpty:检查栈是否为空。
    • size:获取栈中元素的数量。

图示

使用数组实现栈

class ArrayStack {private int maxSize; // 栈的最大容量private int[] stack; // 存放栈元素的数组private int top; // 栈顶指针// 构造函数public ArrayStack(int size) {this.maxSize = size;this.stack = new int[maxSize];this.top = -1; // 初始时栈为空}// 入栈public void push(int value) {if (top >= maxSize - 1) {throw new RuntimeException("栈空间已满,入栈失败!");}stack[++top] = value;}// 出栈public int pop() {if (isEmpty()) {throw new RuntimeException("栈空间已空,出栈失败!");}return stack[top--];}
}

使用链表实现栈

class Node {int data;Node next;public Node(int data) {this.data = data;this.next = null;}
}class LinkedListStack {private Node top; // 栈顶节点// 构造函数public LinkedListStack() {this.top = null;}// 入栈public void push(int value) {Node newNode = new Node(value);newNode.next = top;top = newNode;}// 出栈public int pop() {if (isEmpty()) {throw new RuntimeException("栈空间已空,出栈失败!");}int value = top.data;top = top.next;return value;}
}

1.3.5 队列(FIFO,先进先出)

图示

代码实现:

import java.util.LinkedList;
import java.util.Queue;public class QueueExample {public static void main(String[] args) {// 创建一个队列Queue<Integer> queue = new LinkedList<>();// 插入元素System.out.println("入队操作:");queue.offer(10);queue.offer(20);queue.offer(30);System.out.println("队列状态:" + queue);// 删除元素System.out.println("\n出队操作:");int removedElement = queue.poll(); // 从队列中删除并返回队头元素System.out.println("出队元素:" + removedElement);System.out.println("队列状态:" + queue);// 查看队头元素但不删除System.out.println("\n查看队头元素:");int headElement = queue.peek(); // 查看队头元素System.out.println("队头元素:" + headElement);System.out.println("队列状态:" + queue);// 遍历队列System.out.println("\n遍历队列:");for (Integer element : queue) {System.out.println(element);}}
}

二、集合源码

2.1 List

2.1.1 ArrayList

1.ArrayList的特点:

  • 实现了List接口,存储有序的、可以重复的数据
  • 底层使用0bject[]数组存储
  • 线程不安全的

2.ArrayList源码解析:

2.1 jdk7版本:(以jdk1.7.0_07为例)

/*如下代码的执行:底层会初始化数组,数组的长度为10。

0bject[]elementData= new 0bject[10];*/

ArrayList<String> list = new ArrayList<>();
list.add("AA");   //elementData[0]= "AA";

list.add("BB");   //elementData[1]= "BB";

2.2 jdk8版本:(以jdk1.8.0_271内例)

//如下代码的执行:底层会初始化数组,即:0bject[]elementData= new 0bject[]{};
ArrayList<String> list =new ArrayList<>();
List.add("AA");

//首次添加元素时,会初始化数组elementData= new 0bject[10]; elementData[0]="AA

List.add("BB");       //elementData[1]="BB";

小结:

  • jdk1.7.0_07类似 饿汉式
  • jdk1.8.0_271类似 懒汉式
  • 两者都是:当要添加第11个元素的时候,底层的elementData数组已满,则需要扩容。默认扩容为原来长度的1.5倍。并将原有数组中的元素复制到新的数组中。

2.1.2 Vector

1.Vector的特点:

  • 实现了List接口,存储有序的、可以重复的数据
  • 底层使用0bject[]数组存储
  • 线程安全的

2.Vector源码解析:(以jdk1.8.0-271为例)

Vector v= new Vector();//底层初始化数组,长度为10.0bject[]elementData = new bject[10];
v.add("AA");//elementData[0] = "AA":
v.add("BB");//elementData[1]="BB";

当添加第11个元素时,需要扩容。默认扩容为原来的2倍

2.1.3 Linkedlist

1.LinkedList的特点:

  • 实现了List接口,存储有序的、可以重复的数据
  • 底层使用双向链表存储
  • 线程不安全的

2.LinkedList在jdk8中的源码解析:

LinkedList<String>list = new LinkedList<>();//底层也没做啥
List,add("AA")://将"AA"封装到一个Node对象1中,list对象的属性first、last都指向此Node对象1。

List.add("BB");//将"BB"封装到一个Node对象2中,对象1和对象2构成一个双向链表,同时last指向此Node对象2。

因为LinkedList使用的是双向链表,不需要考虑扩容问题。

LinkedList内部声明:

private static class Node<E>{E item;Node<E> next;Node<E> prel.
}

2.1.4 小结

  1. Vector基本不使用了。
  2. ArrayList底层使用数组结构,查找和添加(尾部添加)操作效率高,时间复杂度为0(1),删除和插入操作效率低,时间复杂度为0(n)
  3. LinkedList底层使用双向链表结构,删除和插入操作效率高,时间复杂度为0(1),查找和添加(尾部添加)操作效率高,时间复杂度为0(n)(有可能添加操作是0(1)

在选择了ArrayList的前提下,

  • new ArrayList():底层创建长度为10的数组。                                             
  • new ArrayList(int capacity):底层创建指定capacity长度的数组。(推荐大体确认数组的长度)

2.2 Map

2.2.1 HashMap

1. HashMap中元素的特点

  • HashMap中的所有的key彼此之间是不可重复的、无序的。所有的key就构成一个Set集合。--->key 所在的类要重写 hashcode()和equals()
  • HashMap中的所有的value彼此之间是可重复的、无序的。所有的value就构成一个Collection集合。--->valve 所在的类要重写 equals()
  • HashMap中的一个 key-value ,就构成了一个 entry
  • HashMap中的所有的 entry 彼此之间是不可重复的、无序的。所有的entry就构成了一个Set集合。

图示:

2.HashMap源码解析

2.1 jdk7中创建对象和添加数据过程(以JDK1.7.0_07为例说明):

//创建对象的过程中,底层会初始化数组Entry[]table=new Entry[16];
HashMap<String,Integer> map = new HashMap<>();

...
map.put("AA",78);//"AA"和78封装到一个Entry对象中,考虑将此对象添加到table数组中。

...

添加/修改的过程

说明

  • 情况1:将(key1,value1)存放到数组的索引i的位置
  • 情况2,情况3:(key1,valve1)元素与现有的(key2,value2)构成单向链表结构,(key1,value1)指向(key2,vaue2)

注意

随着不断的添加元素,在满足如下的条件的情况下,考虑扩容:

  • (eize >= threshold)&&(null != table[i])

当元素的个数达到临界值(->数组的长度 *加载因子)时,就考虑扩容。

  • 默认的临界值 = 16 *0.75 --> 12
  • 默认扩容为原来的2倍。

2.2 jdk8与jdk7 的区别

2.2.2 LinkedHashMap

1.LinkedHashMap与HashMap 的关系:

  • >LinkedHashMap是HashMap的子类。
  • >LinkedHashMap在HashMap使用的数组+单向链表+红黑树的基础上,又增加了一对双向链表,记录添加的(key,value)的先后顺序。便于我们遍历所有的key-valve。

2.LinkedHashMap重写了HashMap的如下方法:

Node<K,V> newNode(int hash, K key, V value, Node<K,V>  e){LinkedHashMap.Entry<K,V> p = new LinkedHashMap.EntrykK,V>(hash, key, value, e);linkNodeLast(p);return p;
}

2.底层结构:LinkedHashMap内部定义了一个Entry

static class Entry<K,V> extends HashMap.Node<K,V> {Entry<K,V> before,after;//增加的一对双向链表Entry(int hash, K key, v value, Node<K,V> next){super(hash, key, value, next);}
}

2.3 Set

HashSet和LinkedHashSet的问题可以转换成他们”父级“的内容来回答

  • HashSet底层使用的是HashMap
  • LinkedHashSet底层使用的是LinkedHashMap

2.4 练习

题目1:分析此map的内存结构

public class BinaryTreeTest {public static void main(String[] args) {HashMap<Integer, String> map = new HashMap<>();map.put(31, "张三");map.put(31,"李四");map.put(47, "王五");map.put(45,"赵六");}
}

解析:

相关文章:

Java中的数据结构与集合源码

目录 一、数据结构 1.1 数据结构概念 1.2 研究对象 1.3 常见存储结构 1.3.1 数组 1.3.2 链表 1.单向链表 2.双向链表 1.3.3 二叉树 1.3.4 栈&#xff08;FILO&#xff0c;先进后出&#xff09; 1.3.5 队列&#xff08;FIFO&#xff0c;先进先出&#xff09; 二、集合…...

Java应用程序的测试覆盖率之设计与实现(三)-- jacoco cli 客户端

一、背景 上文已把覆盖率数据采集好了&#xff0c;并提供远程连接的tcp地址及端口。 jacoco cli文档jacoco cli jar包 jacococli.jar 我下载好了&#xff0c;放在github工程里。 本文主要是介绍如何使用jacoco cli 客户端读取并生成覆盖率报告。 二、使用 1、dump覆盖率统…...

Deepin V23 / 统信UOS 下安装与配置 tftp

几个月前&#xff0c;我将开发系统从 ubuntu 切换到 Deepin&#xff0c;当时写过一篇文章《使用国产操作系统作为开发系统》。几个月下来&#xff0c;没有感觉有什么不适应&#xff0c;Ubuntu 能做的事情&#xff0c;在 Deepin 上都能做。而且有 UOS 应用商店的加持&#xff0c…...

java基础学习:定时任务常见实现方式

一、Timer解析 TaskQueue&#xff1a;小顶堆&#xff0c;存放timeTask。 TimerThread&#xff1a;任务执行线程 死循环不断检查是否有任务需要开始执行&#xff0c;有就执行它。始终是一个线程在执行。 单线程执行任务&#xff0c;任务有可能相互阻塞&#xff1a; schedul…...

句柄是什么?有什么用?举例说明

在C#编程中&#xff0c;“句柄”&#xff08;Handle&#xff09;是一个与操作系统资源相关联的标识符。句柄是一个指针或者索引&#xff0c;用于在程序代码中引用系统资源&#xff0c;如窗口、文件、线程等。由于直接操作这些资源非常危险且复杂&#xff0c;操作系统提供句柄作…...

Jenkins学习笔记

Jenkins学习笔记 NumTitleComments1官网 官方网站 中文文档2基础Jenkins基础3groovy1.groovy语法 2.groovy 入门4pipelinepipeline基本语法介绍5Github actiongithub action6Shared library1 2...

AI 解读软考高级操作系统顺序存取、直接存取、随机存取、相联存取的区别

这几个术语描述了不同类型的存储方式&#xff0c;它们涉及数据存取的顺序和灵活性。为了更好地理解&#xff0c;我们可以先通过生活中的例子来感受这些概念。 生活化例子 1. 顺序存取&#xff1a; 想象你在看一盘录像带&#xff08;比如老式的VHS录像带&#xff09;。如果你想…...

STM32烧写准备

目录 一.安装stlink驱动二.烧写器固件升级三.安装烧写程序四.进行测试1.流水灯 五.出现的问题1.升级固件问题2.测试时连接问题 一.安装stlink驱动 amd64是用在64位的&#xff0c;x86用在32位&#xff1b;双击运行即可 出现以下情况表示安装完成当连接上STM32开发板时&#xff…...

为Windows Terminal 配置zsh + Oh-My-Zsh!

参考&#xff1a; 为Windows Terminal 配置zsh Oh-My-Zsh! [非WSL] https://zhuanlan.zhihu.com/p/625583037 Package: zsh - MSYS2 Packages 安装配置 1、安装 Windows Terminal(必须) Method 1: 打开 Microsoft Store&#xff0c;搜索 “Windows Terminal”。点击 “…...

RNN、LSTM 与 Bi-LSTM

一. RNN 循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是深度学习领域一类具有内部自连接的神经网络能够学习复杂的矢量到矢量的映射。 最大特点&#xff1a;前面的序列数据可以用作后面的结果预测中。 一个简单的循环神经网络结构&#xff0c;其结构包…...

第一性原理

第一性原理是指从最基本的真理出发&#xff0c;分析和推导复杂现象或问题&#xff0c;不依赖于传统的假设或经验&#xff0c;而是从根本的原则出发进行思考。 将复杂问题拆解为更小的部分&#xff0c;逐一分析。在理解了这些基本部分的基础上&#xff0c;再进行组合和构建&…...

DOM NamedNodeMap 接口详解

DOM NamedNodeMap 接口详解 引言 在文档对象模型(DOM)中,NamedNodeMap 接口提供了一种方式来操作元素的属性集合。它是一种特殊的 NodeList,其中的每个节点都有一个名称和值。本文将详细介绍 NamedNodeMap 接口,包括其属性、方法和使用场景。 NamedNodeMap 接口概述 N…...

EasyExcel自定义下拉注解的三种实现方式

文章目录 一、简介二、关键组件1、ExcelSelected注解2、ExcelDynamicSelect接口&#xff08;仅用于方式二&#xff09;3、ExcelSelectedResolve类4、SelectedSheetWriteHandler类 三、实际应用总结 一、简介 在使用EasyExcel设置下拉数据时&#xff0c;每次都要创建一个SheetWr…...

Burp Suite Professional 2024.9 for macOS x64 ARM64 - 领先的 Web 渗透测试软件

Burp Suite Professional 2024.9 for macOS x64 & ARM64 - 领先的 Web 渗透测试软件 世界排名第一的 Web 渗透测试工具包 请访问原文链接&#xff1a;https://sysin.org/blog/burp-suite-pro-mac/ 查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1…...

使用Mock库进行依赖注入的实用指南

使用Mock库进行依赖注入的实用指南 在现代软件开发中,测试是确保代码质量的重要环节。尤其是在进行单元测试时,依赖注入(Dependency Injection, DI)是一种常用的设计模式,它可以帮助我们更好地管理依赖关系,提高代码的可测试性。本文将深入探讨如何使用Python的unittest…...

nosql课本习题

nosql题目 1. 文档数据库相比其他 NoSQL 的突出优势和特点是什么&#xff1f; 答案&#xff1a; 文档数据库的突出优势在于它的灵活性和可扩展性。不同于传统的关系型数据库&#xff0c;文档数据库允许存储半结构化和非结构化数据&#xff0c;每个文档可以有不同的字段&#x…...

springboot 3.2.5集成spring security 只放行get请求,其他请求403

环境配置 jdk 17 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.5</version><relativePath/> <!-- lookup parent from repository --></…...

【linux】麒麟v10安装ELKB(ARM架构)

安装elasticsearch 创建目录 #放安装软件的位置 mkdir -pv /software#安装elasticsearch目录 mkdir -pv /usr/local/elasticsearch#安装kibana目录 mkdir -pv /usr/local/kibana 解压elasticsearch tar -zxvf elasticsearch-8.8.1-linux-aarch64.tar.gz -C /usr/local/elast…...

帝国CMS – AutoTitlePic 自动生成文章标题图片插件

帝国CMS – AutoTitlePic 自动生成文章标题图片插件 AutoTitlePic&#xff0c;自动生成文章标题图片插件。功能特点&#xff1a; 1、安装方便、使用简单。老站、新站都能使用。 2、自动生成图片&#xff0c;安装后静默运行。所以本插件也没有预览图片。 3、扩展性强&#x…...

Docker安装Mysql5.7,解决无法访问DockerHub问题

Docker安装Mysql5.7&#xff0c;解决无法访问DockerHub问题 简介 Docker Hub 无法访问&#xff0c;应用安装失败&#xff0c;镜像拉取超时的解决方案。 摘要 &#xff1a; 当 Docker Hub 无法访问时&#xff0c;可以通过配置国内镜像加速来解决应用安装失败和镜像拉取超时的…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

前端开发者常用网站

Can I use网站&#xff1a;一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use&#xff1a;Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站&#xff1a;MDN JavaScript权威网站&#xff1a;JavaScript | MDN...

相关类相关的可视化图像总结

目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系&#xff0c;可直观判断线性相关、非线性相关或无相关关系&#xff0c;点的分布密…...

13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析

LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析 LanguageMentor 对话式训练系统架构与实现 关键词:多轮对话系统设计、场景化提示工程、情感识别优化、LangGraph 状态管理、Ollama 私有化部署 1. 对话训练系统技术架构 采用四层架构实现高扩展性的对话训练…...