 Hello 算法 1.2.0 繁体中文 Go 版你邁入資料結構與演算法的知識殿堂。 1.2 演算法是什麼 1.2.1 演算法定義 演算法(algorithm)是在有限時間內解決特定問題的一組指令或操作步驟,它具有以下特性。 ‧ 問題是明確的,包含清晰的輸入和輸出定義。 ‧ 具有可行性,能夠在有限步驟、時間和記憶體空間下完成。 ‧ 各步驟都有確定的含義,在相同的輸入和執行條件下,輸出始終相同。 1.2.2 資料結構定義 資料結構(data 執行效率可能相差很大,選擇合適的資料結構是關鍵。 圖 1‑4 資料結構與演算法的關係 資料結構與演算法猶如圖 1‑5 所示的拼裝積木。一套積木,除了包含許多零件之外,還附有詳細的組裝說明 書。我們按照說明書一步步操作,就能組裝出精美的積木模型。 第 1 章 初識演算法 www.hello‑algo.com 15 圖 1‑5 拼裝積木 兩者的詳細對應關係如表 1‑1 所示。 表 1‑1 將資料結構與演算法類比為拼裝積木 資料結構與演算法 拼裝積木 輸入資料 未拼裝的積木 資料結構 積木組織形式,包括形狀、大小、連線方式等 演算法 把積木拼成目標形態的一系列操作步驟 輸出資料 積木模型 值得說明的是,資料結構與演算法是獨立於程式語言的。正因如此,本書得以提供基於多種程式語言的實 現。 約定俗成的簡稱 在實際討論時,我們通常會將“資料結構與演算法”簡稱為“演算法”。比如眾所周知的 LeetCode0 码力 | 385 页 | 18.80 MB | 10 月前3 Hello 算法 1.2.0 繁体中文 Go 版你邁入資料結構與演算法的知識殿堂。 1.2 演算法是什麼 1.2.1 演算法定義 演算法(algorithm)是在有限時間內解決特定問題的一組指令或操作步驟,它具有以下特性。 ‧ 問題是明確的,包含清晰的輸入和輸出定義。 ‧ 具有可行性,能夠在有限步驟、時間和記憶體空間下完成。 ‧ 各步驟都有確定的含義,在相同的輸入和執行條件下,輸出始終相同。 1.2.2 資料結構定義 資料結構(data 執行效率可能相差很大,選擇合適的資料結構是關鍵。 圖 1‑4 資料結構與演算法的關係 資料結構與演算法猶如圖 1‑5 所示的拼裝積木。一套積木,除了包含許多零件之外,還附有詳細的組裝說明 書。我們按照說明書一步步操作,就能組裝出精美的積木模型。 第 1 章 初識演算法 www.hello‑algo.com 15 圖 1‑5 拼裝積木 兩者的詳細對應關係如表 1‑1 所示。 表 1‑1 將資料結構與演算法類比為拼裝積木 資料結構與演算法 拼裝積木 輸入資料 未拼裝的積木 資料結構 積木組織形式,包括形狀、大小、連線方式等 演算法 把積木拼成目標形態的一系列操作步驟 輸出資料 積木模型 值得說明的是,資料結構與演算法是獨立於程式語言的。正因如此,本書得以提供基於多種程式語言的實 現。 約定俗成的簡稱 在實際討論時,我們通常會將“資料結構與演算法”簡稱為“演算法”。比如眾所周知的 LeetCode0 码力 | 385 页 | 18.80 MB | 10 月前3
 Golang 101(Go语言101 中文版)  v1.21.a本文将介绍如何配置Go开发环境和如何使用Go官方工具链中提供的go命令。 一些非官方工具链中的工具也将简单提及。 安装Go官方工具链 请从国际官网 ? 或者国内官网 ? 下载Go官方工具链, 并按照下载页面中的说 明安装Go官方工具链。 我们也可以使用工具[GoTV](https://go101.org/apps-and-libs/gotv.html)来安装多 个Go工具链版本,并方便和谐地使用它们。 Go官 compiled, dynamic bool = true, false 3| var announceYear int = 2009 我们可以看到,和常量声明一样,多个同类型的变量可以在一条语句中被声 明。 完整形式的标准变量声明使用起来有些罗嗦,因此很少在日常Go编程中使 用。 在日常Go编程中,另外两种变种形式用得更广泛一些。 一种变种形式省 略了变量类型(但仍指定了变量的初始值),这时编译器将根据初始值的字面 结构体值的字段,指针的解引用和容器类型值的元素索引项等。 但是这些项 不能出现在一个变量短声明语句的左边。 关于“赋值”这个术语 以后,当“赋值”这个术语被提到的时候,它可以指一个纯赋值、一个短变量声 明或者一个初始值未省略的标准变量声明。 事实上,一个更通用的定义包括 后续文章将要介绍的函数传参(第9章)。 当y = x是一条合法的赋值语句时,我们可以说x可以被赋给y。 假设y的类型 为Ty,有0 码力 | 821 页 | 956.82 KB | 1 年前3 Golang 101(Go语言101 中文版)  v1.21.a本文将介绍如何配置Go开发环境和如何使用Go官方工具链中提供的go命令。 一些非官方工具链中的工具也将简单提及。 安装Go官方工具链 请从国际官网 ? 或者国内官网 ? 下载Go官方工具链, 并按照下载页面中的说 明安装Go官方工具链。 我们也可以使用工具[GoTV](https://go101.org/apps-and-libs/gotv.html)来安装多 个Go工具链版本,并方便和谐地使用它们。 Go官 compiled, dynamic bool = true, false 3| var announceYear int = 2009 我们可以看到,和常量声明一样,多个同类型的变量可以在一条语句中被声 明。 完整形式的标准变量声明使用起来有些罗嗦,因此很少在日常Go编程中使 用。 在日常Go编程中,另外两种变种形式用得更广泛一些。 一种变种形式省 略了变量类型(但仍指定了变量的初始值),这时编译器将根据初始值的字面 结构体值的字段,指针的解引用和容器类型值的元素索引项等。 但是这些项 不能出现在一个变量短声明语句的左边。 关于“赋值”这个术语 以后,当“赋值”这个术语被提到的时候,它可以指一个纯赋值、一个短变量声 明或者一个初始值未省略的标准变量声明。 事实上,一个更通用的定义包括 后续文章将要介绍的函数传参(第9章)。 当y = x是一条合法的赋值语句时,我们可以说x可以被赋给y。 假设y的类型 为Ty,有0 码力 | 821 页 | 956.82 KB | 1 年前3
 Golang 101(Go语言101 中文版)  v1.21.a=的语句称为一个常量描述(constant specification)。 每个const关键字对应一个常量声明。一个常量声明中可以有 若干个常量描述。 上面的例子中含有4个常量声明。除了第3个,其它的常量声 明中都各自只有一个常量描述。 第3个常量声明中有4个常量描述。 在上面的例子中,符号*是一个乘法运算符, 符号!是一个布尔取否运算符。 运 算符将在下一篇文章(第8章)中详述。 常量声明中的等号=表示“绑定”而非“赋值”。 compiled, dynamic bool = true, false var announceYear int = 2009 我们可以看到,和常量声明一样,多个同类型的变量可以在一条语句中被声 明。 完整形式的标准变量声明使用起来有些罗嗦,因此很少在日常Go编程中使用。 在日常Go编程中,另外两种变种形式用得更广泛一些。 一种变种形式省略了变 量类型(但仍指定了变量的初始值),这时编译器将根据初始值的字面量形式 构体值的字段,指针的解引用和容器类型值的元素索引项等。 但是这些项不能 出现在一个变量短声明语句的左边。 关于“赋值”这个术语 以后,当“赋值”这个术语被提到的时候,它可以指一个纯赋值、一个短变量声 明或者一个初始值未省略的标准变量声明。 事实上,一个更通用的定义包括后 续文章将要介绍的函数传参(第9章)。 当y = x是一条合法的赋值语句时,我们可以说x可以被赋给y。 假设y的类型为 Ty,有0 码力 | 608 页 | 1.08 MB | 1 年前3 Golang 101(Go语言101 中文版)  v1.21.a=的语句称为一个常量描述(constant specification)。 每个const关键字对应一个常量声明。一个常量声明中可以有 若干个常量描述。 上面的例子中含有4个常量声明。除了第3个,其它的常量声 明中都各自只有一个常量描述。 第3个常量声明中有4个常量描述。 在上面的例子中,符号*是一个乘法运算符, 符号!是一个布尔取否运算符。 运 算符将在下一篇文章(第8章)中详述。 常量声明中的等号=表示“绑定”而非“赋值”。 compiled, dynamic bool = true, false var announceYear int = 2009 我们可以看到,和常量声明一样,多个同类型的变量可以在一条语句中被声 明。 完整形式的标准变量声明使用起来有些罗嗦,因此很少在日常Go编程中使用。 在日常Go编程中,另外两种变种形式用得更广泛一些。 一种变种形式省略了变 量类型(但仍指定了变量的初始值),这时编译器将根据初始值的字面量形式 构体值的字段,指针的解引用和容器类型值的元素索引项等。 但是这些项不能 出现在一个变量短声明语句的左边。 关于“赋值”这个术语 以后,当“赋值”这个术语被提到的时候,它可以指一个纯赋值、一个短变量声 明或者一个初始值未省略的标准变量声明。 事实上,一个更通用的定义包括后 续文章将要介绍的函数传参(第9章)。 当y = x是一条合法的赋值语句时,我们可以说x可以被赋给y。 假设y的类型为 Ty,有0 码力 | 608 页 | 1.08 MB | 1 年前3
 Golang 101(Go语言101 中文版)  v1.21.aorg/wiki/IEEE_754)存储。 一个布尔值表示一个真假。在内存中,一个布尔值只有两种可能的状态。 这两种状 态使用两个预声明(或称为内置)的常量(false和true)来表示。 关于常量声 明,下一篇文章(第7章)将做详细解释。 从逻辑上说,一个字符串值表示一段文本。 在内存中,一个字符串存储为一个字节 (byte)序列。 此字节序列体现了此字符串所表示的文本的UTF-8编码形式。 我们 在代码中文字体现形式(和内存中 的表现形式相对应)。一个值可能会有很多种字面量形式。 布尔值的字面量形式 Go白皮书没有定义布尔类型值字面量形式。 我们可以将false和true这两个预声 明的具名常量当作布尔类型的字面量形式。 但是,我们应该知道,从严格意义上 说,它们不属于字面量。具名常量声明将在下一篇文章中介绍和详细解释。 布尔类型的零值可以使用预声明的false来表示。 整数类型值的字面量形式 29| } 刚提到的作用域是指一个标识符的可见范围。 一个包级变量或者常量的作用域为其 所处于的整个代码包。 一个局部变量或者常量的作用域开始于此变量或者常量的声 第7章:常量和变量 48 明的下一行,结束于最内层包含此变量或者常量的声明语句的代码块的结尾。 这解 释了为什么上例中的println(z)将编译不通过。 后面的代码块和作用域(第32章)一文将详述代码块和标识符的作用域。0 码力 | 591 页 | 21.40 MB | 1 年前3 Golang 101(Go语言101 中文版)  v1.21.aorg/wiki/IEEE_754)存储。 一个布尔值表示一个真假。在内存中,一个布尔值只有两种可能的状态。 这两种状 态使用两个预声明(或称为内置)的常量(false和true)来表示。 关于常量声 明,下一篇文章(第7章)将做详细解释。 从逻辑上说,一个字符串值表示一段文本。 在内存中,一个字符串存储为一个字节 (byte)序列。 此字节序列体现了此字符串所表示的文本的UTF-8编码形式。 我们 在代码中文字体现形式(和内存中 的表现形式相对应)。一个值可能会有很多种字面量形式。 布尔值的字面量形式 Go白皮书没有定义布尔类型值字面量形式。 我们可以将false和true这两个预声 明的具名常量当作布尔类型的字面量形式。 但是,我们应该知道,从严格意义上 说,它们不属于字面量。具名常量声明将在下一篇文章中介绍和详细解释。 布尔类型的零值可以使用预声明的false来表示。 整数类型值的字面量形式 29| } 刚提到的作用域是指一个标识符的可见范围。 一个包级变量或者常量的作用域为其 所处于的整个代码包。 一个局部变量或者常量的作用域开始于此变量或者常量的声 第7章:常量和变量 48 明的下一行,结束于最内层包含此变量或者常量的声明语句的代码块的结尾。 这解 释了为什么上例中的println(z)将编译不通过。 后面的代码块和作用域(第32章)一文将详述代码块和标识符的作用域。0 码力 | 591 页 | 21.40 MB | 1 年前3
 Go读书会第二期Go 读书会第二期 白明 《 Go 语言精进之路》作者 tonybai.com 博主 目 录 写书的历程 0 1 Go 语言精进之路导读 0 2 我是怎么读书的 0 3 写书的历程 第一部分 程序员的“小目标”与写书三要素 写书三要素 写书 <- 能力 +意愿 + 机会 过程 写书不易,写高质量的书更难 2018 年下 旬开始动笔 2020 年 11 月下旬 初稿交付0 码力 | 26 页 | 4.55 MB | 1 年前3 Go读书会第二期Go 读书会第二期 白明 《 Go 语言精进之路》作者 tonybai.com 博主 目 录 写书的历程 0 1 Go 语言精进之路导读 0 2 我是怎么读书的 0 3 写书的历程 第一部分 程序员的“小目标”与写书三要素 写书三要素 写书 <- 能力 +意愿 + 机会 过程 写书不易,写高质量的书更难 2018 年下 旬开始动笔 2020 年 11 月下旬 初稿交付0 码力 | 26 页 | 4.55 MB | 1 年前3
 可视化学习 Go 并发编程time.Second) <-table } Go并发可视化 (/2017/go-concurrency-visualize/pingpong36.html) 4. 素数筛-算法 感谢白明 (http://tonybai.com/) 老师的动图 (http://tonybai.com/wp-content/uploads/Sieve_of_Eratosthenes_animation.gif)0 码力 | 29 页 | 1.48 MB | 1 年前3 可视化学习 Go 并发编程time.Second) <-table } Go并发可视化 (/2017/go-concurrency-visualize/pingpong36.html) 4. 素数筛-算法 感谢白明 (http://tonybai.com/) 老师的动图 (http://tonybai.com/wp-content/uploads/Sieve_of_Eratosthenes_animation.gif)0 码力 | 29 页 | 1.48 MB | 1 年前3
 Go语言基础
Golang FundamentsEADME.md Golang-设计哲学 • 面向数据的设计(Data-Oriented Design) “数据占主导地位。如果您选择了正确的数据结构,并 且组织得很好,那么算法几乎总是不言自明的。数据结 构,而不是算法,是编程的核心。”——罗伯•派克 • 接口和组合设计(Interface And Composition Design) – 接口赋予程序结构。 – 接口鼓励通过组合进行设计。0 码力 | 21 页 | 851.30 KB | 1 年前3 Go语言基础
Golang FundamentsEADME.md Golang-设计哲学 • 面向数据的设计(Data-Oriented Design) “数据占主导地位。如果您选择了正确的数据结构,并 且组织得很好,那么算法几乎总是不言自明的。数据结 构,而不是算法,是编程的核心。”——罗伯•派克 • 接口和组合设计(Interface And Composition Design) – 接口赋予程序结构。 – 接口鼓励通过组合进行设计。0 码力 | 21 页 | 851.30 KB | 1 年前3
 03. Golang 在隐私计算平台建设中的实践 - 刘敬10 隐私计算流程 • 通过区块链进⾏行行数据使⽤用权限 的控制以及隐私计算任务的协 作 • 链下节点间基于隐私计算算 法,使⽤用多⽅方数据进⾏行行密态计 算,利利⽤用密码学算法达到“明 ⽂文数据不不出本地,计算结果定 向汇集”的数据计算效果,解 决隐私数据难使⽤用的问题。 区块链节点 隐私计算节点 本地数据库 发起⽅方节点 隐私计算节点 本地数据库 参与⽅方节点A0 码力 | 37 页 | 6.20 MB | 1 年前3 03. Golang 在隐私计算平台建设中的实践 - 刘敬10 隐私计算流程 • 通过区块链进⾏行行数据使⽤用权限 的控制以及隐私计算任务的协 作 • 链下节点间基于隐私计算算 法,使⽤用多⽅方数据进⾏行行密态计 算,利利⽤用密码学算法达到“明 ⽂文数据不不出本地,计算结果定 向汇集”的数据计算效果,解 决隐私数据难使⽤用的问题。 区块链节点 隐私计算节点 本地数据库 发起⽅方节点 隐私计算节点 本地数据库 参与⽅方节点A0 码力 | 37 页 | 6.20 MB | 1 年前3
 Go 入门指南(The way to Go)main_fibo.go / fibonacci.go 9.6 为自定义包使用 godoc godoc工具(第 3.6 节)在显示自定义包中的注释也有很好的效果:注释必须以 `//`` 开始并无空行放在声 明(包,类型,函数)前。godoc 会为每个文件生成一系列的网页。 例如: 在 do_examples 目录下我们有第 11.7 节中的用来排序的 go 文件,文件中有一些注释(文件需要未 编译) sync 中有一些工具用来在低级别的代码中实现加锁;我们在第 9.3 节中讨论过这个问题。不过过去的软 件开发经验告诉我们这会带来更高的复杂度,更容易使代码出错以及更低的性能,所以这个经典的方法明 显不再适合现代多核/多处理器编程: thread-per-connection 模型不够有效。 Go 更倾向于其他的方式,在诸多比较合适的范式中,有个被称作 Communicating Sequential0 码力 | 380 页 | 2.97 MB | 1 年前3 Go 入门指南(The way to Go)main_fibo.go / fibonacci.go 9.6 为自定义包使用 godoc godoc工具(第 3.6 节)在显示自定义包中的注释也有很好的效果:注释必须以 `//`` 开始并无空行放在声 明(包,类型,函数)前。godoc 会为每个文件生成一系列的网页。 例如: 在 do_examples 目录下我们有第 11.7 节中的用来排序的 go 文件,文件中有一些注释(文件需要未 编译) sync 中有一些工具用来在低级别的代码中实现加锁;我们在第 9.3 节中讨论过这个问题。不过过去的软 件开发经验告诉我们这会带来更高的复杂度,更容易使代码出错以及更低的性能,所以这个经典的方法明 显不再适合现代多核/多处理器编程: thread-per-connection 模型不够有效。 Go 更倾向于其他的方式,在诸多比较合适的范式中,有个被称作 Communicating Sequential0 码力 | 380 页 | 2.97 MB | 1 年前3
 Go 入门指南(The way to Go)编译器的智商已经高到可以根据变量的值来自动推断其类型,这有点像 Ruby 和 Python 这类动态语言, 只不过它们是在运行时进行推断,而 Go 是在编译时就已经完成推断过程。因此,你还可以使用下面的这些形式来声 明及初始化变量: 1. var a = 15 2. var b = false 3. var str = "Go says hello to the world!" 或: 1. var ( 2 164 - 本文档使用 书栈(BookStack.CN) 构建 第7章:数组与切片 这章我们开始剖析 容器, 它是可以包含大量条目(item)的数据结构, 例如数组、切片和 map。从这看到 Go 明 显受到 Python 的影响。 以 [] 符号标识的数组类型几乎在所有的编程语言中都是一个基本主力。Go 语言中的数组也是类似的,只是有一 些特点。Go 没有 C 那么灵活,但是拥有切片(slice)类型。这是一种建立在0 码力 | 466 页 | 4.44 MB | 1 年前3 Go 入门指南(The way to Go)编译器的智商已经高到可以根据变量的值来自动推断其类型,这有点像 Ruby 和 Python 这类动态语言, 只不过它们是在运行时进行推断,而 Go 是在编译时就已经完成推断过程。因此,你还可以使用下面的这些形式来声 明及初始化变量: 1. var a = 15 2. var b = false 3. var str = "Go says hello to the world!" 或: 1. var ( 2 164 - 本文档使用 书栈(BookStack.CN) 构建 第7章:数组与切片 这章我们开始剖析 容器, 它是可以包含大量条目(item)的数据结构, 例如数组、切片和 map。从这看到 Go 明 显受到 Python 的影响。 以 [] 符号标识的数组类型几乎在所有的编程语言中都是一个基本主力。Go 语言中的数组也是类似的,只是有一 些特点。Go 没有 C 那么灵活,但是拥有切片(slice)类型。这是一种建立在0 码力 | 466 页 | 4.44 MB | 1 年前3
共 15 条
- 1
- 2














