平衡红/黑树
对于已排序的容器在运行时可能变得很大的情况,由于搜索它的算法成本,列表就会出现问题。对于这些情况,Zephyr提供了一个平衡树实现,它对大小为N的树的O(log2(N))的搜索和删除操作有运行时。这是使用传统的多个学术来源描述的红/黑树实现的。
rbtree的rbtree跟踪结构可以在用户可访问内存中的任何位置初始化。在第一次使用之前,它应该只包含零位。不需要或特定的初始化API。
与位置是显式的列表不同,rbtree中节点的排序必须由用户作为谓词函数提供。在尝试任何树操作之前,应该将类型为rb_lessthan_t()的函数分配给:c:结构体`rbtree`结构体的lessthan_fn字段。顾名所义,如果第一个节点参数按照树所期望的顺序“小于”第二个节点参数,那么这个函数应该返回一个布尔值True值。注意,“不允许是相等的,树中的节点必须有一个固定的顺序,算法才能正确工作。
与slist和dlist容器一样,rbtree中的节点被表示为存在于用户管理内存中的rbnode结构,通常嵌入在树中被跟踪的数据结构中。与列表代码不同,rbnode中的数据是完全不透明的。用户不可能提取二叉树拓扑,并像提取列表一样“手动”遍历树。
节点可以用rb_insert()插入到树中,然后用rb_remove()删除。
Zephyr内核采用红/黑树实现平衡树,以提供对大型已排序容器的O(log2(N))搜索和删除操作。这种平衡树在初始化时应全为零,节点排序需用户提供谓词函数。插入、删除、查找等操作具有对数时间复杂度,同时支持迭代器和回调方式进行元素遍历。Zephyr的实现不存储父指针,而是使用局部节点指针堆栈来避免额外存储开销,使得在保持高效的同时保持独特性。
订阅专栏 解锁全文
398

被折叠的 条评论
为什么被折叠?



