Skip to content

Commit

Permalink
rush
Browse files Browse the repository at this point in the history
  • Loading branch information
hunterhug committed Dec 19, 2019
1 parent 448e664 commit 631a452
Show file tree
Hide file tree
Showing 38 changed files with 1,550 additions and 746 deletions.
3 changes: 2 additions & 1 deletion .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@
_book/
node_modules/
package-lock.json
*.go
*.go
/code
8 changes: 6 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,26 @@
# 算法分析:Golang实现
# 数据结构和算法:Golang实现

## 前言

数据结构和算法在计算机科学里,有非常重要的地位。此仓库尝试使用 `Golang` 编程语言来实现各种数据结构和算法,并且适当进行算法分析。

中文版为该仓库,英文版请见分支 `en`仓库地址见:[https://github.com/hunterhug/goa](https://github.com/hunterhug/goa**)
仓库地址见:[https://github.com/hunterhug/goa](https://github.com/hunterhug/goa**)

正在努力完善中,请不要 `fork`,请 `star`

## 目录

* [目录](README.md)
* [前言](basic/before.md)
* [一小时入门Golang](golang/README.md)
* [基础知识](basic/README.md)
* [分治法和递归](basic/rescuvie.md)
* [算法复杂度及渐进符号](basic/dregee.md)
* [算法复杂度主方法](basic/master_method.md)
* [延伸-计算理论:P和NP问题](basic/p.md)
* [常见数据结构及算法](algorithm/README.md)
* [链表](algorithm/link.md)
* [可变长数组](algorithm/array_change.md)
* [字典](algorithm/dict.md)
* [栈和队列](algorithm/stack_queues.md)
* [排序算法](algorithm/sort.md)
Expand Down
3 changes: 3 additions & 0 deletions SUMMARY.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
# Summary

* [目录](README.md)
* [前言](basic/before.md)
* [一小时入门Golang](golang/README.md)
* [基础知识](basic/README.md)
* [分治法和递归](basic/rescuvie.md)
* [算法复杂度及渐进符号](basic/dregee.md)
* [算法复杂度主方法](basic/master_method.md)
* [延伸-计算理论:P和NP问题](basic/p.md)
* [常见数据结构及算法](algorithm/README.md)
* [链表](algorithm/link.md)
* [可变长数组](algorithm/array_change.md)
* [字典](algorithm/dict.md)
* [栈和队列](algorithm/stack_queues.md)
* [排序算法](algorithm/sort.md)
Expand Down
78 changes: 78 additions & 0 deletions algorithm/array_change.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
# 可变长数组

因为数组大小是固定的,当数据元素特别多时,固定的数组无法储存这么多的值,所以可变长数组出现了,这也是一种数据结构。在 `Golang `语言中,可变长数组被内置在语言里面:切片 `slice`

`slice` 是对底层数组的抽象和控制。它是一个结构体:

````go
type slice struct {
array unsafe.Pointer
len int
cap int
}
````

1. 指向底层数组的指针。( `Golang` 语言是没有指针的数据类型,所以 `unsafe` 包提供相关的对内存指针的操作,一般情况下非专业人员勿用)
2. 切片的真正长度,也就是实际元素占用的大小。
3. 切片的容量,底层固定数组的长度。

每次可以初始化一个固定容量的切片,切片内部维护一个固定大小的数组。当 `append` 新元素时,固定大小的数组不够时会自动扩容,如:

```go
package main

import "fmt"

func main() {
// 创建一个容量为2的切片
array := make([]int, 0, 2)
fmt.Println("cap", cap(array), "len", len(array), "array:", array)

// 虽然 append 但是没有赋予原来的变量 array
_ = append(array, 1)
fmt.Println("cap", cap(array), "len", len(array), "array:", array)
_ = append(array, 1)
fmt.Println("cap", cap(array), "len", len(array), "array:", array)
_ = append(array, 1)
fmt.Println("cap", cap(array), "len", len(array), "array:", array)

fmt.Println("-------")

// 赋予回原来的变量
array = append(array, 1)
fmt.Println("cap", cap(array), "len", len(array), "array:", array)
array = append(array, 1)
fmt.Println("cap", cap(array), "len", len(array), "array:", array)
array = append(array, 1)
fmt.Println("cap", cap(array), "len", len(array), "array:", array)
array = append(array, 1,1,1,1)
fmt.Println("cap", cap(array), "len", len(array), "array:", array)
array = append(array, 1,1,1,1,1,1,1,1,1)
fmt.Println("cap", cap(array), "len", len(array), "array:", array)
}
```

输出:

```go
cap 2 len 0 array: []
cap 2 len 0 array: []
cap 2 len 0 array: []
cap 2 len 0 array: []
-------
cap 2 len 1 array: [1]
cap 2 len 2 array: [1 1]
cap 4 len 3 array: [1 1 1]
cap 8 len 7 array: [1 1 1 1 1 1 1]
cap 16 len 16 array: [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
```

我们可以看到 `Golang` 的切片无法原地 `append`,每次添加元素时返回新的引用地址,必须把该引用重新赋予之前的切片变量。并且,当容量不够时,会自动倍数递增扩容。

具体可查看标准库 `runtime` 下的 `slice.go` 文件。

## 一、实现可变长数组

我们来实现一个简单的可变长数组版本。

首先初始化一个切片时:
Loading

0 comments on commit 631a452

Please sign in to comment.