vRp.CD2g_test/utils/sorts
kercylan98 580bab2dfc docs: 优化 README.md 的测试用例描述 2024-01-15 11:12:24 +08:00
..
README.md docs: 优化 README.md 的测试用例描述 2024-01-15 11:12:24 +08:00
errors.go feat: utils 下新增 sorts.Topological 拓扑排序函数 2023-09-11 11:31:17 +08:00
topological.go refactor: 移除 slice 包和 hash 包,新增 listings、mappings 包存放数组、切片、映射等数据结构,原 slice、hash 包中的工具函数迁移至 collection 包,与 sher 包合并并移除 sher 包。完善 collection 包测试用例 2024-01-11 17:50:04 +08:00
topological_benchmark_test.go feat: utils 下新增 sorts.Topological 拓扑排序函数 2023-09-11 11:31:17 +08:00
topological_example_test.go feat: utils 下新增 sorts.Topological 拓扑排序函数 2023-09-11 11:31:17 +08:00
topological_test.go feat: utils 下新增 sorts.Topological 拓扑排序函数 2023-09-11 11:31:17 +08:00

README.md

Sorts

Go doc

暂无介绍...

目录导航

列出了该 package 下所有的函数及类型定义,可通过目录导航进行快捷跳转 ❤️

展开 / 折叠目录导航

包级函数定义

函数名称 描述
Topological 拓扑排序是一种对有向图进行排序的算法,它可以用来解决一些依赖关系的问题,比如计算字段的依赖关系。拓扑排序会将存在依赖关系的元素进行排序,使得依赖关系的元素总是排在被依赖的元素之前。

详情信息

func Topological[S ~[]V, Index comparable, V any](slice S, queryIndexHandler func (item V) Index, queryDependsHandler func (item V) []Index) (S, error)

拓扑排序是一种对有向图进行排序的算法,它可以用来解决一些依赖关系的问题,比如计算字段的依赖关系。拓扑排序会将存在依赖关系的元素进行排序,使得依赖关系的元素总是排在被依赖的元素之前。

  • slice: 需要排序的切片
  • queryIndexHandler: 用于查询切片中每个元素的索引
  • queryDependsHandler: 用于查询切片中每个元素的依赖关系,返回的是一个索引切片,如果没有依赖关系,那么返回空切片

该函数在存在循环依赖的情况下将会返回 ErrCircularDependencyDetected 错误

示例代码:


func ExampleTopological() {
	type Item struct {
		ID      int
		Depends []int
	}
	var items = []Item{{ID: 2, Depends: []int{4}}, {ID: 1, Depends: []int{2, 3}}, {ID: 3, Depends: []int{4}}, {ID: 4, Depends: []int{5}}, {ID: 5, Depends: []int{}}}
	var sorted, err = sorts.Topological(items, func(item Item) int {
		return item.ID
	}, func(item Item) []int {
		return item.Depends
	})
	if err != nil {
		return
	}
	for _, item := range sorted {
		fmt.Println(item.ID, "|", item.Depends)
	}
}

查看 / 收起单元测试

func TestTopological(t *testing.T) {
	type Item struct {
		ID      int
		Depends []int
	}
	var items = []Item{{ID: 2, Depends: []int{4}}, {ID: 1, Depends: []int{2, 3}}, {ID: 3, Depends: []int{4}}, {ID: 4, Depends: []int{5}}, {ID: 5, Depends: []int{}}}
	var sorted, err = sorts.Topological(items, func(item Item) int {
		return item.ID
	}, func(item Item) []int {
		return item.Depends
	})
	if err != nil {
		t.Error(err)
		return
	}
	for _, item := range sorted {
		t.Log(item.ID, "|", item.Depends)
	}
}

查看 / 收起基准测试

func BenchmarkTopological(b *testing.B) {
	type Item struct {
		ID      int
		Depends []int
	}
	var items = []Item{{ID: 2, Depends: []int{4}}, {ID: 1, Depends: []int{2, 3}}, {ID: 3, Depends: []int{4}}, {ID: 4, Depends: []int{5}}, {ID: 5, Depends: []int{}}}
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		_, err := Topological(items, func(item Item) int {
			return item.ID
		}, func(item Item) []int {
			return item.Depends
		})
		if err != nil {
			b.Error(err)
			return
		}
	}
}