Hello 算法 1.1.0 Go版349 15.2 分数背包问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352 15.3 最大容量问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356 15.4 最大切分乘积问题 . . 以动态地添加或删除元素,但它们的容量是固定的。如果数据量超出了预分配的大小,就需要创建一个新的 第 3 章 数据结构 hello‑algo.com 65 更大的数组,并将旧数组的内容复制到新数组中。 Q:在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢? 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 ArrayList 的初始容量通常为 nums[i] == target { index = i break } } return } 7. 扩容数组 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个 ?(?) 的操作,在数组很大的情况下非常耗时。代码如下所示:0 码力 | 383 页 | 18.48 MB | 1 年前3
Hello 算法 1.0.0 Golang版351 15.2 分数背包问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354 15.3 最大容量问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 15.4 最大切分乘积问题 . . 以动态地添加或删除元素,但它们的容量是固定的。如果数据量超出了预分配的大小,就需要创建一个新的 第 3 章 数据结构 hello‑algo.com 65 更大的数组,并将旧数组的内容复制到新数组中。 Q:在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢? 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 ArrayList 的初始容量通常为 nums[i] == target { index = i break } } return } 7. 扩容数组 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个 ?(?) 的操作,在数组很大的情况下非常耗时。代码如下所示:0 码力 | 382 页 | 17.60 MB | 1 年前3
Hello 算法 1.0.0b4 Golang版. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325 目 录 hello‑algo.com iii 15.3. 最大容量问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328 15.4. 最大切分乘积问题 . 数据结构 hello‑algo.com 39 3.1.2. 物理结构:连续与离散 在计算机中,内存和硬盘是两种主要的存储硬件设备。硬盘主要用于长期存储数据,容量较大(通常可达到 TB 级别)、速度较慢。内存用于运行程序时暂存数据,速度较快,但容量较小(通常为 GB 级别)。 在算法运行过程中,相关数据都存储在内存中。下图展示了一个计算机内存条,其中每个黑色方块都包含一 块内存空间。我们可以将内存想象成一个巨大的 Dynamic Array」的数据结构,即长度可变的数组,也常被称 为「列表 List」。列表基于数组实现,继承了数组的优点,并且可以在程序运行过程中动态扩容。在列表中, 我们可以自由添加元素,而无需担心超过容量限制。 4.3.1. 列表常用操作 初始化列表。通常我们会使用“无初始值”和“有初始值”的两种初始化方法。 // === File: list_test.go === /* 初始化列表 */0 码力 | 347 页 | 27.40 MB | 1 年前3
Hello 算法 1.0.0b5 Golang版352 15.2 分数背包问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356 15.3 最大容量问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359 15.4 最大切分乘积问题 . . ‧ 网状结构:图,元素之间是多对多的关系。 3.1.2 物理结构:连续与离散 在计算机中,内存和硬盘是两种主要的存储硬件设备。硬盘主要用于长期存储数据,容量较大(通常可达到 TB 级别)、速度较慢。内存用于运行程序时暂存数据,速度较快,但容量较小(通常为 GB 级别)。 第 3 章 数据结构 hello‑algo.com 51 在算法运行过程中,相关数据都存储在内存中。图 3‑2 展示了一个计算机内存条,其中每个黑色方块都包含 nums[i] == target { index = i break } } return } 7. 扩容数组 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次拷贝到新数组。这是一个 ?(?) 的操作,在数组很大的情况下是非常耗时的。0 码力 | 379 页 | 30.70 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Go 版350 15.2 分数背包问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353 15.3 最大容量问题 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357 15.4 最大切分乘积问题 . . 结构可 以动态地添加或删除元素,但它们的容量是固定的。如果数据量超出了预分配的大小,就需要创建一个新的 第 3 章 数据结构 www.hello‑algo.com 65 更大的数组,并将旧数组的内容复制到新数组中。 Q:在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢? 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 ArrayList 的初始容量通常为 10。另外,扩容操作也是自动实现的。详见后续的“列表”章节。 Q:原码转补码的方法是“先取反后加 1”,那么补码转原码应该是逆运算“先减 1 后取反”,而补码转原码也 一样可以通过“先取反后加 1”得到,这是为什么呢? 这是因为原码和补码的相互转换实际上是计算“补数”的过程。我们先给出补数的定义:假设 ? + ? = ? , 那么我们称 ? 是0 码力 | 384 页 | 18.49 MB | 10 月前3
Hello 算法 1.2.0 繁体中文 Go 版351 15.2 分數背包問題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354 15.3 最大容量問題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358 15.4 最大切分乘積問題 . . 可以動態地新增或刪除元素,但它們的容量是固定的。如果資料量超出了預分配的大小,就需要建立一個新 的更大的陣列,並將舊陣列的內容複製到新陣列中。 Q:在構建堆疊(佇列)的時候,未指定它的大小,為什麼它們是“靜態資料結構”呢? 在高階程式語言中,我們無須人工指定堆疊(佇列)的初始容量,這個工作由類別內部自動完成。例如,Java 的 ArrayList 的初始容量通常為 10。另外,擴容操作也是自動實現的。詳見後續的“串列”章節。 == target { index = i break } } return } 7. 擴容陣列 在複雜的系統環境中,程式難以保證陣列之後的記憶體空間是可用的,從而無法安全地擴展陣列容量。因此 在大多數程式語言中,陣列的長度是不可變的。 如果我們希望擴容陣列,則需重新建立一個更大的陣列,然後把原陣列元素依次複製到新陣列。這是一個 ?(?) 的操作,在陣列很大的情況下非常耗時。程式碼如下所示:0 码力 | 385 页 | 18.80 MB | 10 月前3
微服务容灾治理经过这么多年⼤流量服务端架构设计的沉淀,go-zero在保护服务的稳定性上下⾜了功夫,不管是 CPU密集型还是IO密集型服务,go-zero都能很好的保护服务在如下场景不被拖垮或卡死: • 远超服务容量的突发⼤流量 • CPU打满 • 上下游故障或者超时 • MySQL、MongoDB、Redis等中间件故障或者超负载(典型的是CPU飙⾼) 如图,我们从三个⽅⾯来保护系统的稳定性: 开启过载保护(默认) • 超时1s • loops 2 hey -c 200 -z 60m "http://localhost:8888/ping" • 总qps⼤概在10000左右,流量⼤约是系统容量的20倍 • 拒绝了约95%的过载请求 • 成功处理请求在360-400qps,⼤概损失了10%的qps,被拒绝的近1000qps请求也需要消耗少 量系统资源(从接受请求到被拒绝) 处理时延p99不到700ms • 处理时延p90不到25ms 2.3压测结论: • 流量未知的情况下,保障系统不卡死(⽆过载保护情况下,CPU满载⼀般表现为⼤量请求超时), 且保证了系统容量的400qps没有⼤幅下降 • ⾃动拒绝了过量的请求,避免过量请求浪费系统资源(即使处理,系统最后返回给⽤⼾的也是不可 ⽤错误、超时错误等) 3. ⾃适应过载保护原理 先上⼀张总的0 码力 | 13 页 | 1.68 MB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.a- 类C指针 结构体类型(第16章) - 类C结构体 函数类型(第20章) - 函数类型在Go中是一种一等公民类别 容器类型(第18章),包括: 数组类型 - 定长容器类型 切片类型 - 动态长度和容量容器类型 映射类型(map)- 也常称为字典类型。在标准编译器中映射是使用哈 希表实现的。 通道类型(第21章) - 通道用来同步并发的协程 接口类型(第23章) - 接口在反射和多态中发挥着重要角色 通常地,一个内存地址用一个操作系统原生字(native word)来存储。 一个原 生字在32位操作系统上占4个字节,在64位操作系统上占8个字节。 所以,32位 操作系统上的理论最大支持内存容量为4GB(1GB == 230字节),64位操作系 统上的理论最大支持内存容量为264Byte,即16EB(EB:艾字节,1EB == 1024PB, 1PB == 1024TB, 1TB == 1024GB)。 内存地址的字面形式常用 elements unsafe.Pointer // 引用着底层的元素 len int // 当前的元素个数 cap int // 切片的容量 } 从这个定义可以看出来,一个切片类型在内部可以看作是一个指针包裹类型。 每个非零切片值包含着一个底层间接部分用来存储此切片的元素。 一个切片值 的底层元素序列(间接部分)被此切片值的elements字段所引用。0 码力 | 608 页 | 1.08 MB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.a类C指针 结构体类型(第16章) - 类C结构体 函数类型(第20章) - 函数类型在Go中是一种一等公民类别 容器类型(第18章),包括: 数组类型 - 定长容器类型 切片类型 - 动态长度和容量容器类型 映射类型(map)- 也常称为字典类型。在标准编译器中映射是使用 哈希表实现的。 通道类型(第21章) - 通道用来同步并发的协程 接口类型(第23章) - 接口在反射和多态中发挥着重要角色 通常地,一个内存地址用一个操作系统原生字(native word)来存储。 一个原 生字在32位操作系统上占4个字节,在64位操作系统上占8个字节。 所以,32 位操作系统上的理论最大支持内存容量为4GB(1GB == 230字节),64位操作 系统上的理论最大支持内存容量为264Byte,即16EB(EB:艾字节,1EB == 1024PB, 1PB == 1024TB, 1TB == 1024GB)。 内存地址的字面形式 unsafe.Pointer // 引用着底层的元素 3| len int // 当前的元素个数 4| cap int // 切片的容量 5| } 从这个定义可以看出来,一个切片类型在内部可以看作是一个指针包裹类型。 每个非零切片值包含着一个底层间接部分用来存储此切片的元素。 一个切片 值的底层元素序列(间接部分)被此切片值的elements字段所引用。0 码力 | 821 页 | 956.82 KB | 1 年前3
Golang 101(Go语言101 中文版) v1.21.a类C指针 结构体类型(第16章) - 类C结构体 函数类型(第20章) - 函数类型在Go中是一种一等公民类别 容器类型(第18章),包括: 数组类型 - 定长容器类型 切片类型 - 动态长度和容量容器类型 映射类型(map)- 也常称为字典类型。在标准编译器中映射是使用哈希 表实现的。 通道类型(第21章) - 通道用来同步并发的协程 接口类型(第23章) - 接口在反射和多态中发挥着重要角色 通常地,一个内存地址用一个操作系统原生字(native word)来存储。 一个原生 字在32位操作系统上占4个字节,在64位操作系统上占8个字节。 所以,32位操作系 统上的理论最大支持内存容量为4GB(1GB == 230字节),64位操作系统上的理论最 大支持内存容量为264Byte,即16EB(EB:艾字节,1EB == 1024PB, 1PB == 1024TB, 1TB == 1024GB)。 内存地址的字面形式常用 Pointer // 引用着底层的元素 3| len int // 当前的元素个数 4| cap int // 切片的容量 5| } 第17章:值部 139 从这个定义可以看出来,一个切片类型在内部可以看作是一个指针包裹类型。 每个 非零切片值包含着一个底层间接部分用来存储此切片的元素。 一个切片值的底层元0 码力 | 591 页 | 21.40 MB | 1 年前3
共 24 条
- 1
- 2
- 3













