Hello 算法 1.0.0b2 Golang版. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 10. 查找算法 158 10.1. 线性查找 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 10.2. 二分查找 次,算法运行时间随着 ? 增大成线性增长。此算法的时间复杂度被称为 「线性阶」。 ‧ 算法 C 中的打印操作需要循环 1000000 次,但运行时间仍与输入数据大小 ? 无关。因此 C 的时间复杂 度和 A 相同,仍为「常数阶」。 // 算法 A 时间复杂度:常数阶 func algorithm_A(n int) { fmt.Println(0) } // 算法 B 时间复杂度:线性阶 func algorithm_B(n 相比直接统计算法运行时间,时间复杂度分析的做法有什么好处呢?以及有什么不足? 时间复杂度可以有效评估算法效率。算法 B 运行时间的增长是线性的,在 ? > 1 时慢于算法 A ,在 ? > 1000000 时慢于算法 C 。实质上,只要输入数据大小 ? 足够大,复杂度为「常数阶」的算法一定优于 「线性阶」的算法,这也正是时间增长趋势的含义。 时间复杂度的推算方法更加简便。在时间复杂度分析中,我们可以将统计「计算操作的运行时间」简化为统计0 码力 | 202 页 | 15.73 MB | 1 年前3
Hello 算法 1.0.0 Golang版复杂度分析 hello‑algo.com 20 图 2‑1 是该求和函数的流程框图。 图 2‑1 求和函数的流程框图 此求和函数的操作数量与输入数据大小 ? 成正比,或者说成“线性关系”。实际上,时间复杂度描述的就是 这个“线性关系”。相关内容将会在下一节中详细介绍。 2. while 循环 与 for 循环类似,while 循环也是一种实现迭代的方法。在 while 循环中,程序每轮都会先检查条件,如果条 ,给定三个算法 A、B 和 C : // 算法 A 的时间复杂度:常数阶 func algorithm_A(n int) { fmt.Println(0) } // 算法 B 的时间复杂度:线性阶 func algorithm_B(n int) { for i := 0; i < n; i++ { fmt.Println(0) } } // 算法 C 的时间复杂度:常数阶 func A 只有 1 个打印操作,算法运行时间不随着 ? 增大而增长。我们称此算法的时间复杂度为“常数 阶”。 ‧ 算法 B 中的打印操作需要循环 ? 次,算法运行时间随着 ? 增大呈线性增长。此算法的时间复杂度被称 为“线性阶”。 ‧ 算法 C 中的打印操作需要循环 1000000 次,虽然运行时间很长,但它与输入数据大小 ? 无关。因此 C 的时间复杂度和 A 相同,仍为“常数阶”。 图 2‑70 码力 | 382 页 | 17.60 MB | 1 年前3
Hello 算法 1.1.0 Go版是该求和函数的流程框图。 第 2 章 复杂度分析 hello‑algo.com 20 图 2‑1 求和函数的流程框图 此求和函数的操作数量与输入数据大小 ? 成正比,或者说成“线性关系”。实际上,时间复杂度描述的就是 这个“线性关系”。相关内容将会在下一节中详细介绍。 2. while 循环 与 for 循环类似,while 循环也是一种实现迭代的方法。在 while 循环中,程序每轮都会先检查条件,如果条 hello‑algo.com 29 // 算法 A 的时间复杂度:常数阶 func algorithm_A(n int) { fmt.Println(0) } // 算法 B 的时间复杂度:线性阶 func algorithm_B(n int) { for i := 0; i < n; i++ { fmt.Println(0) } } // 算法 C 的时间复杂度:常数阶 func A 只有 1 个打印操作,算法运行时间不随着 ? 增大而增长。我们称此算法的时间复杂度为“常数 阶”。 ‧ 算法 B 中的打印操作需要循环 ? 次,算法运行时间随着 ? 增大呈线性增长。此算法的时间复杂度被称 为“线性阶”。 ‧ 算法 C 中的打印操作需要循环 1000000 次,虽然运行时间很长,但它与输入数据大小 ? 无关。因此 C 的时间复杂度和 A 相同,仍为“常数阶”。 图 2‑70 码力 | 383 页 | 18.48 MB | 1 年前3
Hello 算法 1.0.0b5 Golang版hello‑algo.com 19 图 2‑1 展示了该求和函数的流程框图。 图 2‑1 求和函数的流程框图 此求和函数的操作数量与输入数据大小 ? 成正比,或者说成“线性关系”。实际上,时间复杂度描述的就是 这个“线性关系”。相关内容将会在下一节中详细介绍。 2. while 循环 与 for 循环类似,while 循环也是一种实现迭代的方法。在 while 循环中,程序每轮都会先检查条件,如果条 ,给定三个算法 函数 A、B 和 C : // 算法 A 的时间复杂度:常数阶 func algorithm_A(n int) { fmt.Println(0) } // 算法 B 的时间复杂度:线性阶 func algorithm_B(n int) { for i := 0; i < n; i++ { fmt.Println(0) } } // 算法 C 的时间复杂度:常数阶 func A 只有 1 个打印操作,算法运行时间不随着 ? 增大而增长。我们称此算法的时间复杂度为“常数 阶”。 ‧ 算法 B 中的打印操作需要循环 ? 次,算法运行时间随着 ? 增大呈线性增长。此算法的时间复杂度被称 为“线性阶”。 ‧ 算法 C 中的打印操作需要循环 1000000 次,虽然运行时间很长,但它与输入数据大小 ? 无关。因此 C 的时间复杂度和 A 相同,仍为“常数阶”。 图 2‑70 码力 | 379 页 | 30.70 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Go 版www.hello‑algo.com 20 图 2‑1 是该求和函数的流程框图。 图 2‑1 求和函数的流程框图 此求和函数的操作数量与输入数据大小 ? 成正比,或者说成“线性关系”。实际上,时间复杂度描述的就是 这个“线性关系”。相关内容将会在下一节中详细介绍。 2. while 循环 与 for 循环类似,while 循环也是一种实现迭代的方法。在 while 循环中,程序每轮都会先检查条件,如果条 hello‑algo.com 29 // 算法 A 的时间复杂度:常数阶 func algorithm_A(n int) { fmt.Println(0) } // 算法 B 的时间复杂度:线性阶 func algorithm_B(n int) { for i := 0; i < n; i++ { fmt.Println(0) } } // 算法 C 的时间复杂度:常数阶 func A 只有 1 个打印操作,算法运行时间不随着 ? 增大而增长。我们称此算法的时间复杂度为“常数 阶”。 ‧ 算法 B 中的打印操作需要循环 ? 次,算法运行时间随着 ? 增大呈线性增长。此算法的时间复杂度被称 为“线性阶”。 ‧ 算法 C 中的打印操作需要循环 1000000 次,虽然运行时间很长,但它与输入数据大小 ? 无关。因此 C 的时间复杂度和 A 相同,仍为“常数阶”。 图 2‑70 码力 | 384 页 | 18.49 MB | 10 月前3
Hello 算法 1.0.0b4 Golang版次,算法运行时间随着 ? 增大呈线性增长。此算法的时间复杂度被称 为「线性阶」。 ‧ 算法 C 中的打印操作需要循环 1000000 次,但运行时间仍与输入数据大小 ? 无关。因此 C 的时间复杂 度和 A 相同,仍为「常数阶」。 // 算法 A 时间复杂度:常数阶 func algorithm_A(n int) { fmt.Println(0) } // 算法 B 时间复杂度:线性阶 func algorithm_B(n 相较于直接统计算法运行时间,时间复杂度分析有哪些优势和局限性呢? 时间复杂度能够有效评估算法效率。例如,算法 B 的运行时间呈线性增长,在 ? > 1 时比算法 A 慢,在 ? > 1000000 时比算法 C 慢。事实上,只要输入数据大小 ? 足够大,复杂度为「常数阶」的算法一定优于 「线性阶」的算法,这正是时间增长趋势所表达的含义。 时间复杂度的推算方法更简便。显然,运行平台和计算操作类型都与算法运行时间的增长趋势无关。因此在 i++ { // +1 fmt.Println(a) // +1 2. 复杂度 hello‑algo.com 17 } } ?(?) 是一次函数,说明时间增长趋势是线性的,因此可以得出时间复杂度是线性阶。 我们将线性阶的时间复杂度记为 ?(?) ,这个数学符号称为「大 ? 记号 Big‑? Notation」,表示函数 ?(?) 的「渐近上界 Asymptotic Upper Bound」。0 码力 | 347 页 | 27.40 MB | 1 年前3
Hello 算法 1.0.0b1 Golang版. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 10. 查找算法 155 10.1. 线性查找 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 10.2. 二分查找 次,算法运行时间随着 ? 增大成线性增长。此算法的时间复杂度被称为 「线性阶」。 ‧ 算法 C 中的打印操作需要循环 1000000 次,但运行时间仍与输入数据大小 ? 无关。因此 C 的时间复杂 度和 A 相同,仍为「常数阶」。 // 算法 A 时间复杂度:常数阶 func algorithm_A(n int) { fmt.Println(0) } // 算法 B 时间复杂度:线性阶 func algorithm_B(n 相比直接统计算法运行时间,时间复杂度分析的做法有什么好处呢?以及有什么不足? 时间复杂度可以有效评估算法效率。算法 B 运行时间的增长是线性的,在 ? > 1 时慢于算法 A ,在 ? > 1000000 时慢于算法 C 。实质上,只要输入数据大小 ? 足够大,复杂度为「常数阶」的算法一定优于 「线性阶」的算法,这也正是时间增长趋势的含义。 时间复杂度的推算方法更加简便。在时间复杂度分析中,我们可以将统计「计算操作的运行时间」简化为统计0 码力 | 190 页 | 14.71 MB | 1 年前3
Go 入门指南(The way to Go)o 中的字符串也可能根据需要占用 1 至 4 个字节(示例见第 4.6 节),这与其它语言如 C++、Java 或者 Python 不同(Java 始终使用 2 个字节)。Go 这样做的好处是不仅减 少了内存和硬盘空间占用,同时也不用像其它语言那样需要对使用 UTF-8 字符集的文本进行编码和解码。 字符串是一种值类型,且值不可变,即创建某个文本后你无法再次修改这个文本的内容;更深入地讲,字符串是字节 0; ;这比在循环之前声明更为简短。紧接着的是条件语句 i < 5; ,在每次循环 开始前都会进行判断,一旦判断结果为 false,则退出循环体。最后一部分为修饰语句 i++ ,一般用于增加或减 少计数器。 这三部分组成的循环的头部,它们之间使用分号 ; 相隔,但并不需要括号 () 将它们括起来。例如: for (i = 0; i < 10; i++) { } ,这是无效的代码! 为值时需要先做一次类型断言(详见第 11.3 节)。 map 传递给函数的代价很小:在 32 位机器上占 4 个字节,64 位机器上占 8 个字节,无论实际上存储了多少数 据。通过 key 在 map 中寻找值是很快的,比线性查找快得多,但是仍然比从数组和切片的索引中直接读取要慢 100 倍;所以如果你很在乎性能的话还是建议用切片来解决问题。 map 也可以用函数作为自己的值,这样就可以用来做分支结构(详见第 5 章):key0 码力 | 466 页 | 4.44 MB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.auint(a) 11 | println(b) // 20 自增和自减操作符 和很多其它流行语言一样,Go也支持自增(++)和自减(--)操作符。 不过 和其它语言不一样的是,自增(aNumber++)和自减(aNumber--)操作没有返 回值, 所以它们不能当做表达式(第11章)来使用。 另一个显著区别是,在 Go中,自增(++)和自减(--)操作符只能后置,不能前置。 一个例子: 1| package 否小于一个阙值来检查两个浮点数是否相等。 操作符运算的优先级 Go中的操作符运算的优先级和其它流行语言有一些差别。 下面列出了本文介 绍的操作符的优先级。 同一行中的操作符的优先级是一样的。优先级逐行递 减。 1| * / % << >> & &^ 2| + - | ^ 3| == != < <= > >= 4| && 5| || 一个和其它流行 通道的发送数据操作。上面已经提到过一次,通道以后将在此文中(第21 章)详解。 5. 空语句。在下一篇文章我们将看到一些空语句的应用。 6. 自增(x++)和自减(x--)语句。 注意:和C/C++不一样,在Go中,自增和自减语句不能被当作表达式使用。 简单语句这个概念在Go中比较重要,所以请牢记这六种简单语句类型。 一些非简单语句 下面是一个非简单语句的不完整列表: 标准变量声明0 码力 | 821 页 | 956.82 KB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.a<<= uint(a) println(b) // 20 自增和自减操作符 和很多其它流行语言一样,Go也支持自增(++)和自减(--)操作符。 不过和 其它语言不一样的是,自增(aNumber++)和自减(aNumber--)操作没有返回 值, 所以它们不能当做表达式(第11章)来使用。 另一个显著区别是,在Go 中,自增(++)和自减(--)操作符只能后置,不能前置。 一个例子: package 通道的发送数据操作。上面已经提到过一次,通道以后将在此文中(第21 章)详解。 5. 空语句。在下一篇文章我们将看到一些空语句的应用。 6. 自增(x++)和自减(x--)语句。 注意:和C/C++不一样,在Go中,自增和自减语句不能被当作表达式使用。 简单语句这个概念在Go中比较重要,所以请牢记这六种简单语句类型。 一些非简单语句 下面是一个非简单语句的不完整列表: 标准变量 于一个指针p, 运算p++和p-2 都是非法的。 如果p为一个指向一个数值类型值的指针,*p++将被编译器认为是合法的并且等 价于(*p)++。 换句话说,解引用操作符*的优先级都高于自增++和自减--操作 符。 例子: package main import "fmt" func main() { a := int64(5) p := &a // 下面这两行编译不通过。0 码力 | 608 页 | 1.08 MB | 1 年前3
共 19 条
- 1
- 2













