Hello 算法 1.0.0b5 Swift版在 C、C++、Go 和 Rust 等支持指针的语言中,上述的“引用”应被替换为“指针”。 如以下代码所示,链表节点 ListNode 除了包含值,还需额外保存一个引用(指针)。因此在相同数据量下,链 表比数组占用更多的内存空间。 /* 链表节点类 */ class ListNode { var val: Int // 节点值 var next: ListNode? // 指向下一节点的引用 节点的引用两项数据。我们将首 个节点称为头节点,将最后一个节点称为尾节点,尾节点指向空 None 。 ‧ 环形链表:如果我们令单向链表的尾节点指向头节点(即首尾相接),则得到一个环形链表。在环形链 表中,任意节点都可以视作头节点。 ‧ 双向链表:与单向链表相比,双向链表记录了两个方向的引用。双向链表的节点定义同时包含指向后继 节点(下一个节点)和前驱节点(上一个节点)的引用(指针)。相较于单向链表,双向链表更具灵活 ‧ 栈与队列:当插入和删除操作都在链表的一端进行时,它表现出先进后出的的特性,对应栈;当插入操 作在链表的一端进行,删除操作在链表的另一端进行,它表现出先进先出的特性,对应队列。 ‧ 哈希表:链地址法是解决哈希冲突的主流方案之一,在该方案中,所有冲突的元素都会被放到一个链表 中。 ‧ 图:邻接表是表示图的一种常用方式,在其中,图的每个顶点都与一个链表相关联,链表中的每个元素 都代表与该顶点相连的其他顶点。0 码力 | 376 页 | 30.70 MB | 1 年前3
Hello 算法 1.0.0b1 Swift版相比于「线性探测」,「多次哈希」方法更不容易产生聚集,代价是多个哈希函数增加了额外计算量。 � 工业界方案 Java 采用「链式地址」。在 JDK 1.8 之后,HashMap 内数组长度大于 64 时,长度大于 8 的链 表会被转化为「红黑树」,以提升查找性能。 Python 采用「开放寻址」。字典 dict 使用伪随机数进行探测。 6.3. 小结 ‧ 向哈希表中输入一个键 key ,查询到值 value 的时间复杂度为 hello‑algo.com 98 Figure 7‑7. 平衡二叉树 7.1.4. 二叉树的退化 当二叉树的每层的结点都被填满时,达到「完美二叉树」;而当所有结点都偏向一边时,二叉树退化为「链 表」。 ‧ 完美二叉树是一个二叉树的“最佳状态”,可以完全发挥出二叉树“分治”的优势; ‧ 链表则是另一个极端,各项操作都变为线性操作,时间复杂度退化至 ?(?) ; Figure 7‑8. 二叉树的术语较多,包括根结点、叶结点、层、度、边、高度、深度等。 ‧ 二叉树的初始化、结点插入、结点删除操作与链表的操作方法类似。 ‧ 常见的二叉树类型包括完美二叉树、完全二叉树、完满二叉树、平衡二叉树。完美二叉树是理想状态,链 表则是退化后的最差状态。 ‧ 二叉树可以使用数组表示,具体做法是将结点值和空位按照层序遍历的顺序排列,并基于父结点和子结 点之间的索引映射公式实现指针。 二叉树遍历 ‧ 二叉树层序遍历是一0 码力 | 190 页 | 14.71 MB | 1 年前3
Hello 算法 1.0.0b2 Swift版相比于「线性探测」,「多次哈希」方法更不容易产生聚集,代价是多个哈希函数增加了额外计算量。 � 工业界方案 Java 采用「链式地址」。在 JDK 1.8 之后,HashMap 内数组长度大于 64 时,长度大于 8 的链 表会被转化为「红黑树」,以提升查找性能。 Python 采用「开放寻址」。字典 dict 使用伪随机数进行探测。 Golang 采用「链式地址」。Go 规定每个桶最多存储 8 个键值对,超出容量则连接一个溢出桶; hello‑algo.com 98 Figure 7‑7. 平衡二叉树 7.1.4. 二叉树的退化 当二叉树的每层的结点都被填满时,达到「完美二叉树」;而当所有结点都偏向一边时,二叉树退化为「链 表」。 ‧ 完美二叉树是一个二叉树的“最佳状态”,可以完全发挥出二叉树“分治”的优势; ‧ 链表则是另一个极端,各项操作都变为线性操作,时间复杂度退化至 ?(?) ; Figure 7‑8. 二叉树的术语较多,包括根结点、叶结点、层、度、边、高度、深度等。 ‧ 二叉树的初始化、结点插入、结点删除操作与链表的操作方法类似。 ‧ 常见的二叉树类型包括完美二叉树、完全二叉树、完满二叉树、平衡二叉树。完美二叉树是理想状态,链 表则是退化后的最差状态。 ‧ 二叉树可以使用数组表示,具体做法是将结点值和空位按照层序遍历的顺序排列,并基于父结点和子结 点之间的索引映射公式实现指针。 二叉树遍历 ‧ 二叉树层序遍历是一0 码力 | 199 页 | 15.72 MB | 1 年前3
从 Swift 到机器学习
- 王巍我(们)的出路路在哪⾥里里 ⼤大前端 React Native Weex ⼩小程序 Flutter 机器器学习 深度学习 计算机视觉 ⾃自然语⾔言处理理 ⻛风格化图像处理理 其余的出路路 区块链 P2P信贷 做个快乐的肥宅 ? 做个快乐的肥宅 I have an idea! App: 普尔亚后援会 • 使⽤用相机或者照⽚片库 • 识别照⽚片中的普尔亚⼿手势 • 收集到三张照⽚片获得奖励0 码力 | 64 页 | 4.32 MB | 1 年前3
Hello 算法 1.1.0 Swift版在 C、C++、Go 和 Rust 等支持指针的语言中,上述“引用”应被替换为“指针”。 如以下代码所示,链表节点 ListNode 除了包含值,还需额外保存一个引用(指针)。因此在相同数据量下,链 表比数组占用更多的内存空间。 /* 链表节点类 */ class ListNode { var val: Int // 节点值 var next: ListNode? // 指向下一节点的引用 (1) 。 ‧ 划分阶段:可以使用“迭代”替代“递归”来实现链表划分工作,从而省去递归使用的栈帧空间。 ‧ 合并阶段:在链表中,节点增删操作仅需改变引用(指针)即可实现,因此合并阶段(将两个短有序链 表合并为一个长有序链表)无须创建额外链表。 具体实现细节比较复杂,有兴趣的读者可以查阅相关资料进行学习。 11.7 堆排序 Tip 阅读本节前,请确保已学完“堆“章节。 堆排序(heap0 码力 | 379 页 | 18.47 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Swift 版在 C、C++、Go 和 Rust 等支持指针的语言中,上述“引用”应被替换为“指针”。 如以下代码所示,链表节点 ListNode 除了包含值,还需额外保存一个引用(指针)。因此在相同数据量下,链 表比数组占用更多的内存空间。 /* 链表节点类 */ class ListNode { var val: Int // 节点值 var next: ListNode? // 指向下一节点的引用 (1) 。 ‧ 划分阶段:可以使用“迭代”替代“递归”来实现链表划分工作,从而省去递归使用的栈帧空间。 ‧ 合并阶段:在链表中,节点增删操作仅需改变引用(指针)即可实现,因此合并阶段(将两个短有序链 表合并为一个长有序链表)无须创建额外链表。 具体实现细节比较复杂,有兴趣的读者可以查阅相关资料进行学习。 11.7 堆排序 Tip 阅读本节前,请确保已学完“堆“章节。 堆排序(heap0 码力 | 379 页 | 18.48 MB | 10 月前3
Hello 算法 1.0.0 Swift版在 C、C++、Go 和 Rust 等支持指针的语言中,上述“引用”应被替换为“指针”。 如以下代码所示,链表节点 ListNode 除了包含值,还需额外保存一个引用(指针)。因此在相同数据量下,链 表比数组占用更多的内存空间。 /* 链表节点类 */ class ListNode { var val: Int // 节点值 var next: ListNode? // 指向下一节点的引用 (1) 。 ‧ 划分阶段:可以使用“迭代”替代“递归”来实现链表划分工作,从而省去递归使用的栈帧空间。 ‧ 合并阶段:在链表中,节点增删操作仅需改变引用(指针)即可实现,因此合并阶段(将两个短有序链 表合并为一个长有序链表)无须创建额外链表。 具体实现细节比较复杂,有兴趣的读者可以查阅相关资料进行学习。 第 11 章 排序 hello‑algo.com 244 11.7 堆排序 � 阅读本节前,请确保已学完“堆“章节。0 码力 | 378 页 | 17.59 MB | 1 年前3
共 7 条
- 1













