Java基础快速入门:TreeSet底层数据结构——树

TreeMap原理实现及常用方法 目录 一. TreeMap概述 二. 红黑树回顾 三. TreeMap构造 四. put方法 五. get 方法 六. remove方法 七. 遍历 八. 总结 前面我们分别讲了Map接口的两个实现类HashMap和LinkedHashMap,本章我们讲一下Map接口另一个重要的实现类TreeMap,TreeMap或许不如HashMap那么常用,但存在即合理,它也有自己的应用场景,TreeMap可以实现元素的自动排序。 一. TreeMap概述 TreeMap存储K-V键值对,通过. 阅读详情

本文纲要

  1. 引言
  2. 树的基本结构:节点与二叉树
    2.1 节点的构成
    2.2 什么是二叉树
    2.3 树的基本术语
  3. 二叉查找树(二叉排序树)
    3.1 定义与特点
    3.2 添加节点过程
    3.3 代码演示:节点类与插入
  4. 平衡二叉树
    4.1 为什么需要平衡
    4.2 定义与判断
  5. 平衡二叉树的旋转机制
    5.1 左旋(Left Rotation)
    5.2 右旋(Right Rotation)
    5.3 左左、左右、右右、右左四种情况
  6. 总结

引言

在 Java 集合框架中,TreeSet 是一种有序的 Set 实现。它的底层数据结构是红黑树(一种自平衡的二叉查找树)。要深入理解 TreeSet 的工作原理,首先要掌握树结构的基础知识。

本文将从最基础的二叉树讲起,逐步过渡到二叉查找树、平衡二叉树,并详细讲解平衡二叉树维持平衡的核心操作——左旋与右旋。这些内容是理解 TreeMap、TreeSet 底层实现的关键。

树的基本结构:节点与二叉树

1 ) 节点的构成

在树结构中,每一个元素称为一个节点(Node)。每一个节点通常包含四部分信息:
父节点的地址
自身存储的值
左子节点的地址
右子节点的地址

可以用如下 Java 类来表示:

public class TreeNode {
   // 父节点 
   TreeNode parent;
   // 存储的值 
   int value;
   // 左子节点 
   TreeNode left;
   // 右子节点 
   TreeNode right;

   public TreeNode(int value) {
       this.value = value;
   }
}

一个节点如果没有父节点(即为根节点),则 parent 为 null;如果没有左子节点或右子节点,则相应的 left、right 为 null。

以下图为例:

节点 A
value:?
parent:null
left: B
right: C

节点 B
value:?
parent: A
left: null
right: null

节点 C
value:?
parent: A
left: null
right: null

A 的左子节点记录了 B 的地址,右子节点记录了 C 的地址;B 和 C 的父节点记录了 A 的地址。B 和 C 没有子节点,所以它们的左、右子节点均为 null。

2 ) 什么是二叉树

二叉树是指任意一个节点的子节点数量不超过 2 的树。子节点的数量在树结构中有一个专业术语叫做度(degree)。二叉树中每个节点的度 ≤ 2。

一个简单的二叉树示例:

2

4

5

7

10

11

12

null

null

3 ) 树的基本术语

根节点(Root Node):树的最顶层节点,没有父节点。
子节点(Child Node):某个节点的直接后代。
父节点(Parent Node):某个节点的直接前驱。
叶子节点(Leaf Node):度为零的节点,没有子节点。
树的高度(Height):树中节点的最大层数。
左子树 / 右子树:以根节点的左子节点为根的子树称为左子树,以右子节点为根的称为右子树。

以高度为 4 的二叉树为例:

2

4

5

7

10

11

12

null

null

null

null

null

null

null

null

  • 第 1 层:节点 7
  • 第 2 层:节点 4、10
  • 第 3 层:节点 2、5、11
  • 第 4 层:节点 12

树的高度 = 层数 = 4。

  • 7 是根节点。
  • 4 是 7 的左子节点,10 是 7 的右子节点。
  • 蓝色虚线框住的部分(以 4 为根的子树)是根节点的左子树,高度为 3。
  • 绿色虚线框住的部分(以 10 为根的子树)是根节点的右子树,高度为 3。

二叉查找树(二叉排序树)

1 ) 定义与特点

普通的二叉树在存储数据时没有任何规律,查找某个节点需要遍历整棵树,效率很低。
为了提高查找效率,引入了二叉查找树(Binary Search Tree,BST),也称为二叉排序树或二叉搜索树。

二叉查找树必须满足:

  1. 首先是一棵二叉树(每个节点最多两个子节点)。
  2. 对于任意节点,其左子节点的值 < 该节点的值。
  3. 对于任意节点,其右子节点的值 > 该节点的值。

简单理解:任意节点从左到右依次增大。

示例:

2

4

5

7

9

10

11

  • 7 的左子节点 4 < 7,右子节点 10 > 7。
  • 4 的左子节点 2 < 4,右子节点 5 > 4。
  • 10 的左子节点 9 < 10,右子节点 11 > 10。

这是一棵标准的二叉查找树。

2 ) 添加节点过程

向二叉查找树中添加节点时,遵循小的存左边,大的存右边,相等的值不存的规则。
具体过程如下:

  1. 如果树为空,直接将新节点作为根节点。
  2. 如果树不为空,从根节点开始比较:
    • 若新节点的值 < 当前节点的值,且当前节点的左子节点为空,则成为左子节点;否则进入左子树继续比较。
    • 若新节点的值 > 当前节点的值,且当前节点的右子节点为空,则成为右子节点;否则进入右子树继续比较。
    • 若新节点的值 == 当前节点的值,不存储(或根据具体需求处理)。

添加实例:依次添加 7、4、10、5。

  1. 添加 7:树空,7 成为根节点。
  2. 添加 4:4 < 7,且 7 的左子节点为空,所以 4 成为 7 的左子节点。
  3. 添加 10:10 > 7,且 7 的右子节点为空,所以 10 成为 7 的右子节点。
  4. 添加 5:5 < 7,向左走;5 > 4,且 4 的右子节点为空,所以 5 成为 4 的右子节点。

结果:

4

5

7

10

如果继续添加 12、13,会出现“一边倒”的情况,这在后面会引出平衡二叉树的需求。

3 ) 代码演示:节点类与插入

下面使用 Java 代码演示二叉查找树的节点结构和插入过程。

节点类(包含父节点引用,以备平衡树使用):

class TreeNode {
    int value;
    TreeNode parent;
    TreeNode left;
    TreeNode right;
 
    public TreeNode(int value) {
        this.value = value;
    }
 
    // 插入节点(二叉查找树规则)
    public void insert(int newValue) {
        if (newValue < this.value) {
            if (left == null) {
                left = new TreeNode(newValue);
                left.parent = this;
            } else {
                left.insert(newValue);
            }
        } else if (newValue > this.value) {
            if (right == null) {
                right = new TreeNode(newValue);
                right.parent = this;
            } else {
                right.insert(newValue);
            }
        }
        // 相等则不处理 
    }
}

构建树并输出结构:

public class BSTDemo {
    public static void main(String[] args) {
        TreeNode root = new TreeNode(7);
        root.insert(4);
        root.insert(10);
        root.insert(5);
        // 输出树的结构(先序)
        printTree(root, "");
    }
 
    public static void printTree(TreeNode node, String prefix) {
        if (node == null) return;
        System.out.println(prefix + "├─ " + node.value);
        if (node.left != null || node.right != null) {
            if (node.left != null) {
                printTree(node.left, prefix + "│   ");
            } else {
                System.out.println(prefix + "│   ├─ null");
            }
            if (node.right != null) {
                printTree(node.right, prefix + "    ");
            } else {
                System.out.println(prefix + "    ├─ null");
            }
        }
    }
}

输出示例:

├─ 7 
│   ├─ 4 
│   │   ├─ null 
│   │   ├─ 5 
│   │       ├─ null 
│   │       ├─ null 
│   ├─ 10 
│       ├─ null 
│       ├─ null 

平衡二叉树

1 ) 为什么需要平衡

二叉查找树的插入顺序会影响树的形状。例如按 7、10、11、12、13 的顺序依次插入:

7

10

11

12

13

整棵树退化成了一条链表。此时查找节点 13 需要比较 5 次,效率降低。树的高度差越大,查询效率就越接近 O(n)。为了避免这种情况,需要让树的左右子树高度尽可能接近,即平衡。

2 ) 定义与判断

平衡二叉树(AVL 树是最典型的一种)的定义:

  1. 二叉树中,左右子树的高度差不超过 1。
  2. 任意节点的左右子树也是平衡二叉树。

判断示例:

二叉树是否平衡原因
文本描述:根节点 7,左子树高度 3,右子树高度 4,但节点 10 的左子树高度 0,右子树高度 3,差超过 1否节点 10 左右高度差为 3 − 0 = 3 > 1
文本描述:节点 4 左子树高度 2,右子树高度 0否节点 4 左右高度差 2 − 0 = 2 > 1
文本描述:根节点 7,左子树高度 2,右子树高度 1;其他节点高度差均 ≤ 1是所有节点高度差都 ≤ 1
文本描述:根节点 7 左右高度均 2;节点 4 左高度 1,右高度 0,差 1是所有节点高度差 ≤ 1

平衡二叉树的查询效率始终保持在 O(log n) 级别,因为树的高度被控制在对数级别。

平衡二叉树的旋转机制

当向平衡二叉树中添加一个节点后,可能导致树不再平衡。此时,需要通过左旋和右旋操作来恢复平衡。

1 ) 左旋(Left Rotation)

触发条件:右子树过高(右侧节点偏多),需要将右侧节点向左旋转。

左旋步骤:

  1. 将原先的右子节点(设为 R)提升为新的根节点。
  2. 原先的根节点(设为 E)降级为 R 的左子节点。
  3. R 原先的左子节点移交给 E,作为 E 的右子节点。

简单左旋图解:

旋转前:

E 根

左子节点

R

RL

RR

旋转后:

R 新根

E 左子节点

RR 右子节点

原左子节点

RL 原 R 的左子节点

复杂左旋图解(R 节点有一个左子节点):

旋转前:

4

7

9

10

11

12

  • 添加节点 12 后,右子树过高,触发左旋。
  • 先忽略 9(10 的左子节点),将 10 提升为新根,7 降级为 10 的左子节点。
  • 处理 9:原来 9 是 10 的左子节点,旋转后无法再作为 10 的左子节点(因为 7 已经是左子节点了),因此将 9 移交给降级后的 7,作为 7 的右子节点。

旋转后:

4

7

9

10

11

12

Java 代码演示左旋(假设节点包含父指针):

// 左旋操作,以当前节点为根进行左旋 
public TreeNode rotateLeft() {
    TreeNode newRoot = this.right;  // 新根是当前的右子节点 
    if (newRoot == null) return this;
 
    // 当前节点成为新根的左子节点 
    this.right = newRoot.left;
    if (newRoot.left != null) {
        newRoot.left.parent = this;
    }
 
    // 新根替换当前节点的位置 
    newRoot.parent = this.parent;
    if (this.parent != null) {
        if (this.parent.left == this) {
            this.parent.left = newRoot;
        } else {
            this.parent.right = newRoot;
        }
    }
 
    // 设置当前节点为新根的左子节点 
    newRoot.left = this;
    this.parent = newRoot;
 
    return newRoot; // 返回新的根节点 
}

2 ) 右旋(Right Rotation)

触发条件:左子树过高,需要将左侧节点向右旋转。

右旋步骤:

  1. 将原先的左子节点(设为 L)提升为新的根节点。
  2. 原先的根节点(设为 E)降级为 L 的右子节点。
  3. L 原先的右子节点移交给 E,作为 E 的左子节点。

简单右旋图解:

旋转前:

E 根

L

右子节点

LL

LR

旋转后:

L 新根

LL

E 右子节点

LR

右子节点

复杂右旋图解(L 节点有一个右子节点 5):

旋转前:

1

2

4

5

7

10

  • 添加节点 1 后,左子树过高,触发右旋。
  • 先忽略 5(4 的右子节点),将 4 提升为新根,7 降级为 4 的右子节点。
  • 处理 5:原来 5 是 4 的右子节点,旋转后交给降级后的 7,作为 7 的左子节点。

旋转后:

1

2

4

5

7

10

Java 代码演示右旋:

// 右旋操作,以当前节点为根进行右旋 
public TreeNode rotateRight() {
    TreeNode newRoot = this.left;   // 新根是当前的左子节点 
    if (newRoot == null) return this;
 
    // 当前节点成为新根的右子节点 
    this.left = newRoot.right;
    if (newRoot.right != null) {
        newRoot.right.parent = this;
    }
 
    // 新根替换当前节点的位置 
    newRoot.parent = this.parent;
    if (this.parent != null) {
        if (this.parent.left == this) {
            this.parent.left = newRoot;
        } else {
            this.parent.right = newRoot;
        }
    }
 
    // 设置当前节点为新根的右子节点 
    newRoot.right = this;
    this.parent = newRoot;
 
    return newRoot; // 返回新的根节点 
}

3 ) 左左、左右、右右、右左四种情况

当插入节点导致失衡时,根据插入位置的不同,分为四种情况,分别采用不同的旋转组合来恢复平衡。

情况插入位置失衡特征恢复操作
左左 (LL)根节点左子树的左子树左子树高度 − 右子树高度 > 1,且左子节点的左子树高一次右旋
左右 (LR)根节点左子树的右子树左子树高度 − 右子树高度 > 1,且左子节点的右子树高先局部左旋,再整体右旋
右右 (RR)根节点右子树的右子树右子树高度 − 左子树高度 > 1,且右子节点的右子树高一次左旋
右左 (RL)根节点右子树的左子树右子树高度 − 左子树高度 > 1,且右子节点的左子树高先局部右旋,再整体左旋

左左 (LL) 示例:

一次右旋后平衡

4

2

7

1

5

10

插入后失衡

7

4

10

2

5

1

插入后失衡

一次右旋后平衡

左右 (LR) 示例(在左子树的右子树插入 6):

失衡树:

2

4

5

6

7

10

  • 第一步:对 4 的右子树进行左旋(局部),5 上提,4 下移。
  • 第二步:得到类似“左左”的结构后,再对整棵树进行右旋。

旋转过程:

第二步整体右旋结果

5

4

7

2

6

10

局部左旋结果

7

5

10

4

6

2

第一步局部左旋

7

4

10

2

5

6

第一步局部左旋

局部左旋结果

第二步整体右旋结果

右右 (RR)、右左 (RL) 与左左、左右镜像对称,不再赘述。

判断与恢复平衡的伪代码:

// 插入节点后,从插入点向上回溯,检查每个节点的平衡因子 
void rebalance(TreeNode node) {
    while (node != null) {
        // 计算平衡因子 = 左子树高度 - 右子树高度 
        int balance = getHeight(node.left) - getHeight(node.right);
 
        if (balance > 1) {                 // 左子树过高 
            if (getHeight(node.left.left) >= getHeight(node.left.right)) {
                // 左左情况 → 一次右旋 
                node = node.rotateRight();
            } else {
                // 左右情况 → 先左旋左子节点,再右旋当前节点 
                node.left = node.left.rotateLeft();
                node = node.rotateRight();
            }
        } else if (balance < -1) {         // 右子树过高 
            if (getHeight(node.right.right) >= getHeight(node.right.left)) {
                // 右右情况 → 一次左旋 
                node = node.rotateLeft();
            } else {
                // 右左情况 → 先右旋右子节点,再左旋当前节点 
                node.right = node.right.rotateRight();
                node = node.rotateLeft();
            }
        } else {
            // 平衡,无需旋转 
        }
        // 向上回溯 
        node = node.parent;
    }
}

总结

本文从最基本的节点结构开始,循序渐进地介绍了二叉树、二叉查找树和平衡二叉树的概念与操作,并重点讲解了平衡二叉树通过左旋、右旋维持平衡的机制。

理解这些数据结构是学习 Java 中 TreeSet、TreeMap 底层红黑树的基础。红黑树是一种更复杂的自平衡二叉查找树,它同样依赖旋转操作来保持近似平衡,从而保证查找、插入、删除的最坏时间复杂度为 O(log n)。

联系红黑树的结构和规则,进一步完善对 TreeSet 底层实现的理解。

【JAVA】TreeMap 详解 TreeMap 详解 阅读详情

相关推荐

java面试题51HashSet和TreeSet底层结构是什么?

摘要: HashSet和TreeSet是Java中Set接口的两种实现,核心差异在于底层结构:HashSet基于HashMap(哈希表),提供O(1)级快速访问但无序;TreeSet基于TreeMap(红黑树),保持元素有序但操作复杂度为O(log n)。HashSet依赖hashCode()和equals()去重,TreeSet通过Comparator或Comparable排序并去重。选择时,高频查询且无需排序用HashSet,需范围查询或排序用TreeSet。注意线程安全需使用并发替代方案,且需保证Ha

qq_39275653的博客 1086

Java TreeSet集合简介、常用方法详解

1. TreeSet简介 TreeSet 是通过 TreeMap 实现的一个有序的、不可重复的集合 2. 构造方法——API文档 3. 常用方法——API文档 3.1 添加元素3.2删除元素3.3 判断集合元素个数3.4 迭代器遍历集合4. 在类对象中实现compareTo()方法 ......

qq_52972504的博客 9404

Java HashSet 与 TreeSet 的深度对比

HashSet 和 TreeSet 是 Java 集合框架中两种最常用的 Set 实现,它们在底层实现、性能特性和使用场景上有显著差异。以下是两者的全面对比分析: 基于哈希表实现(数组+链表+红黑树,JDK8+) 依赖元素的 和 方法 2. TreeSet 实现原理 基于红黑树(自平衡二叉查找树)实现 依赖元素的自然顺序或 进行排序 三、性能对比详解 1. 基本操作时间复杂度 操作 HashSet TreeSet add() O(1) 均摊 O(log n) remove

记录学习的过程 904

深入理解二叉树(超详细)

二叉树(Binary Tree) 回顾 在前面的文章 — 二叉树前奏中,我们对于二叉树的一些基本概念进行了回顾,同时对比了线性结构与树形结构,总结了一些常见的二叉树的性质,像二叉树,真二叉树,完全二叉树,以及满二叉树等等,但是,我们仅仅是在概念上对于二叉树有所了解,并没有进行编码工作,今天来完善一下这一步的操作 直接进入二叉树的设计与编码,如果你对于二叉树的概念以及性质不了解的话,可以回去翻翻 二叉树前奏,熟悉一下,因为编码实际上就是对于二叉树性质的一个体现 设计 属性与节点 首先,我们的二叉树是用来存放元

Kalton的博客 2万+

TreeMap详解:Java 有序 Map 原理与实现

在Java中,Map是一种常见的数据结构,它可以用来存储键值对。TreeMap是Java中的一个特殊的Map实现,它是基于红黑树实现的,具有排序和查找的功能。在本文中,我们将详细介绍TreeMap的使用和原理。本文主要介绍了Java中的TreeMap数据结构,包括其源代码解析、应用场景案例、优缺点分析、类代码方法介绍、测试用例和全文小结。通过对TreeMap的学习,读者可以了解到TreeMap的特点和使用方法,以及它与其他Map实现的不同之处。TreeMap是Java中的一个SortedMap。

喵手的博客 4461

Java零基础-集合:TreeSet

在Java集合框架中,TreeSet是一个实现了Set接口的有序集合,它能够根据元素的自然顺序或者构造时提供的Comparator对象来对元素进行排序。对于Java零基础的学习者来说,理解TreeSet的用法对于掌握Java集合操作非常重要。本文将详细介绍Java中的TreeSet,包括其特性、操作方法、应用场景、优缺点分析,并通过代码示例和测试用例,帮助Java零基础的学习者快速掌握TreeSet的使用。TreeSet底层是基于红黑树实现的,它能够确保元素处于排序状态。与HashSet相比,

喵手的博客 1062

【Java数据结构】TreeMap 与 TreeSet 深入解析

本文深入解析了JDK8中TreeMap与TreeSet的底层实现原理。TreeMap基于红黑树实现,通过Entry内部类构建节点结构,维护红黑树性质保证O(log n)的操作效率。TreeSet则利用TreeMap作为底层存储,将元素作为键实现有序性和唯一性。文章详细介绍了两种数据结构的基本操作实现原理,包括查找、插入和删除过程,以及为维护红黑树平衡进行的旋转和颜色调整操作。两者都支持自然排序和定制排序,但都不允许null元素。这些特性使得TreeMap和TreeSet成为Java集合框架中高效的有序集合实

手心朝下的博客 1868

【Java集合 2】Java链表、散列表、HashSet、TreeSet

从数组中间删除一个元素开销很大,其原因是向数组中插入元素时,此元素之后的所有元素都要向后端移动,删除时也是,数组中位于被删除元素之后的所有元素都要向数组的前端移动。

学Java,找哪吒 3188

Java中HashSet、LinkedHashSet和TreeSet的底层原理

Java中的HashSet的底层原理主要基于哈希表(HashMap)来实现。HashSet内部使用哈希表(实际上是一个HashMap的实例)来存储元素。哈希表由一个数组(桶)和多个链表(或红黑树,在Java 8及以后版本中,当链表长度超过某个阈值时,会转换为红黑树)组成。当向HashSet中添加元素时,首先会计算该元素的哈希码(通过调用对象的hashCode()方法)。哈希码是一个整数,用于确定元素在哈希表中的位置。使用哈希码和哈希表的大小(即桶的数量)来计算元素应该存放在哪个桶中。

m0_72244040的博客 1758

Miniforge3部署教程,完美替代Anaconda3

大背景不介绍了,哎!直接上教程!

zzy_ucas的博客 1万+

Informer复现 -- 完整模型

有了数据和核心的ProbAttention,接下来就可以复现完整的Informer(图1)了。图1:Informer模型结构[1]如果对图1还不太熟悉的同学,可以参考图2。由图2可知,informer与Transformer之间的差异并不大。主要区别是ProbAttention和可能的encoder最后一层的conv(源代码中用来distil)。图2:参考Transformer画的Informer模型结构。

AI_daily的博客 3493

【数据结构】TreeMap及TreeSet

欢迎浏览高耳机的博客希望我们彼此都有更好的收获。

高耳机的博客 1039

PostgreSQL向量数据插件--pgvector安装(附PostgreSQL安装)

本文为本人在安装pgvector中踩过的坑,已找到解决方法,现向大家分享。

m0_62627802的博客 2万+

Java-数据结构-(TreeMap & TreeSet)

本篇文章讲解了"TreeMap & TreeSet",希望能帮助到你。

爱是小小的癌的博客 1741

Web前端开发技术:实验14-16

实验14 1. 编写JavaScript程序实现“九九乘法口诀”表,如图14-40所示。 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>九九乘法表</title> </head> <body> <h1>九九乘法表</h1> </body> <scri

KslgmrDry的博客 1万+

Android 13 Hotseat定制化修改——001 hotseat布局方向

一.背景由于需求是需要自定义修改Hotseat,所以此篇文章是记录如何自定义修改hotseat的,应该可以覆盖大部分场景,修改点有修改hotseat布局方向,hotseat图标数量,hotseat图标大小,hotseat布局位置,hotseat图标禁止形成文件夹,hotseat图标禁止移动到Launcher...

Java_fenxiang的博客 1104

Java基础快速入门: 红黑树与TreeSet

摘要 红黑树是一种自平衡二叉查找树,通过五条颜色规则(根黑、叶黑、红节点子必黑、路径黑高相等)维持平衡。新节点默认红色以减少调整次数。插入后若父节点为红且叔节点为红,则进行变色(父叔变黑,祖父变红);若叔节点为黑,则需旋转(左旋/右旋)并调整颜色。相比AVL树,红黑树的平衡条件更宽松,适合频繁插入删除的场景。文中通过TreeSet示例演示了红黑树的实际应用,并图解了插入时的调整过程。

Wang的专栏 268

SCI投稿Title Page、Cover letter、Highlights、Manuscript模板

(简要介绍一下论文的创新性). I hope this paper issuitable for “Journal Name”.版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。原文链接:https://blog.youkuaiyun.com/weixin_48615832/article/details/120317336。

qq_15963745的博客 3700

HashSet 与 TreeSet 的区别与底层实现分析

HashSet和TreeSet都是 Java 中常用的集合类,但它们的底层实现和特性有所不同。HashSet适用于不关心元素顺序且需要快速操作的场景,而TreeSet则适用于需要保证元素有序且能够进行排序相关操作的场景。在选择使用这两者时,开发者应根据实际需求,选择最合适的集合类型。HashSet:基于HashMap,无序,快速的查找、插入和删除操作。TreeSet:基于TreeMap,有序,支持按照顺序遍历和更多的排序相关功能。

dm菜鸟编程的专栏 996

28、时间敏感网络中可靠性感知的综合路由与调度

本文针对时间敏感网络(TSN)中现有路由与调度机制主要关注时间触发(TT)流量而忽略其他类型流量效用的问题,提出了一种可靠性感知的综合路由与调度机制。通过将具有不同可靠性和延迟要求的各类流量的联合路由与调度问题形式化为基于优化模理论(OMT)的混合整数规划问题,设计了完整的路由约束与调度约束,并分析了不同类型流量的传输效用,设定了优化目标以提升整体网络性能。实验结果表明,该机制在满足TT流量严格时延与可靠性要求的同时,显著提高了AVB和BE等非关键流量的传输效用,实现了多类型流量的高效协同传输。

hhh00的博客 96

华为OD机试 - 计算数列位置N的值 - 模拟法(Python/JS/C/C++ 新系统 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。输入 M,N 两个数,则按照以下规则形成一个数列。数列的前 M 个元素的值为 1 到 M从 M+1 个元素开始,计算逻辑为如果其前 M 个元素中,存在值相同的元素,则该位置上的数值等于前 M 个数中最大数值与最小数值之和。如果其前 M 个元素中,

学Java,找哪吒 508

Java 集合--快速掌握涵盖三大场景实现的Set集合底层原理

定义继承自,用于存储无重复元素的集合。核心特性:元素唯一性。常见操作add(E e)addAllremoveAllretainAll遍历:增强 for、迭代器这三者同属Set家族,共享“无重复元素”、高效去重的核心特性,又各司其职、在“顺序”与“性能”上做出不同取舍。Set集合底层通过委派成员变量Map集合完成具体实现,但特性稍有差异,使用时需要注意。如果没有掌握Map集合的,建议先把Map集合的HashMap和TreeMap。

持 开源思想,撰 必胜所学,望 勤学者,无难处 967

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

TreeSet &TreeMap的底层实现

TreeMap 的实现就是红黑树数据结构,也就说是一棵自平衡的排序二叉树,这样就可以保证当需要快速检索指定节点。 TreeSet 和 TreeMap 的关系 为了让大家了解 TreeMap 和 TreeSet 之间的关系,下面先看 TreeSet 类的部分源代码: public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.

song_myth的博客 540

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java-集合框架底层数据结构总结

简单图: 1. List Arraylist:Object数组 Vector:Object数组 LinkedList:双向链表(JDK1.6之前为循环链表,JDK1.7取消了循环) 2. Set HashSet(无序,唯一):基于 HashMap 实现的,底层采用 HashMap 来保存元素 LinkedHashSet:LinkedHashSet 继承与 HashSet,.........

一个博客 5598

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

图解TreeSet数据结构设计与应用案例

`TreeSet` 是 Java 中一个基于红黑树实现的有序集合,它继承自 `AbstractSet` 并实现了 `NavigableSet` 接口。`TreeSet` 中的元素按照自然顺序或通过提供的 `Comparator` 进行排序,确保元素处于排序状态。它支持快速的插入、删除、查找和范围查询操作,具有对数时间复杂度。`TreeSet` 是非线程安全的,适用于需要有序集合的场景,如需要排序的数据集、范围查询和有序迭代。

肖哥弹架构博客 746

【数据结构】TreeMap 和 TreeSet

TreeSet与TreeMap

m0_73107796的博客 1522
上一篇: Java基础快速入门: Set集合与TreeSet详解
下一篇: Java基础快速入门: 红黑树与TreeSet
Wang's Blog
博客等级 码龄12年 7434粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值