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
}

注意事项

  1. 该库需要Go 1.18或更高版本,因为它使用了泛型特性
  2. 键类型必须支持比较操作
  3. 所有操作都是线程不安全的,需要在并发环境下自行加锁

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,它提供了更多的有序操作功能,但牺牲了一些性能。

回到顶部