Skip to content

Commit 3771b3f

Browse files
committed
整理: 整理readme && 文件结构
Change-Id: Ib69836e77756e97cb37462ad6d38ba4a1e57ee80
1 parent 78f800e commit 3771b3f

File tree

5 files changed

+85
-98
lines changed

5 files changed

+85
-98
lines changed

README.md

+26-49
Original file line numberDiff line numberDiff line change
@@ -40,89 +40,66 @@ golang源码的双向链表实现(代码在container/list/)亮点:
4040
2. 节点元素与链表分开两种数据结构
4141

4242

43-
#### [线性表:数组与链表、队列与栈](/md/数组与链表,堆栈与队列.md)
44-
45-
介绍了基本数据结构之线性表的特点和原理以及js的算法实现。
46-
由于js语言本身的特点,线性表在js中主要以数组的应用为主,而js数组本身也并不是传统意义上的连续线性表。
47-
48-
#### [哈希表:js对象与哈希表](/md/js对象与哈希表.md)
49-
50-
js对象大家都用的很多,但其底层的哈希表特性你是否清楚?
51-
在这篇文章里,小茄会用最平白易懂的语言来讲哈希结构的原理、构造方法,当然,还有哈希表在js中的应用。
52-
53-
#### [树:js中的树与二叉树](/md/js中的树.md)
54-
55-
树是一种带有层次的数据结构,分层特性可以用于实现数据存储和快速查找。
56-
比较常见的应用场景就是各种目录结构,如文件目录、DOM结构等,由于每指定一层就是一层筛选,所以可以用于快速查找。
57-
js中可以通过对象的哈希结构来实现树结构,两种数据结构结合,速度更快。
58-
5943
## 算法部分
6044

6145
> ***做任何算法的时候,都要先弄清需求!如果是需要构造一个函数,那一定要弄清楚函数的调用方式、各参数的含义,多举几个例子说明。只有弄懂了这个函数应该是怎样的,才有可能写出符合要求的函数***
6246
63-
- [数组相关](#array)
64-
47+
- [LeetCode](#LeetCode)
48+
- [设计模式](#design)
6549
- [排序相关](#sort)
66-
6750
- [递归相关](#recursive)
68-
51+
- [数组相关](#array)
6952
- [其他](#other)
7053

71-
- [leetcode (golang)] (#leetcode)
54+
### [LeetCode](/go/leetcode)
7255

73-
### Array [array.js](/js/array.js)
56+
LeetCode解题(golang)
7457

75-
- indexOfArray:数组子串位置查询
76-
77-
- arrayFilter:数组筛选
78-
79-
- arrayUnique: 数组去重
58+
### [design](/go/basic)
8059

81-
- combineArray: 数组归并排序
60+
- [并发安全单例实现](/go/basic/concurrency/singleton.go)
61+
- [once实现](/go/basic/concurrency/once.go)
62+
- [两个线程交替输出](/go/basic/concurrency/alternate.go)
8263

83-
- longestSubArray: 数组最长无重复子串查找
64+
### [sort](/go/basic/sort)
8465

85-
- longestSubArrayHash: 利用哈希表去重的数组最长无重复子串查找
86-
87-
### sort [sort.js](/js/sort.js)
66+
golang实现:
67+
- [bubbleSort:冒泡排序](/go/basic/sort/sort.go#L5)
68+
- [selectSort:选择排序](/go/basic/sort/sort.go#L21)
69+
- [quickSort:快速排序](/go/basic/sort/sort.go#L39)
70+
- [quickSort:原地快速排序](/go/basic/sort/sort.go#L61)
8871

72+
js实现:
8973
- [bubbleSort:冒泡排序](/js/sort.js#L20)
90-
9174
- [selectSort:选择排序](/js/sort.js#L36)
92-
9375
- [straightInsertionSort: 直接插入排序](/js/sort.js#L52)
94-
9576
- [shellSort:希尔排序](/js/sort.js#L72)
96-
9777
- [quickSort:快速排序](/js/sort.js#L101)
98-
9978
- [inPlaceQuickSort:原地快速排序](/js/sort.js#L127)
100-
10179
- [mergeSort:归并排序](/js/sort.js#L159)
102-
10380
- [heapSort:堆排序](/js/sort.js#L192)
10481

105-
### recursive[recursive.js](/md/递归.md)
82+
### recursive [recursive.js](/md/递归.md)
10683

10784
- [阶梯问题](/js/recursive.js#L10)
108-
10985
- [链式函数](/js/recursive.js#L36)
110-
11186
- [汉诺塔问题](/js/recursive.js#L47)
11287

88+
### [Array](/js/array.js)
89+
90+
- indexOfArray:数组子串位置查询
91+
- arrayFilter:数组筛选
92+
- arrayUnique: 数组去重
93+
- combineArray: 数组归并排序
94+
- longestSubArray: 数组最长无重复子串查找
95+
- longestSubArrayHash: 利用哈希表去重的数组最长无重复子串查找
96+
11397
### other
11498

11599
- [订阅发布者事件模型](/js/event.js)
116-
117100
- [节流函数](/js/others.js#L7)
118-
119101
- [防抖函数](/js/others.js#L21)
120102

121-
### leetcode
122-
123-
LeetCode的golang解题:[leetcode](/go/leetcode)
124-
125-
126103

127104

128105

go/basic/concurrency/concurrency.go renamed to go/basic/concurrency/alternate.go

-27
Original file line numberDiff line numberDiff line change
@@ -8,33 +8,6 @@ import (
88
"time"
99
)
1010

11-
// sync底层使用锁和原子自增实现once效果
12-
type Once struct {
13-
mu sync.Mutex
14-
count int32
15-
}
16-
17-
// 提供一个do方法
18-
func (o *Once) Do(f func()) {
19-
// 使用cas限制第一次也OK?
20-
// 不ok,因为两个g同时进来的时候,其中一个没有执行f,另外一个执行了f,两个g后面取到的值是有差异的,一致性不满足
21-
// 而采用源码的方式,在抢互斥锁的时候另外一个线程堵塞,保证后续运行时都是在f执行后的状态
22-
// if atomic.CompareAndSwapInt32(&o.count, 0, 1) {
23-
// f()
24-
// }
25-
26-
// 源码实现,先原子取数,然后再抢锁,抢到之后判断是否执行过f,若未执行则调用f,然后再原子+1
27-
if atomic.LoadInt32(&o.count) == 1 {
28-
return
29-
}
30-
o.mu.Lock()
31-
if o.count == 0 {
32-
f()
33-
atomic.StoreInt32(&o.count, 1)
34-
}
35-
o.mu.Unlock()
36-
}
37-
3811
/*
3912
多线程交替输出:
4013
新开两个子线程,分别输出1,3,5,7,9...和2,4,6,8,10...,主线程接受子线程的值,输出1,2,3,4,5...

go/basic/concurrency/concurrency_test.go

-22
Original file line numberDiff line numberDiff line change
@@ -4,32 +4,10 @@ import (
44
"fmt"
55
"runtime"
66

7-
"sync"
87
"testing"
98
"time"
109
)
1110

12-
type Single struct {
13-
Value int32
14-
}
15-
16-
var i int32
17-
var s *Single
18-
19-
var _ = new(sync.Once)
20-
var once = new(Once)
21-
22-
// 获取全局单例
23-
func GetGlobalSingle() *Single {
24-
once.Do(func() {
25-
s = &Single{
26-
Value: i,
27-
}
28-
i++ // 方便检查是否单例
29-
})
30-
return s
31-
}
32-
3311
func TestGlobalSingle(t *testing.T) {
3412
n := runtime.NumCPU()
3513
fmt.Println("cup num=", n)

go/basic/concurrency/once.go

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package concurrency
2+
3+
import (
4+
"sync"
5+
"sync/atomic"
6+
)
7+
8+
// Once sync底层使用锁和原子自增实现once效果
9+
type Once struct {
10+
mu sync.Mutex
11+
count int32
12+
}
13+
14+
// Do 提供一个do方法
15+
func (o *Once) Do(f func()) {
16+
// 使用cas限制第一次也OK?
17+
// 不ok,因为两个g同时进来的时候,其中一个没有执行f,另外一个执行了f,两个g后面取到的值是有差异的,一致性不满足
18+
// 而采用源码的方式,在抢互斥锁的时候另外一个线程堵塞,保证后续运行时都是在f执行后的状态
19+
// if atomic.CompareAndSwapInt32(&o.count, 0, 1) {
20+
// f()
21+
// }
22+
23+
// 源码实现,先原子取数,然后再抢锁,抢到之后判断是否执行过f,若未执行则调用f,然后再原子+1
24+
if atomic.LoadInt32(&o.count) == 1 {
25+
return
26+
}
27+
o.mu.Lock()
28+
if o.count == 0 {
29+
f()
30+
atomic.StoreInt32(&o.count, 1)
31+
}
32+
o.mu.Unlock()
33+
}

go/basic/concurrency/singleton.go

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package concurrency
2+
3+
import (
4+
"sync"
5+
"time"
6+
)
7+
8+
// Singleton 单例
9+
type Singleton struct {
10+
Value int64
11+
}
12+
13+
var s *Singleton
14+
15+
var _ = new(sync.Once)
16+
var once = new(Once)
17+
18+
// GetGlobalSingle 使用once来实现全局单例
19+
func GetGlobalSingle() *Singleton {
20+
once.Do(func() {
21+
s = &Singleton{
22+
Value: time.Now().Unix(),
23+
}
24+
})
25+
return s
26+
}

0 commit comments

Comments
 (0)