Compare commits

..

No commits in common. "master" and "v0.1" have entirely different histories.
master ... v0.1

9 changed files with 37 additions and 369 deletions

34
app.go
View File

@ -1,6 +1,6 @@
/* /*
* @Author: NorthCity1984 * @Author: NorthCity1984
* @LastEditTime: 2022-05-03 18:51:46 * @LastEditTime: 2022-04-02 13:19:42
* @Description: * @Description:
* @Website: https://grimoire.cn * @Website: https://grimoire.cn
* Copyright (c) NorthCity1984 All rights reserved. * Copyright (c) NorthCity1984 All rights reserved.
@ -10,18 +10,28 @@ package main
import ( import (
"fmt" "fmt"
"gitee.com/NorthCityChen/stl-go/math" "gitee.com/NorthCityChen/stl-go/dequeue"
) )
var a = []int{1, 2, 65, 4, 33, 5}
func main() { func main() {
// h := heap.Init(a, heap.MinHeap[int]()) q := dequeue.Init[int]()
// fmt.Println(h) q.LPush(12)
q.LPush(23)
ans := math.C(8, 2) q.LPush(34)
fmt.Println(ans) q.Clear()
q.LPush(34)
ans = math.A(12, 2) q.RPush(44)
fmt.Println(ans) fmt.Println(q.LPop())
fmt.Println(q.LPop())
fmt.Println(q.LPop())
fmt.Println(q.LPop())
// q := queue.Init[int]()
// q.Push(12)
// q.Push(23)
// q.Push(44)
// // q.IsEmpty()
// fmt.Println(q.Pop())
// fmt.Println(q.Pop())
// fmt.Println(q.Pop())
// fmt.Println(q.Pop())
} }

View File

@ -1,55 +0,0 @@
/*
* @Author: NorthCity1984
* @LastEditTime: 2022-04-26 17:08:18
* @Description: Binary Indexed Trees
* @Website: https://grimoire.cn
* Copyright (c) NorthCity1984 All rights reserved.
*/
package bit
type Number interface {
int | int64 | float32 | float64
}
type bit[T Number] struct {
array []T
brray []T
len int
}
func lowbit(x int) int {
return x & -x
}
// 初始化一个树状数组
func Init[T Number](array []T) bit[T] {
ret := bit[T]{
array: append([]T{0}, array...),
brray: make([]T, len(array)+5),
len: len(array),
}
for i := 1; i < len(ret.array); i++ {
ret.Add(i, ret.array[i])
}
return ret
}
// 在第x个数的位置+k
func (b *bit[T]) Add(x int, k T) {
for x <= b.len {
b.brray[x] = b.brray[x] + k
x = x + lowbit(x) // 父节点
}
}
// 求第一个数到第x个数的和
func (b *bit[T]) Ask(x int) T {
var ans T = 0
for x >= 1 {
ans = ans + b.brray[x]
x = x - lowbit(x)
}
return ans
}

View File

@ -1,6 +1,6 @@
/* /*
* @Author: NorthCity1984 * @Author: NorthCity1984
* @LastEditTime: 2022-04-27 13:31:14 * @LastEditTime: 2022-04-02 12:39:15
* @Description: * @Description:
* @Website: https://grimoire.cn * @Website: https://grimoire.cn
* Copyright (c) NorthCity1984 All rights reserved. * Copyright (c) NorthCity1984 All rights reserved.
@ -8,7 +8,7 @@
package dequeue package dequeue
type Number interface { type Number interface {
int | int64 | float32 | float64 | string int | int64 | float32 | float64
} }
// dequeue: Based on Double Linked List // dequeue: Based on Double Linked List
@ -24,9 +24,6 @@ type dequeueNode[T Number] struct {
RPointer *dequeueNode[T] RPointer *dequeueNode[T]
} }
// 返回对应类型的零值 对比 T(Rune(0))在获取空字符串的情况下快14倍左右
func zeroValue[T Number]() (value T) { return }
func Init[T Number]() *Dequeue[T] { func Init[T Number]() *Dequeue[T] {
return &Dequeue[T]{size: 0, leftHead: new(dequeueNode[T]), rightHead: new(dequeueNode[T])} return &Dequeue[T]{size: 0, leftHead: new(dequeueNode[T]), rightHead: new(dequeueNode[T])}
} }
@ -53,7 +50,7 @@ func (q *Dequeue[T]) LPush(val T) bool {
func (q *Dequeue[T]) LPop() (T, bool) { func (q *Dequeue[T]) LPop() (T, bool) {
if q.IsEmpty() { if q.IsEmpty() {
return zeroValue[T](), false return 0, false
} }
val := q.leftHead.Val val := q.leftHead.Val
q.leftHead = q.leftHead.RPointer q.leftHead = q.leftHead.RPointer
@ -75,7 +72,7 @@ func (q *Dequeue[T]) RPush(val T) bool {
func (q *Dequeue[T]) RPop() (T, bool) { func (q *Dequeue[T]) RPop() (T, bool) {
if q.IsEmpty() { if q.IsEmpty() {
return zeroValue[T](), false return 0, false
} }
val := q.rightHead.Val val := q.rightHead.Val
q.rightHead = q.rightHead.LPointer q.rightHead = q.rightHead.LPointer
@ -85,14 +82,14 @@ func (q *Dequeue[T]) RPop() (T, bool) {
func (q *Dequeue[T]) LNode() (T, bool) { func (q *Dequeue[T]) LNode() (T, bool) {
if q.IsEmpty() { if q.IsEmpty() {
return zeroValue[T](), false return 0, false
} }
return q.leftHead.Val, true return q.leftHead.Val, true
} }
func (q *Dequeue[T]) RNode() (T, bool) { func (q *Dequeue[T]) RNode() (T, bool) {
if q.IsEmpty() { if q.IsEmpty() {
return zeroValue[T](), false return 0, false
} }
return q.rightHead.Val, true return q.rightHead.Val, true
} }

View File

@ -1,50 +0,0 @@
/*
* @Author: NorthCity1984
* @LastEditTime: 2022-04-27 13:36:25
* @Description:
* @Website: https://grimoire.cn
* Copyright (c) NorthCity1984 All rights reserved.
*/
package dequeue
import (
"testing"
// "gitee.com/NorthCityChen/stl-go/dequeue"
)
// type Number interface {
// int | int64 | float32 | float64 | string
// }
// func zeroValue[T Number]() (value T) { return }
func TRune[T Number]() T { return T(rune(0)) }
func BenchmarkZeroValue(b *testing.B) {
for i := 0; i < b.N; i++ {
zeroValue[float64]()
zeroValue[float32]()
zeroValue[int]()
zeroValue[int64]()
zeroValue[string]()
}
}
func BenchmarkTRune(b *testing.B) {
for i := 0; i < b.N; i++ {
TRune[float64]()
TRune[float32]()
TRune[int64]()
TRune[int]()
TRune[string]()
}
}
func BenchmarkRunDequeue(b *testing.B) {
dq := Init[int]()
for i := 0; i < b.N; i++ {
dq.LPush(1)
dq.RPush(2)
dq.LPop()
dq.RPop()
}
}

View File

@ -1,90 +0,0 @@
/*
* @Author: NorthCity1984
* @LastEditTime: 2022-04-27 13:19:36
* @Description:
* @Website: https://grimoire.cn
* Copyright (c) NorthCity1984 All rights reserved.
*/
package heap
type Number interface {
int | int64 | float32 | float64
}
type heap[T Number] struct {
array []T
len int
cmp func(T, T) bool
}
// 返回对应类型的零值
func zeroValue[T Number]() (value T) { return }
func (h *heap[T]) up(x int) {
for x > 1 && h.cmp(h.array[x], h.array[x/2]) {
h.array[x], h.array[x/2] = h.array[x/2], h.array[x]
x /= 2
}
}
func (h *heap[T]) down(x int) {
for x*2 <= h.len {
t := x * 2
if t+1 <= h.len && h.cmp(h.array[t+1], h.array[t]) {
t++
}
if !h.cmp(h.array[t], h.array[x]) {
break
}
h.array[x], h.array[t] = h.array[t], h.array[x]
x = t
}
}
func (h *heap[T]) Push(v T) {
h.array = append(h.array, v)
h.len++
h.up(h.len)
}
func (h *heap[T]) Pop() T {
if h.len == 0 {
return zeroValue[T]()
}
ret := h.array[1]
h.array[1], h.array[h.len] = h.array[h.len], h.array[1]
h.array = h.array[:h.len]
h.len--
h.down(1)
return ret
}
func (h *heap[T]) Top() T {
return h.array[1]
}
func Init[T Number](array []T, cmp func(T, T) bool) heap[T] {
newArray := make([]T, len(array)+1)
copy(newArray[1:], array)
h := heap[T]{
array: newArray,
len: len(array),
cmp: cmp,
}
for i := h.len; i >= 1; i-- {
h.down(i)
}
return h
}
func MaxHeap[T Number]() func(T, T) bool {
return func(t1, t2 T) bool {
return t1 > t2
}
}
func MinHeap[T Number]() func(T, T) bool {
return func(t1, t2 T) bool {
return t1 < t2
}
}

View File

@ -1,6 +1,6 @@
/* /*
* @Author: NorthCity1984 * @Author: NorthCity1984
* @LastEditTime: 2022-05-03 18:50:22 * @LastEditTime: 2022-04-01 21:04:53
* @Description: * @Description:
* @Website: https://grimoire.cn * @Website: https://grimoire.cn
* Copyright (c) NorthCity1984 All rights reserved. * Copyright (c) NorthCity1984 All rights reserved.
@ -13,7 +13,10 @@ type Number interface {
int | int32 | int64 | float32 | float64 int | int32 | int64 | float32 | float64
} }
// 返回n个数中的最小值 func Inf[T Number]() T {
return T(math.Inf(1))
}
func Max[T Number](arg T, args ...T) T { func Max[T Number](arg T, args ...T) T {
var maxNum T = arg var maxNum T = arg
@ -25,7 +28,6 @@ func Max[T Number](arg T, args ...T) T {
return maxNum return maxNum
} }
// 返回n个数中的最大值
func Min[T Number](arg T, args ...T) T { func Min[T Number](arg T, args ...T) T {
var minNum T = arg var minNum T = arg
for _, val := range args { for _, val := range args {
@ -36,7 +38,6 @@ func Min[T Number](arg T, args ...T) T {
return minNum return minNum
} }
// 返回n个数的和
func Sum[T Number](args ...T) (sum T) { func Sum[T Number](args ...T) (sum T) {
for _, val := range args { for _, val := range args {
sum += val sum += val
@ -44,7 +45,6 @@ func Sum[T Number](args ...T) (sum T) {
return sum return sum
} }
// 返回num的绝对值
func Abs[T Number](num T) T { func Abs[T Number](num T) T {
if num < 0 { if num < 0 {
num *= -1 num *= -1
@ -52,46 +52,4 @@ func Abs[T Number](num T) T {
return num return num
} }
// 返回 2**n // sort
func Exp2(num int) int64 {
var ans int64 = 1
for i := 0; i < num; i++ {
ans <<= 1
}
return ans
}
// 返回x的平方根精度比原生略低
func Sqrt(x float64) float64 {
if x < 0 {
return math.NaN()
}
if x == 0 {
return 0
}
last, res := 0.0, 1.0
for last != res {
last = res
res = (res + x/res) / 2
}
return res
}
// 排列数: A(3,1)=3
func A(n, m int) int {
res := 1
for i := m; i >= 1; i-- {
res *= n //n × n-1 × n-2 × ... n-mm就是需要减1的次数
n--
}
return res
}
// 组合数C(3, 2)=3
func C(n, m int) int {
if m == 0 {
return 1
}
return C(n-1, m-1) * (n / m)
}

View File

@ -1,40 +0,0 @@
/*
* @Author: NorthCity1984
* @LastEditTime: 2022-04-04 19:11:44
* @Description:
* @Website: https://grimoire.cn
* Copyright (c) NorthCity1984 All rights reserved.
*/
package random
import (
"math/rand"
"strings"
"time"
)
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
const (
letterIdxBits = 6 // 6 bits to represent a letter index
letterIdxMask = 1<<letterIdxBits - 1 // All 1-bits, as many as letterIdxBits
letterIdxMax = 63 / letterIdxBits // # of letter indices fitting in 63 bits
)
var src = rand.NewSource(time.Now().UnixNano())
func RandStr(strLen int) string {
str := strings.Builder{}
str.Grow(strLen)
for i, cache, remain := strLen-1, src.Int63(), letterIdxMax; i >= 0; {
if remain == 0 {
cache, remain = src.Int63(), letterIdxMax
}
if idx := int(cache & letterIdxMask); idx < len(letterBytes) {
str.WriteByte(letterBytes[idx])
i--
}
cache >>= letterIdxBits
remain--
}
return str.String()
}

View File

@ -1,72 +1,10 @@
<!-- <!--
* @Author: NorthCity1984 * @Author: NorthCity1984
* @LastEditTime: 2022-04-02 14:30:28 * @LastEditTime: 2022-04-01 13:22:46
* @Description: * @Description:
* @Website: https://grimoire.cn * @Website: https://grimoire.cn
* Copyright (c) NorthCity1984 All rights reserved. * Copyright (c) NorthCity1984 All rights reserved.
--> -->
# stl-go # stl-go
一个封装了一些简单的数据结构的提供泛型支持的stl库 (go >= 1.18) 一些常用的数据结构模板
# usage
## Dequeue
```go
package main
import (
"fmt"
"gitee.com/NorthCityChen/stl-go/dequeue"
)
func main() {
q := dequeue.Init[int]()
q.LPush(12)
q.LPush(23)
q.LPush(34)
q.Clear()
q.LPush(34)
q.RPush(44)
fmt.Println(q.LPop())
fmt.Println(q.LPop())
fmt.Println(q.LPop())
fmt.Println(q.LPop())
}
```
## Queue
```go
import (
"fmt"
"gitee.com/NorthCityChen/stl-go/queue"
)
func main() {
q := queue.Init[int]()
q.Push(12)
q.Push(23)
q.Push(44)
fmt.Println(q.Pop())
fmt.Println(q.Pop())
fmt.Println(q.Pop())
fmt.Println(q.Pop())
}
```
# RoadMap
- [x] 双端队列
- [x] 队列
- [x] 栈
- [x] 数学
- [ ] 优先队列
- [ ] 红黑树
- [ ] 集合
- [ ] 二分查找
- [ ] 下一个排序组合

View File

@ -1,6 +1,6 @@
/* /*
* @Author: NorthCity1984 * @Author: NorthCity1984
* @LastEditTime: 2022-04-13 21:41:20 * @LastEditTime: 2022-04-02 13:19:33
* @Description: * @Description:
* @Website: https://grimoire.cn * @Website: https://grimoire.cn
* Copyright (c) NorthCity1984 All rights reserved. * Copyright (c) NorthCity1984 All rights reserved.