在高性能应用开发中,选择合适的数据结构对程序效率至关重要。红黑树(Red-Black Tree)是一种自平衡的二叉搜索树,广泛应用于需要高效插入、删除和查找操作的场景。本文将带你一步步在 C# 中实现一个简易红黑树,并通过 C#红黑树性能测试 与 .NET 内置的 Dictionary<TKey, TValue> 进行 红黑树基准测试教程 级别的对比。
红黑树是一种满足以下五条性质的二叉搜索树:
这些规则确保了树的高度始终保持在 O(log n),从而保证了插入、删除和查找操作的时间复杂度为 O(log n)。

虽然红黑树理论性能优秀,但在实际 C# 应用中,.NET 提供的 SortedSet<T> 或 Dictionary<TKey, TValue> 可能因底层优化(如哈希表)而表现更佳。因此,进行 红黑树与字典性能对比 是评估是否值得自定义实现的关键步骤。
为了测试方便,我们先构建一个简化版的红黑树。注意:完整实现非常复杂,本教程聚焦于性能测试流程。
public enum Color { Red, Black }public class RBNode{ public int Key; public Color Color; public RBNode Left; public RBNode Right; public RBNode Parent; public RBNode(int key) { Key = key; Color = Color.Red; // 新节点默认为红色 Left = Right = Parent = null; }}public class RedBlackTree{ private RBNode root; public void Insert(int key) { RBNode node = new RBNode(key); InsertBST(node); FixInsert(node); } private void InsertBST(RBNode node) { RBNode y = null; RBNode x = root; while (x != null) { y = x; if (node.Key < x.Key) x = x.Left; else x = x.Right; } node.Parent = y; if (y == null) root = node; else if (node.Key < y.Key) y.Left = node; else y.Right = node; } private void FixInsert(RBNode k) { while (k != root && k.Parent.Color == Color.Red) { if (k.Parent == k.Parent.Parent.Right) { RBNode u = k.Parent.Parent.Left; if (u != null && u.Color == Color.Red) { u.Color = Color.Black; k.Parent.Color = Color.Black; k.Parent.Parent.Color = Color.Red; k = k.Parent.Parent; } else { if (k == k.Parent.Left) { k = k.Parent; RotateRight(k); } k.Parent.Color = Color.Black; k.Parent.Parent.Color = Color.Red; RotateLeft(k.Parent.Parent); } } else { RBNode u = k.Parent.Parent.Right; if (u != null && u.Color == Color.Red) { u.Color = Color.Black; k.Parent.Color = Color.Black; k.Parent.Parent.Color = Color.Red; k = k.Parent.Parent; } else { if (k == k.Parent.Right) { k = k.Parent; RotateLeft(k); } k.Parent.Color = Color.Black; k.Parent.Parent.Color = Color.Red; RotateRight(k.Parent.Parent); } } } root.Color = Color.Black; } private void RotateLeft(RBNode x) { RBNode y = x.Right; x.Right = y.Left; if (y.Left != null) y.Left.Parent = x; y.Parent = x.Parent; if (x.Parent == null) root = y; else if (x == x.Parent.Left) x.Parent.Left = y; else x.Parent.Right = y; y.Left = x; x.Parent = y; } private void RotateRight(RBNode x) { RBNode y = x.Left; x.Left = y.Right; if (y.Right != null) y.Right.Parent = x; y.Parent = x.Parent; if (x.Parent == null) root = y; else if (x == x.Parent.Right) x.Parent.Right = y; else x.Parent.Left = y; y.Right = x; x.Parent = y; } public bool Search(int key) { RBNode current = root; while (current != null) { if (key == current.Key) return true; else if (key < current.Key) current = current.Left; else current = current.Right; } return false; }}BenchmarkDotNet 是 .NET 平台最权威的基准测试库。首先安装 NuGet 包:
dotnet add package BenchmarkDotNet然后编写测试类:
using BenchmarkDotNet.Attributes;using BenchmarkDotNet.Running;using System.Collections.Generic;[MemoryDiagnoser]public class RBTvsDictionaryBenchmark{ private readonly int[] keys; private RedBlackTree rbTree; private Dictionary<int, bool> dict; public RBTvsDictionaryBenchmark() { var random = new Random(42); keys = new int[10000]; for (int i = 0; i < keys.Length; i++) keys[i] = random.Next(); } [GlobalSetup] public void Setup() { // 初始化红黑树 rbTree = new RedBlackTree(); foreach (var key in keys) rbTree.Insert(key); // 初始化字典 dict = new Dictionary<int, bool>(); foreach (var key in keys) dict[key] = true; } [Benchmark] public void RedBlackTree_Search() { foreach (var key in keys) rbTree.Search(key); } [Benchmark] public void Dictionary_Search() { foreach (var key in keys) _ = dict.ContainsKey(key); }}// 启动测试public class Program{ public static void Main(string[] args) { var summary = BenchmarkRunner.Run<RBTvsDictionaryBenchmark>(); }}运行上述代码后,BenchmarkDotNet 会输出类似如下结果(具体数值因机器而异):
Method Mean Error StdDev Gen 0 AllocatedRedBlackTree_Search 12.5 ms 0.25 ms 0.30 ms 0.000 0 BDictionary_Search 1.8 ms 0.04 ms 0.05 ms 0.000 0 B可以看到,Dictionary 的查找速度远快于我们的红黑树实现。这是因为 Dictionary 基于哈希表,平均时间复杂度为 O(1),而红黑树为 O(log n)。这正体现了 C#数据结构优化 的重要性——除非你需要有序遍历(如范围查询),否则优先使用内置集合。
通过本次 红黑树基准测试教程,你学会了:
记住:不要过早优化!在真实项目中,优先使用 .NET 内置集合(如 SortedSet<T> 已基于红黑树实现),只有在性能瓶颈明确且内置方案不满足需求时,才考虑自定义数据结构。
希望这篇教程能帮助你在 C# 开发中做出更明智的数据结构选择!
本文由主机测评网于2025-12-12发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025126576.html