Skip to content

Commit

Permalink
fuck
Browse files Browse the repository at this point in the history
  • Loading branch information
hunterhug committed Dec 18, 2019
1 parent 862a30b commit 431a6ee
Show file tree
Hide file tree
Showing 4 changed files with 425 additions and 20 deletions.
8 changes: 5 additions & 3 deletions algorithm/dict.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
"d"=>2
```

我们拿出键 `a` 的值,就是 `1` 了。`Golang` 提供了这一数据结构字典`map`
我们拿出键 `a` 的值,就是 `1` 了。`Golang` 提供了这一数据结构`map`

```go

Expand All @@ -24,6 +24,8 @@ v, ok = f["ff"]
fmt.Println(v, ok)
```

它的实现,主要在于查找算法,如何查找到键,一旦键找到了,值也就找到了
字典的实现有两种方式:哈希表 `HashTable` 和红黑树 `RBTree`

字典的实现有两种方式:哈希表和树,具体可继续阅读《查找算法》章节:散列查找和红黑树相关内容。
`Golang` 语言中字典 `map` 的实现由哈希表实现,具体可查看标准库 `runtime` 下的 `map.go` 文件。

我们会在《查找算法》章节:散列查找和红黑树具体分析字典的两种实现方式。
130 changes: 128 additions & 2 deletions algorithm/example/main.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package main

import "fmt"
import (
"fmt"
"sync"
)

type LinkNode struct {
Data int64
Expand All @@ -25,11 +28,134 @@ func main() {
}
}

array := make([]int64, 5)
array := [5]int64{}
fmt.Println(array)
array[0] = 8
array[1] = 9
array [2] = 7
fmt.Println(array)
fmt.Println(array[2])

ArrayLink()

SetTest()
}

func ArrayLink() {
type Value struct {
Data string
NextIndex int64
}

var array [5]Value // 五个节点的数组
array[0] = Value{"I", 3} // 下一个节点的下标为3
array[1] = Value{"Army", 4} // 下一个节点的下标为4
array[2] = Value{"You", 1} // 下一个节点的下标为1
array[3] = Value{"Love", 2} // 下一个节点的下标为2
array[4] = Value{"!", -1} // -1表示没有下一个节点
node := array[0]
for {
fmt.Println(node.Data)
if node.NextIndex == -1 {
break
}
node = array[node.NextIndex]
}

}

// 集合结构体
type Set struct {
m map[int]bool // 用字典来实现,因为字段键不能重复
len int // 集合的大小
sync.RWMutex // 锁,实现并发安全
}

// 新建一个空集合
func New() *Set {
return &Set{
m: map[int]bool{},
}
}

// 增加一个元素
func (s *Set) Add(item int) {
s.Lock()
defer s.Unlock()
s.m[item] = true // 实际往字典添加这个键
s.len = s.len + 1 // 集合大小增加
}

// 移除一个元素
func (s *Set) Remove(item int) {
s.Lock()
s.Unlock()
delete(s.m, item) // 实际从字典删除这个键
s.len = s.len - 1 // 集合大小减少
}

// 查看是否存在元素
func (s *Set) Has(item int) bool {
s.RLock()
defer s.RUnlock()
_, ok := s.m[item]
return ok
}

// 查看集合大小
func (s *Set) Len() int {
return s.len
}

// 清除集合所有元素
func (s *Set) Clear() {
s.Lock()
defer s.Unlock()
s.m = map[int]bool{} // 字典置空
s.len = 0 // 大小归零
}

// 集合是够为空
func (s *Set) IsEmpty() bool {
if s.Len() == 0 {
return true
}
return false
}

// 将集合转化为列表
func (s *Set) List() []int {
s.RLock()
defer s.RUnlock()
list := make([]int, 0, s.len)
for item := range s.m {
list = append(list, item)
}
return list
}

func SetTest() {
// 初始化
s := New()

s.Add(1)
s.Add(1)
s.Add(2)

s.Clear()
if s.IsEmpty() {
fmt.Println("empty")
}

s.Add(1)
s.Add(2)
s.Add(3)

if s.Has(2) {
fmt.Println("2 does exist")
}

s.Remove(2)
s.Remove(3)
fmt.Println("list of all items", s.List())
}
Loading

0 comments on commit 431a6ee

Please sign in to comment.