{"id":17330423,"url":"https://github.com/lxzan/dao","last_synced_at":"2025-05-09T01:45:42.743Z","repository":{"id":45694815,"uuid":"434423255","full_name":"lxzan/dao","owner":"lxzan","description":"Simple and high-performance data structures and algorithms library","archived":false,"fork":false,"pushed_at":"2024-10-10T03:18:10.000Z","size":439,"stargazers_count":59,"open_issues_count":0,"forks_count":3,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-05-09T01:45:35.276Z","etag":null,"topics":["data-structure","generic","hashmap","heap","linkedlist","rbtree","segment-tree","trie"],"latest_commit_sha":null,"homepage":"https://pkg.go.dev/github.com/lxzan/dao","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lxzan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-12-03T01:01:02.000Z","updated_at":"2024-11-21T10:54:21.000Z","dependencies_parsed_at":"2024-01-16T09:42:35.277Z","dependency_job_id":"b30ecc27-1f4c-478b-888e-17733102cbdb","html_url":"https://github.com/lxzan/dao","commit_stats":null,"previous_names":[],"tags_count":16,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lxzan%2Fdao","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lxzan%2Fdao/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lxzan%2Fdao/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lxzan%2Fdao/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lxzan","download_url":"https://codeload.github.com/lxzan/dao/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253176443,"owners_count":21866142,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["data-structure","generic","hashmap","heap","linkedlist","rbtree","segment-tree","trie"],"created_at":"2024-10-15T14:51:14.538Z","updated_at":"2025-05-09T01:45:42.720Z","avatar_url":"https://github.com/lxzan.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"[中文](README_CN.md)\n\n\u003cdiv align=\"center\"\u003e\n    \u003ch1\u003eDAO\u003c/h1\u003e\n    \u003cimg src=\"assets/logo.png\" alt=\"logo\" width=\"300px\"\u003e\n    \u003ch5\u003e道生一, 一生二, 二生三, 三生万物; 万物负阴而抱阳, 冲气以为和\u003c/h5\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n[![Build Status](https://github.com/lxzan/dao/workflows/Go%20Test/badge.svg?branch=main)](https://github.com/lxzan/dao/actions?query=branch%3Amain) [![codecov](https://codecov.io/gh/lxzan/dao/graph/badge.svg?token=BQM1JHCDEE)](https://codecov.io/gh/lxzan/dao) [![go-version](https://img.shields.io/badge/go-%3E%3D1.18-30dff3?style=flat-square\u0026logo=go)](https://github.com/lxzan/dao) [![license](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n\n\u003c/div\u003e\n\n### Description\n\n`DAO` is a library of generic-based data structures and algorithms that complements the standard library in terms of\ndata containers and algorithms to simplify business development.\n\n### Index\n\n- [Description](#description)\n- [Index](#index)\n- [Vector](#vector)\n  - [Unique](#unique)\n  - [Sort](#sort)\n  - [Filter](#filter)\n- [Heap](#heap)\n  - [N-Way Heap](#n-way-heap)\n  - [HashHeap](#hashheap)\n- [Stack](#stack)\n- [Queue](#queue)\n- [Deque](#deque)\n- [LinkedList](#linkedlist)\n- [RBTree](#rbtree)\n- [Dict](#dict)\n- [HashMap](#hashmap)\n- [Segment Tree](#segment-tree)\n- [Benchmark](#benchmark)\n\n\n### Vector\n\n#### Unique\n\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"github.com/lxzan/dao/vector\"\n)\n\nfunc main() {\n    var v = vector.NewFromInts(1, 3, 5, 3)\n    v.Unique()\n    fmt.Printf(\"%v\", v.Elem())\n}\n\n```\n\n#### Sort\n\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"github.com/lxzan/dao/vector\"\n)\n\nfunc main() {\n    var v = vector.NewFromInts(1, 3, 5, 2, 4, 6)\n    v.Sort()\n    fmt.Printf(\"%v\", v.Elem())\n}\n\n```\n\n#### Filter\n\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"github.com/lxzan/dao/vector\"\n)\n\nfunc main() {\n    var v = vector.NewFromInts(1, 3, 5, 2, 4, 6)\n    v.Filter(func(i int, v vector.Int) bool {\n        return v.GetID()%2 == 0\n    })\n    fmt.Printf(\"%v\", v.Elem())\n}\n\n```\n\n### Heap\n\n**Heap**, also known as a priority queue, where the top element of the heap is always the largest or smallest. Commonly\nused is the quadruple heap, `Push/Pop` is more balanced. Using `y=pow(2,x)` as the number of forks, to speed up\nparent-child computation.\n\n#### N-Way Heap\n\n```go\npackage main\n\nimport (\n    \"github.com/lxzan/dao/heap\"\n    \"github.com/lxzan/dao/types/cmp\"\n)\n\nfunc main() {\n    var h = heap.NewWithWays(heap.Binary, cmp.Less[int])\n    h.Push(1)\n    h.Push(3)\n    h.Push(5)\n    h.Push(2)\n    h.Push(4)\n    h.Push(6)\n    for h.Len() \u003e 0 {\n        println(h.Pop())\n    }\n}\n\n```\n\n#### HashHeap\n\nHeap structure with hash index.\n\n```go\npackage main\n\nimport (\n    \"github.com/lxzan/dao/heap\"\n)\n\nfunc main() {\n    var h = heap.NewHashHeap[string, int](func(a, b int) bool { return a \u003c b })\n    h.Set(\"a\", 1)\n    h.Set(\"b\", 2)\n    h.Set(\"c\", 3)\n    h.Set(\"d\", 4)\n    h.Set(\"e\", 5)\n    h.Set(\"f\", 6)\n\n    h.Delete(\"c\")\n    h.Set(\"d\", 0)\n    h.Set(\"g\", 3)\n    for h.Len() \u003e 0 {\n        ele := h.Pop()\n        println(ele.Key(), ele.Value())\n    }\n}\n\n```\n\n### Stack\n\n**Stack** Last in first out (`LIFO`) data structure\n\n```go\npackage main\n\nimport (\n    \"github.com/lxzan/dao/stack\"\n)\n\nfunc main() {\n    var s stack.Stack[int]\n    s.Push(1)\n    s.Push(3)\n    s.Push(5)\n    for s.Len() \u003e 0 {\n        println(s.Pop())\n    }\n}\n```\n\n### Queue\n\n**Queue** First in first out (`FIFO`) data structure. The `dao/queue` is automatically reset when all elements are\nejected, reusing memory space.\n\n```go\npackage main\n\nimport (\n    \"github.com/lxzan/dao/queue\"\n)\n\nfunc main() {\n    var s = queue.New[int](0)\n    s.Push(1)\n    s.Push(3)\n    s.Push(5)\n    for s.Len() \u003e 0 {\n        println(s.Pop())\n    }\n}\n\n```\n\n### Deque\n\n**Deque** are similar to doubly linked list, where insertion and deletion operations can be\nperformed efficiently at both ends.\n\n`dao/deque` is based on array subscripts to emulate pointers, the deleted space can still be reused later, and does not\ndepend on `sync.Pool`.\n\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"github.com/lxzan/dao/deque\"\n)\n\nfunc main() {\n    var list = deque.New[int](8)\n    list.PushBack(1)\n    list.PushBack(3)\n    list.PushBack(5)\n    list.PushBack(7)\n    list.PushBack(9)\n    for i := list.Front(); i != nil; i = list.Get(i.Next()) {\n        fmt.Printf(\"%v \", i.Value())\n    }\n\n    println()\n    for i := list.Back(); i != nil; i = list.Get(i.Prev()) {\n        fmt.Printf(\"%v \", i.Value())\n    }\n}\n```\n\n### LinkedList\n\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"github.com/lxzan/dao/linkedlist\"\n)\n\nfunc main() {\n    var list = linkedlist.New[int]()\n    list.PushBack(1)\n    list.PushBack(3)\n    list.PushBack(5)\n    list.PushBack(7)\n    list.PushBack(9)\n    for i := list.Front(); i != nil; i = i.Next() {\n        fmt.Printf(\"%v \", i.Value)\n    }\n\n    println()\n    for i := list.Back(); i != nil; i = i.Prev() {\n        fmt.Printf(\"%v \", i.Value)\n    }\n}\n```\n\n### RBTree\n\nA high-performance red-black tree implementation that can be used as an in-memory database.\n\n```go\npackage main\n\nimport (\n    \"github.com/lxzan/dao/rbtree\"\n)\n\nfunc main() {\n    var tree = rbtree.New[int, struct{}]()\n    for i := 0; i \u003c 10; i++ {\n        tree.Set(i, struct{}{})\n    }\n\n    var results = tree.\n        NewQuery().\n        Left(func(key int) bool { return key \u003e= 3 }).\n        Right(func(key int) bool { return key \u003c= 5 }).\n        Order(rbtree.ASC).\n        FindAll()\n    for _, item := range results {\n        println(item.Key)\n    }\n}\n\n```\n\n### Dict\n\n**Dict** aka prefix tree, efficiently matches string prefixes. `dao/dict` can dynamically configure the width\nof slots (controlled by the index).\n\nNote: Set the index reasonably, characters beyond the index length can not be optimized for indexing.\n\n```go\npackage main\n\nimport (\n    \"github.com/lxzan/dao/dict\"\n)\n\nfunc main() {\n    var tree = dict.New[int]()\n    tree.Set(\"listen\", 1)\n    tree.Set(\"list\", 2)\n    tree.Set(\"often\", 3)\n    tree.Set(\"oh!\", 4)\n    tree.Set(\"haha\", 5)\n    tree.Set(\"\", 6)\n\n    tree.Match(\"list\", func(key string, value int) bool {\n        println(key, value)\n        return true\n    })\n}\n```\n\n### HashMap\n\nAn alias for `Runtime Map`, extending `Keys`, `Values`, `Range` and other utility methods.\n\n```go\npackage main\n\nimport (\n    \"github.com/lxzan/dao/hashmap\"\n)\n\nfunc main() {\n    var m = hashmap.New[string, int](8)\n    m.Set(\"a\", 1)\n    m.Set(\"b\", 2)\n    m.Set(\"c\", 3)\n    m.Range(func(key string, val int) bool {\n        println(key, val)\n        return true\n    })\n}\n```\n\n### Segment Tree\n\n**Segment Tree** is a binary tree in which each node represents an interval. Line segment trees are characterized by the\nability to perform interval queries and interval updates in `O(logn)` time.\n\n```go\npackage main\n\nimport (\n    \"fmt\"\n    st \"github.com/lxzan/dao/segment_tree\"\n)\n\nfunc main() {\n    var a = []int{1, 3, 5, 7, 9, 2, 4, 6, 8, 10}\n    var t = st.New(a, st.NewIntSummary[int], st.MergeIntSummary[int])\n    var r = t.Query(3, 6)\n    fmt.Printf(\"%v\\n\", r)\n}\n\n```\n\n### Benchmark\n\n- 1,000 elements\n\n```\ngo test -benchmem -bench '^Benchmark' ./benchmark/\ngoos: windows\ngoarch: amd64\npkg: github.com/lxzan/dao/benchmark\ncpu: AMD Ryzen 5 PRO 4650G with Radeon Graphics\nBenchmarkDict_Set-12                        8647            124.1 ns/op           48190 B/op       1003 allocs/op\nBenchmarkDict_Get-12                        9609            122.0 ns/op           48000 B/op       1000 allocs/op\nBenchmarkDict_Match-12                      3270            349.3 ns/op           48000 B/op       1000 allocs/op\nBenchmarkHeap_Push_Binary-12               55809             21.0 ns/op           38912 B/op          3 allocs/op\nBenchmarkHeap_Push_Quadratic-12            65932             18.0 ns/op           38912 B/op          3 allocs/op\nBenchmarkHeap_Push_Octal-12                71005             16.1 ns/op           38912 B/op          3 allocs/op\nBenchmarkHeap_Pop_Binary-12                10000            100.1 ns/op           16384 B/op          1 allocs/op\nBenchmarkHeap_Pop_Quadratic-12             10000            100.7 ns/op           16384 B/op          1 allocs/op\nBenchmarkHeap_Pop_Octal-12                  9681            124.9 ns/op           16384 B/op          1 allocs/op\nBenchmarkStdList_Push-12                   24715             48.7 ns/op           54000 B/op       1745 allocs/op\nBenchmarkStdList_PushAndPop-12             22006             54.7 ns/op           54000 B/op       1745 allocs/op\nBenchmarkLinkedList_Push-12                38464             31.7 ns/op           24000 B/op       1000 allocs/op\nBenchmarkLinkedList_PushAndPop-12          36898             32.6 ns/op           24000 B/op       1000 allocs/op\nBenchmarkDeque_Push-12                    100468             11.7 ns/op           24576 B/op          1 allocs/op\nBenchmarkDeque_PushAndPop-12               51649             21.7 ns/op           37496 B/op         12 allocs/op\nBenchmarkRBTree_Set-12                      9999            113.9 ns/op           72048 B/op       2001 allocs/op\nBenchmarkRBTree_Get-12                     51806             22.7 ns/op               0 B/op          0 allocs/op\nBenchmarkRBTree_FindAll-12                  2808            421.3 ns/op          288001 B/op       5000 allocs/op\nBenchmarkRBTree_FindAOne-12                 4722            252.2 ns/op           56000 B/op       5000 allocs/op\nBenchmarkSegmentTree_Query-12               7498            164.4 ns/op              20 B/op          0 allocs/op\nBenchmarkSegmentTree_Update-12             10000            108.6 ns/op              15 B/op          0 allocs/op\nBenchmarkSort_Quick-12                     24488             48.5 ns/op               0 B/op          0 allocs/op\nBenchmarkSort_Std-12                       21703             54.9 ns/op            8216 B/op          2 allocs/op\nPASS\nok      github.com/lxzan/dao/benchmark  31.100s\n```\n\n- 1,000,000 elements\n\n```\ngo test -benchmem -bench '^Benchmark' ./benchmark/\ngoos: windows\ngoarch: amd64\npkg: github.com/lxzan/dao/benchmark\ncpu: AMD Ryzen 5 PRO 4650G with Radeon Graphics\nBenchmarkDict_Set-12                           1        2295.2 ns/op        1405087408 B/op 24868109 allocs/op\nBenchmarkDict_Get-12                           2         784.0 ns/op        48000000 B/op    1000000 allocs/op\nBenchmarkDict_Match-12                         2         961.0 ns/op        48000000 B/op    1000000 allocs/op\nBenchmarkHeap_Push_Binary-12                  48          24.8 ns/op        65708034 B/op          5 allocs/op\nBenchmarkHeap_Push_Quadratic-12               58          19.4 ns/op        65708033 B/op          5 allocs/op\nBenchmarkHeap_Push_Octal-12                   69          17.1 ns/op        65708033 B/op          5 allocs/op\nBenchmarkHeap_Pop_Binary-12                    3         376.3 ns/op        16007168 B/op          1 allocs/op\nBenchmarkHeap_Pop_Quadratic-12                 3         342.8 ns/op        16007168 B/op          1 allocs/op\nBenchmarkHeap_Pop_Octal-12                     3         374.8 ns/op        16007168 B/op          1 allocs/op\nBenchmarkStdList_Push-12                      21          55.0 ns/op        55998007 B/op    1999745 allocs/op\nBenchmarkStdList_PushAndPop-12                15          67.5 ns/op        55998008 B/op    1999745 allocs/op\nBenchmarkLinkedList_Push-12                   43          29.5 ns/op        24000000 B/op    1000000 allocs/op\nBenchmarkLinkedList_PushAndPop-12             39          34.7 ns/op        24000002 B/op    1000000 allocs/op\nBenchmarkDeque_Push-12                       123           9.4 ns/op        24002560 B/op          1 allocs/op\nBenchmarkDeque_PushAndPop-12                  60          18.7 ns/op        45098876 B/op         37 allocs/op\nBenchmarkRBTree_Set-12                         6         171.9 ns/op        72000064 B/op    2000001 allocs/op\nBenchmarkRBTree_Get-12                        22          50.1 ns/op               0 B/op          0 allocs/op\nBenchmarkRBTree_FindAll-12                     1        1936.8 ns/op        288000128 B/op   5000001 allocs/op\nBenchmarkRBTree_FindAOne-12                    1        1793.4 ns/op        56000000 B/op    5000000 allocs/op\nBenchmarkSegmentTree_Query-12                  1        1630.0 ns/op        169678048 B/op   2000038 allocs/op\nBenchmarkSegmentTree_Update-12                 1        1025.0 ns/op        169678048 B/op   2000038 allocs/op\nBenchmarkSort_Quick-12                        10         109.5 ns/op         8003584 B/op          1 allocs/op\nBenchmarkSort_Std-12                           9         123.0 ns/op         8003608 B/op          2 allocs/op\nPASS\nok      github.com/lxzan/dao/benchmark  47.376s\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flxzan%2Fdao","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flxzan%2Fdao","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flxzan%2Fdao/lists"}