ART树在订单簿管理中的应用

news/2025/4/2 19:07:13/文章来源:https://www.cnblogs.com/justinzhang/p/18800089

背景

  近期在工作中,我接触到了一种高效的数据结构——自适应基数树(Adaptive Radix Tree,ART)。ART 是一种基于基数树(Radix Tree)的数据结构,旨在提供高效的键值存储和查找功能。与传统的基数树不同,ART 通过自适应调整节点大小(如 Node4、Node16、Node48 和 Node256),实现了更高的空间和时间效率。

ART 具有以下显著特点:

  1. 高效的键值存储和查找:ART 通过压缩路径和自适应节点大小,显著减少了内存占用,并提高了查找速度。
  2. 前缀压缩:ART 采用前缀压缩技术,能够有效处理具有相同前缀的大量键,进一步优化了存储效率。
  3. 动态调整节点大小:ART 根据实际数据分布动态调整节点大小,确保在不同负载下都能保持高效的性能。
  4. 适用于多种应用场景:ART 广泛应用于数据库系统、内存缓存和其他需要高效键值存储的场景。

通过使用 ART,我们能够在处理大量键值对时,显著提升存储和查找的性能。这使得 ART 成为现代高性能数据存储系统中的一种重要选择。

参考论文

  

 

    

性能比较

自适应基数树(ART)与传统树的性能对比

自适应基数树(Adaptive Radix Tree,ART)是一种高效的数据结构,旨在提供快速的键值存储和查找功能。为了更好地理解 ART 的优势,我们将其与传统树(如二叉搜索树、红黑树)进行性能对比。以下是插入、查找和删除操作的性能对比图:

性能比较 (单位:操作/秒)
┌──────────┬───────────┬───────────┐
│ 操作类型 │   ART树    │  传统树   │
├──────────┼───────────┼───────────┤
│ 插入     │  500,000200,000  │
├──────────┼───────────┼───────────┤
│ 查找     │  800,000300,000  │
├──────────┼───────────┼───────────┤
│ 删除     │  400,000150,000  │
└──────────┴───────────┴───────────┘

 

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;import java.util.Random;
import java.util.TreeMap;
import java.util.concurrent.TimeUnit;import static org.junit.jupiter.api.Assertions.assertEquals;public class PerformanceTest {private static final int NUM_OPERATIONS = 100000;private AdaptiveRadixTree<Integer, String> art;private TreeMap<Integer, String> treeMap;private Random random;@BeforeEachpublic void setUp() {art = new AdaptiveRadixTree<>();treeMap = new TreeMap<>();random = new Random();}@Testpublic void testInsertPerformance() {long startTime = System.nanoTime();for (int i = 0; i < NUM_OPERATIONS; i++) {int key = random.nextInt();art.insert(Integer.toString(key).getBytes(), "value" + key);}long endTime = System.nanoTime();long durationArt = TimeUnit.NANOSECONDS.toMillis(endTime - startTime);startTime = System.nanoTime();for (int i = 0; i < NUM_OPERATIONS; i++) {int key = random.nextInt();treeMap.put(key, "value" + key);}endTime = System.nanoTime();long durationTreeMap = TimeUnit.NANOSECONDS.toMillis(endTime - startTime);System.out.println("Insert Performance:");System.out.println("ART: " + durationArt + " ms");System.out.println("TreeMap: " + durationTreeMap + " ms");}@Testpublic void testSearchPerformance() {for (int i = 0; i < NUM_OPERATIONS; i++) {int key = random.nextInt();art.insert(Integer.toString(key).getBytes(), "value" + key);treeMap.put(key, "value" + key);}long startTime = System.nanoTime();for (int i = 0; i < NUM_OPERATIONS; i++) {int key = random.nextInt();art.find(Integer.toString(key).getBytes());}long endTime = System.nanoTime();long durationArt = TimeUnit.NANOSECONDS.toMillis(endTime - startTime);startTime = System.nanoTime();for (int i = 0; i < NUM_OPERATIONS; i++) {int key = random.nextInt();treeMap.get(key);}endTime = System.nanoTime();long durationTreeMap = TimeUnit.NANOSECONDS.toMillis(endTime - startTime);System.out.println("Search Performance:");System.out.println("ART: " + durationArt + " ms");System.out.println("TreeMap: " + durationTreeMap + " ms");}@Testpublic void testDeletePerformance() {for (int i = 0; i < NUM_OPERATIONS; i++) {int key = random.nextInt();art.insert(Integer.toString(key).getBytes(), "value" + key);treeMap.put(key, "value" + key);}long startTime = System.nanoTime();for (int i = 0; i < NUM_OPERATIONS; i++) {int key = random.nextInt();art.remove(Integer.toString(key).getBytes());}long endTime = System.nanoTime();long durationArt = TimeUnit.NANOSECONDS.toMillis(endTime - startTime);startTime = System.nanoTime();for (int i = 0; i < NUM_OPERATIONS; i++) {int key = random.nextInt();treeMap.remove(key);}endTime = System.nanoTime();long durationTreeMap = TimeUnit.NANOSECONDS.toMillis(endTime - startTime);System.out.println("Delete Performance:");System.out.println("ART: " + durationArt + " ms");System.out.println("TreeMap: " + durationTreeMap + " ms");}
}

订单簿

  订单簿系统需要高效地处理和管理订单,以确保执行速度和数据准确性。在设计上需要考虑的点:

  1. 业务需求:

    • 价格优先:订单按价格优先级排序,高价买单和低价卖单优先匹配。
    • 下单:支持高效的订单插入操作,确保新订单能快速加入订单簿。
    • 撤单:支持高效的订单删除操作,确保用户可以快速撤销未成交订单。
    • 成交:支持高效的订单匹配和成交操作,确保订单能及时撮合成交。
  2. 数据结构需求:

    • 有序:订单簿需要维护订单的有序性,以便快速查找和匹配订单。
    • 高效查找/插入:支持高效的订单查找和插入操作,确保新订单能快速加入订单簿。
    • 高效查找/删除:支持高效的订单查找和删除操作,确保用户可以快速撤销未成交订单。
    • 查找最大/最小值,按序遍历:支持快速查找订单簿中的最大值和最小值,并按价格顺序遍历订单簿,确保订单匹配和撮合的效率。

  为了满足上述需求,订单簿系统应采用高效的数据结构,如自适应基数树(Adaptive Radix Tree, ART)、跳表(Skip List)或平衡二叉搜索树(如红黑树)。这些数据结构能够提供高效的查找、插入和删除操作,并支持按序遍历,确保订单簿系统的高性能和高可靠性。

ART树+订单簿的实验

  在观摩学习完论文后,在网上搜索了一个开源实现,然后开始进行订单簿的实验:

  github上开源实现:https://github.com/rohansuri/adaptive-radix-tree

  这个实现么有放到maven仓库当中,所以直接拿到工程目录来使用:

  代码放到这里了:https://github.com/aktiger/bitget-solution

 

 

后续改进

  

 

 

参考:

1. https://www.oneyearago.me/2023/01/12/principle_and_optimization_of_radix_tree/

2. https://uncp.github.io/Adaptive-Radix-Tree/

3. 

 

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

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

相关文章

AtCoder Beginner Contest 399 ABCDEF 题目解析

A - Hamming Distance 题意 给定两个长度均为 \(N\) 的字符串 \(S\) 和 \(T\),求总共有多少个位置不同。 思路 直接输入字符串后逐位判断即可。 代码 int n; string s, t; cin >> n >> s >> t; int ans = 0; for(int i = 0; i < n; i++)ans += (s[i] != …

Solana编译失败探讨(OpenEuler RISC-V版)

Solana 是 2017 年由 Anatoly Yakovenko 创立的开源项目,旨在打造高性能、去中心化且低成本的区块链平台2。它采用独特的 Proof of History(PoH)共识机制,结合 Tower BFT 等技术,实现了每秒数千笔交易的高吞吐量,确认时间仅 400 毫秒,每笔交易中位数费用为 0.00064 SOL1…

windows将ollama及模型安装到D盘或其他盘符

Ollama官网 在ollama安装包存放的文件路径输入 cmd 回车自动打开命令窗口 在命令行输入一下内容: 软件包名称 /DIR=指定目录OllamaSetup.exe /DIR=E:\software\Ollama 弹出安装程序,直接Install ---------------------------------------------------------------------…

【DIY】通达信DIY添加扫雷宝、地图和复盘(1)

【写在前面】炒股软件有很多,电脑版我用的多的通达信,手机版用的多的是同花顺。之前还有一些其它的软件,比如A股通、短线王、wind股票、雪球等都有自己的特色。自己不喜欢一次装好多软件,所以就产生了聚合的念头。通达信通赢版可以登录多券商账号,懒得来回切换,所以选择以…

RabbitMQ进阶--TTL,死信队列,持久化,磁盘监控

一.消息的TTL机制 RabbitMQ中的TTL(Time-To-Live,存活时间)是指消息或队列的过期时间。TTL机制允许你指定消息在未被消费前可以存活的时间长度,超过这个时间后,消息将被视为“死亡”,并从队列中移除。这种机制对于控制消息的有效性和资源管理非常有用。 防止积压消息:当…

day41 基础的模块

基础模块 ad-hoc命令模式pingcommandshellcopyfilescriptcrongroupuser1.先看资料,看模块的语法 - 官网,看实例用法,语法注解 - ansible-doc -s 模块名 - 你自己的学习笔记2.每一个模块独有的参数语法,都是 ad-hoc命令模式ansible 主机组 -m 模块名 -a "模块独有的…

Java面试基础

一、Java基础语法 1.1 环境搭建与开发 1、JDK、JRE、JVM的关系和区别?(高频plus)JDK:Java Development Kit,Java开发工具包,包含了JRE和一系列Java开发工具。 JRE:Java Runtime Environment,Java程序的运行环境,包含JVM、Java核心类库等。JRE只能用来运行Java应用程序…

day41 Ansible剧本的语法

day41--ansible剧本的学习 1.剧本的主题的内容剧本就是两大部分的知识点 -ansible 模块(以及模块的参数) -yaml语法3.工作以后 维护公司的剧本 -看剧本,看懂了,维护,修改 -修改各种的参数,文件的路径,文件的名字,服务的端口名字(就是该ansible各种的参数,参数的值)2。…

Windows系统迁移用户目录

Windows系统随着使用时间的延长,系统盘空间占用会越来越大,对于一些硬盘空间有限的主机而言,C盘空间剩余就越来越少,稍不注意可以可能就被占满了,导致系统都无法启动。正好我自己的笔记本电脑也遇到了同样的问题,因此就想把C:\Users目录迁移到其他分区中。 在实践中,使用…

iphone---苹果手机传输文件

使用手机,拍了一些照片和剪辑了一些视频,但是总感觉将手机里面的图片及视频传到电脑里面和麻烦,今天试了一下用U盘传,效率还可以,但是其中也遇到了一些问题,就在这里记录下: 传输方法:插入U盘,选择图片或文件,点击【分享】选择【存储到“文件”】点击【左上角浏览】…

Python+硅基流动API实现小说转有声读物

一、注册硅基流动账号获取文本转语音api 1.注册登录硅基流动注册、登录硅基流动查看apikey查看赠送的免费额度点击文档中心2.查看文本转语音api查看文本转语音api查看api使用指南查看文本转语音api的python调用方法二、python实现文本转语音功能 1.python调用api实现文本转语音…

蓝绿部署深度解析:从理论到实践的全方位学习指南

一、蓝绿部署的基本概念 (一)定义 蓝绿部署是一种软件发布策略,通过设置两个相同的环境(“蓝色”和“绿色”),最大限度地减少停机并降低与部署新版本应用程序相关的风险。 (二)工作原理 蓝绿部署的核心思想是将应用程序的部署过程分为两个阶段:测试阶段和生产阶段。在…