golang基于红黑树实现的高效键值排序映射插件库treemap的使用
Golang基于红黑树实现的高效键值排序映射插件库treemap的使用
概述
TreeMap
是一个基于红黑树实现的泛型键值排序映射库,它利用了Go 1.18的泛型特性。迭代器设计参考了C++的风格。
安装
go get github.com/igrmk/treemap/v2
使用示例
package main
import (
"fmt"
"github.com/igrmk/treemap/v2"
)
func main() {
// 创建一个键为int,值为string的TreeMap
tr := treemap.New[int, string]()
// 设置键值对
tr.Set(1, "World")
tr.Set(0, "Hello")
// 使用迭代器遍历TreeMap
for it := tr.Iterator(); it.Valid(); it.Next() {
fmt.Println(it.Key(), it.Value())
}
}
// 输出:
// 0 Hello
// 1 World
时间复杂度
操作名称 | 时间复杂度 |
---|---|
Set |
O(logN) |
Del |
O(logN) |
Get |
O(logN) |
Contains |
O(logN) |
Len |
O(1) |
Clear |
O(1) |
Range |
O(logN) |
Iterator |
O(1) |
Reverse |
O(logN) |
遍历整个映射 | O(N) |
内存使用
TreeMap使用O(N)的内存空间。
更多操作示例
package main
import (
"fmt"
"github.com/igrmk/treemap/v2"
)
func main() {
// 创建TreeMap
tm := treemap.New[string, int]()
// 添加元素
tm.Set("apple", 5)
tm.Set("banana", 3)
tm.Set("orange", 7)
// 获取元素
if value, ok := tm.Get("banana"); ok {
fmt.Println("banana:", value) // 输出: banana: 3
}
// 检查键是否存在
if tm.Contains("apple") {
fmt.Println("apple exists")
}
// 删除元素
tm.Del("orange")
// 获取大小
fmt.Println("Size:", tm.Len()) // 输出: Size: 2
// 遍历所有元素
for it := tm.Iterator(); it.Valid(); it.Next() {
fmt.Printf("%s: %d\n", it.Key(), it.Value())
}
// 输出:
// apple: 5
// banana: 3
// 清空TreeMap
tm.Clear()
fmt.Println("Size after clear:", tm.Len()) // 输出: Size after clear: 0
}
注意事项
- 该库需要Go 1.18或更高版本,因为它使用了泛型特性
- 键类型必须支持比较操作
- 所有操作都是线程不安全的,需要在并发环境下自行加锁
TreeMap是一个高效的有序映射实现,特别适合需要按键排序的场景。它的API设计简洁,性能优异,是标准库map的一个很好的补充。
更多关于golang基于红黑树实现的高效键值排序映射插件库treemap的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang基于红黑树实现的高效键值排序映射插件库treemap的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang treemap库使用指南
treemap是一个基于红黑树实现的高效键值排序映射的Golang库,它提供了有序的键值对存储和检索功能。
安装
go get github.com/emirpasic/gods/maps/treemap
基本用法
创建和添加元素
package main
import (
"fmt"
"github.com/emirpasic/gods/maps/treemap"
)
func main() {
m := treemap.NewWithIntComparator() // 使用整数比较器
// 添加元素
m.Put(1, "apple")
m.Put(2, "banana")
m.Put(3, "cherry")
fmt.Println(m) // 输出: TreeMap
// map[1:apple 2:banana 3:cherry]
}
自定义比较器
// 字符串比较器
m := treemap.NewWithStringComparator()
m.Put("a", 1)
m.Put("b", 2)
m.Put("c", 3)
// 自定义结构体比较器
type Person struct {
Name string
Age int
}
personComparator := func(a, b interface{}) int {
p1 := a.(Person)
p2 := b.(Person)
if p1.Age < p2.Age {
return -1
} else if p1.Age > p2.Age {
return 1
}
return 0
}
personMap := treemap.NewWith(personComparator)
personMap.Put(Person{"Alice", 25}, "Engineer")
personMap.Put(Person{"Bob", 30}, "Doctor")
常用操作
获取元素
value, found := m.Get(2) // 获取键为2的值
if found {
fmt.Println(value) // 输出: banana
}
// 获取最小键和最大键
minKey, minValue := m.Min()
maxKey, maxValue := m.Max()
删除元素
m.Remove(2) // 删除键为2的元素
遍历
// 正序遍历
it := m.Iterator()
for it.Next() {
key := it.Key()
value := it.Value()
fmt.Printf("%v: %v\n", key, value)
}
// 逆序遍历
it = m.Iterator()
for it.End(); it.Prev(); {
key := it.Key()
value := it.Value()
fmt.Printf("%v: %v\n", key, value)
}
范围查询
// 获取键在1到3之间的元素(包括1和3)
from := 1
to := 3
it := m.Iterator()
for it.Next() {
key := it.Key().(int)
if key >= from && key <= to {
fmt.Printf("%v: %v\n", key, it.Value())
}
}
性能特点
- 插入、删除和查找操作的时间复杂度都是O(log n)
- 保持键的有序性
- 支持高效的区间查询和范围遍历
实际应用示例
// 统计学生成绩排名
type Student struct {
ID int
Name string
Score float64
}
func main() {
// 按分数排序的TreeMap
scoreMap := treemap.NewWith(func(a, b interface{}) int {
s1 := a.(float64)
s2 := b.(float64)
if s1 < s2 {
return 1 // 降序排列
} else if s1 > s2 {
return -1
}
return 0
})
students := []Student{
{1, "Alice", 85.5},
{2, "Bob", 92.0},
{3, "Charlie", 78.5},
}
for _, s := range students {
scoreMap.Put(s.Score, s)
}
// 打印成绩排名
rank := 1
it := scoreMap.Iterator()
for it.Next() {
student := it.Value().(Student)
fmt.Printf("第%d名: %s (%.1f分)\n", rank, student.Name, student.Score)
rank++
}
}
treemap库非常适合需要有序键值对存储的场景,如排行榜、范围查询、有序事件处理等。相比标准库的map,它提供了更多的有序操作功能,但牺牲了一些性能。