Hello 算法 1.1.0 Swift版据结构可 以动态地添加或删除元素,但它们的容量是固定的。如果数据量超出了预分配的大小,就需要创建一个新的 第 3 章 数据结构 hello‑algo.com 65 更大的数组,并将旧数组的内容复制到新数组中。 Q:在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢? 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个 ?(?) 的操作,在数组很大的情况下非常耗时。代码如下所示: // === File: array.swift === /* 扩展数组长度 */ 第 4 章 数组与链表 hello‑algo [Int] { // 初始化一个扩展长度后的数组 var res = Array(repeating: 0, count: nums.count + enlarge) // 将原数组中的所有元素复制到新数组 for i in nums.indices { res[i] = nums[i] } // 返回扩展后的新数组 return res } 4.1.2 数组的优点与局限性 数0 码力 | 379 页 | 18.47 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Swift 版以动态地添加或删除元素,但它们的容量是固定的。如果数据量超出了预分配的大小,就需要创建一个新的 第 3 章 数据结构 www.hello‑algo.com 65 更大的数组,并将旧数组的内容复制到新数组中。 Q:在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢? 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个 ?(?) 的操作,在数组很大的情况下非常耗时。代码如下所示: // === File: array.swift === /* 扩展数组长度 */ 第 4 章 数组与链表 www [Int] { // 初始化一个扩展长度后的数组 var res = Array(repeating: 0, count: nums.count + enlarge) // 将原数组中的所有元素复制到新数组 for i in nums.indices { res[i] = nums[i] } // 返回扩展后的新数组 return res } 4.1.2 数组的优点与局限性 数0 码力 | 379 页 | 18.48 MB | 10 月前3
Hello 算法 1.0.0 Swift版据结构可 以动态地添加或删除元素,但它们的容量是固定的。如果数据量超出了预分配的大小,就需要创建一个新的 第 3 章 数据结构 hello‑algo.com 65 更大的数组,并将旧数组的内容复制到新数组中。 Q:在构建栈(队列)的时候,未指定它的大小,为什么它们是“静态数据结构”呢? 在高级编程语言中,我们无须人工指定栈(队列)的初始容量,这个工作由类内部自动完成。例如,Java 的 在复杂的系统环境中,程序难以保证数组之后的内存空间是可用的,从而无法安全地扩展数组容量。因此在 大多数编程语言中,数组的长度是不可变的。 如果我们希望扩容数组,则需重新建立一个更大的数组,然后把原数组元素依次复制到新数组。这是一个 ?(?) 的操作,在数组很大的情况下非常耗时。代码如下所示: // === File: array.swift === /* 扩展数组长度 */ func extend(nums: [Int] { // 初始化一个扩展长度后的数组 var res = Array(repeating: 0, count: nums.count + enlarge) // 将原数组中的所有元素复制到新数组 for i in nums.indices { 第 4 章 数组与链表 hello‑algo.com 72 res[i] = nums[i] } // 返回扩展后的新数组 return0 码力 | 378 页 | 17.59 MB | 1 年前3
Hello 算法 1.0.0b1 Swift版[Int] { // 初始化一个扩展长度后的数组 var res = Array(repeating: 0, count: nums.count + enlarge) // 将原数组中的所有元素复制到新数组 for i in nums.indices { res[i] = nums[i] } // 返回扩展后的新数组 return res } 数组中插入或删除元素效率低下。如果我 right) 7. 树 hello‑algo.com 111 let tmp = nex!.val // 递归删除结点 nex remove(num: nex!.val) // 将 nex 的值复制给 cur cur?.val = tmp } return cur } /* 获取中序遍历中的下一个结点(仅适用于 root 有左子结点的情况) */ func getInOrderNext(root: 根据判断结果交替前进(指 针 k 也前进),直至两个子数组都遍历完,即可完成合并。 合并方法 merge() 代码中的主要难点: ‧ nums 的待合并区间为 [left, right] ,而因为 tmp 只复制了 nums 该区间元素,所以 tmp 对应区间为 [0, right - left] ,需要特别注意代码中各个变量的含义。 ‧ 判断 tmp[i] 和 tmp[j] 的大小的操作中,还 需考虑当子数组遍历完成后的索引越界问题,即0 码力 | 190 页 | 14.71 MB | 1 年前3
Hello 算法 1.0.0b5 Swift版[Int] { // 初始化一个扩展长度后的数组 var res = Array(repeating: 0, count: nums.count + enlarge) // 将原数组中的所有元素复制到新数组 第 4 章 数组与链表 hello‑algo.com 69 for i in nums.indices { res[i] = nums[i] } // 返回扩展后的新数组 return 连续空间存储是一把双刃剑,其存在以下缺点。 ‧ 插入与删除效率低: 当数组中元素较多时,插入与删除操作需要移动大量的元素。 ‧ 长度不可变: 数组在初始化后长度就固定了,扩容数组需要将所有数据复制到新数组,开销很大。 ‧ 空间浪费: 如果数组分配的大小超过了实际所需,那么多余的空间就被浪费了。 4.1.3 数组典型应用 数组是一种基础且常见的数据结构,既频繁应用在各类算法之中,也可用于实现各种复杂数据结构。 mid, right: right) } 实现合并函数 merge() 存在以下难点。 ‧ 需要特别注意各个变量的含义。nums 的待合并区间为 [left, right] ,但由于 tmp 仅复制了 nums 该区 间的元素,因此 tmp 对应区间为 [0, right - left] 。 ‧ 在比较 tmp[i] 和 tmp[j] 的大小时,还需考虑子数组遍历完成后的索引越界问题,即 i0 码力 | 376 页 | 30.70 MB | 1 年前3
Hello 算法 1.0.0b2 Swift版[Int] { // 初始化一个扩展长度后的数组 var res = Array(repeating: 0, count: nums.count + enlarge) // 将原数组中的所有元素复制到新数组 for i in nums.indices { res[i] = nums[i] } // 返回扩展后的新数组 return res } 数组中插入或删除元素效率低下。如果我 right) 7. 树 hello‑algo.com 111 let tmp = nex!.val // 递归删除结点 nex remove(num: nex!.val) // 将 nex 的值复制给 cur cur?.val = tmp } return cur } /* 获取中序遍历中的下一个结点(仅适用于 root 有左子结点的情况) */ func getInOrderNext(root: 根据判断结果交替前进(指 针 k 也前进),直至两个子数组都遍历完,即可完成合并。 合并方法 merge() 代码中的主要难点: ‧ nums 的待合并区间为 [left, right] ,而因为 tmp 只复制了 nums 该区间元素,所以 tmp 对应区间为 [0, right - left] ,需要特别注意代码中各个变量的含义。 ‧ 判断 tmp[i] 和 tmp[j] 的大小的操作中,还 需考虑当子数组遍历完成后的索引越界问题,即0 码力 | 199 页 | 15.72 MB | 1 年前3
Pop in Swift - 李洁信• 代码 > 1000 ⾏行, 难以维护 • ⾼高耦合, ⽗父类改动牵连所有⼦子类 • ⼦子类⾥里继承了⽆无⽤用的实例变量和⽅方法 • BaseTableViewController呢?复制代码? Solution A • Singleton • Helpers & Static Methods • 拆分了代码,但没有降低耦合 • 难以测试 Solution B “Composition0 码力 | 60 页 | 875.09 KB | 1 年前3
共 7 条
- 1













