Kotaemon框架的用户体验优化建议
2025/12/18 5:34:53
在编程中,我们经常需要一个动态维护有序数据的结构。比如:
std::map和std::set的底层实现如果使用普通的二叉搜索树(BST),极端情况下会退化成链表(如插入有序数据),导致查找效率从O(log n)降为O(n)。为了解决这个问题,红黑树(Red-Black Tree)应运而生。
红黑树是一种自平衡的二叉搜索树,它通过以下规则实现近似平衡:
k个节点,最长路径最多有2k个节点。这确保了红黑树的高度始终在O(log n)范围内。插入新节点时,红黑树需要通过变色 + 旋转维持平衡。以下是典型场景:
此时需要根据叔叔节点的颜色进行处理:
祖父(黑) → 父(红) → 当前(红) 叔(红)需要通过旋转调整:
enum Color { RED, BLACK }; template <typename K, typename V> struct RBTreeNode { RBTreeNode* left; RBTreeNode* right; RBTreeNode* parent; std::pair<K, V> kv; Color color; RBTreeNode(const K& key, const V& value) : left(nullptr), right(nullptr), parent(nullptr), kv(key, value), color(RED) {} }; template <typename K, typename V> class RBTree { public: void insert(const K& key, const V& value) { // 二叉搜索树插入逻辑 // ... // 插入后调整平衡 fixInsert(newNode); } private: void fixInsert(RBTreeNode<K, V>* node) { while (node->parent && node->parent->color == RED) { // 处理四种情况 // ... } root->color = BLACK; } RBTreeNode<K, V>* root; };std::map和std::set默认使用红黑树实现(C++11)。O(log n)。