Hello 算法 1.0.0b4 C++版
中的每个字符 占用 1 字节,“算法”中的每个字符占用 2 字节。我们可以通过高位填 0 ,将“Hello 算法”中的所有字符都 编码为 2 字节长度。这样系统就可以每隔 2 字节解析一个字符,恢复出这个短语的内容了。 Figure 3‑7. Unicode 编码示例 然而,ASCII 码已经向我们证明,编码英文只需要 1 字节。若采用上述方案,英文文本占用空间的大小将会 是 ASCII 树的任意节点的平衡因子皆满足 −1 ≤ ? ≤ 1 。 7.5.2. AVL 树旋转 AVL 树的特点在于「旋转 Rotation」操作,它能够在不影响二叉树的中序遍历序列的前提下,使失衡节点重 新恢复平衡。换句话说,旋转操作既能保持树的「二叉搜索树」属性,也能使树重新变为「平衡二叉树」。 我们将平衡因子绝对值 > 1 的节点称为「失衡节点」。根据节点失衡情况的不同,旋转操作分为四种:右旋、 如下图所示,节点下方为平衡因子。从底至顶看,二叉树中首个失衡节点是“节点 3”。我们关注以该失衡节 点为根节点的子树,将该节点记为 node ,其左子节点记为 child ,执行「右旋」操作。完成右旋后,子树已 经恢复平衡,并且仍然保持二叉搜索树的特性。 Figure 7‑26. 右旋操作步骤 此外,如果节点 child 本身有右子节点(记为 grandChild ),则需要在「右旋」中添加一步:将 grandChild0 码力 | 343 页 | 27.39 MB | 1 年前3Hello 算法 1.1.0 C++ 版
系。 1. 递:当函数被调用时,系统会在“调用栈”上为该函数分配新的栈帧,用于存储函数的局部变量、参数、 返回地址等数据。 2. 归:当函数完成执行并返回时,对应的栈帧会被从“调用栈”上移除,恢复之前函数的执行环境。 因此,我们可以使用一个显式的栈来模拟调用栈的行为,从而将递归转化为迭代形式: // === File: recursion.cpp === /* 使用迭代模拟递归 */ 所示,“Hello”中的每个字 符占用 1 字节,“算法”中的每个字符占用 2 字节。我们可以通过高位填 0 将“Hello 算法”中的所有字符都 编码为 2 字节长度。这样系统就可以每隔 2 字节解析一个字符,恢复这个短语的内容了。 图 3‑7 Unicode 编码示例 然而 ASCII 码已经向我们证明,编码英文只需 1 字节。若采用上述方案,英文文本占用空间的大小将会是 ASCII 编码下的两倍,非 ,则一棵 AVL 树的任意节点的平衡因子皆满足 −1 ≤ ? ≤ 1 。 7.5.2 AVL 树旋转 AVL 树的特点在于“旋转”操作,它能够在不影响二叉树的中序遍历序列的前提下,使失衡节点重新恢复平 衡。换句话说,旋转操作既能保持“二叉搜索树”的性质,也能使树重新变为“平衡二叉树”。 我们将平衡因子绝对值 > 1 的节点称为“失衡节点”。根据节点失衡情况的不同,旋转操作分为四种:右旋、0 码力 | 379 页 | 18.47 MB | 1 年前3Hello 算法 1.0.0 C++版
系。 1. 递:当函数被调用时,系统会在“调用栈”上为该函数分配新的栈帧,用于存储函数的局部变量、参数、 返回地址等数据。 2. 归:当函数完成执行并返回时,对应的栈帧会被从“调用栈”上移除,恢复之前函数的执行环境。 因此,我们可以使用一个显式的栈来模拟调用栈的行为,从而将递归转化为迭代形式: // === File: recursion.cpp === /* 使用迭代模拟递归 */ 所示,“Hello”中的每个字 符占用 1 字节,“算法”中的每个字符占用 2 字节。我们可以通过高位填 0 将“Hello 算法”中的所有字符都 编码为 2 字节长度。这样系统就可以每隔 2 字节解析一个字符,恢复这个短语的内容了。 图 3‑7 Unicode 编码示例 然而 ASCII 码已经向我们证明,编码英文只需 1 字节。若采用上述方案,英文文本占用空间的大小将会是 ASCII 编码下的两倍,非 ,则一棵 AVL 树的任意节点的平衡因子皆满足 −1 ≤ ? ≤ 1 。 7.5.2 AVL 树旋转 AVL 树的特点在于“旋转”操作,它能够在不影响二叉树的中序遍历序列的前提下,使失衡节点重新恢复平 衡。换句话说,旋转操作既能保持“二叉搜索树”的性质,也能使树重新变为“平衡二叉树”。 我们将平衡因子绝对值 > 1 的节点称为“失衡节点”。根据节点失衡情况的不同,旋转操作分为四种:右旋、0 码力 | 378 页 | 17.59 MB | 1 年前3Hello 算法 1.0.0b5 C++版
所示,“Hello”中的每个字 符占用 1 字节,“算法”中的每个字符占用 2 字节。我们可以通过高位填 0 ,将“Hello 算法”中的所有字符 都编码为 2 字节长度。这样系统就可以每隔 2 字节解析一个字符,恢复出这个短语的内容了。 图 3‑7 Unicode 编码示例 然而 ASCII 码已经向我们证明,编码英文只需要 1 字节。若采用上述方案,英文文本占用空间的大小将会是 ASCII 编码下大小的 ,则一棵 AVL 树的任意节点的平衡因子皆满足 −1 ≤ ? ≤ 1 。 7.5.2 AVL 树旋转 AVL 树的特点在于“旋转”操作,它能够在不影响二叉树的中序遍历序列的前提下,使失衡节点重新恢复平 衡。换句话说,旋转操作既能保持“二叉搜索树”的性质,也能使树重新变为“平衡二叉树”。 我们将平衡因子绝对值 > 1 的节点称为“失衡节点”。根据节点失衡情况的不同,旋转操作分为四种:右旋、 所示,节点下方为平衡因子。从底至顶看,二叉树中首个失衡节点是“节点 3”。我们关注以该失衡 节点为根节点的子树,将该节点记为 node ,其左子节点记为 child ,执行“右旋”操作。完成右旋后,子树 已经恢复平衡,并且仍然保持二叉搜索树的特性。 第 7 章 树 hello‑algo.com 160 图 7‑26 右旋操作步骤 如图 7‑27 所示,当节点 child 有右子节点(记为 grandChild0 码力 | 377 页 | 30.69 MB | 1 年前3Hello 算法 1.2.0 简体中文 C++ 版
系。 1. 递:当函数被调用时,系统会在“调用栈”上为该函数分配新的栈帧,用于存储函数的局部变量、参数、 返回地址等数据。 2. 归:当函数完成执行并返回时,对应的栈帧会被从“调用栈”上移除,恢复之前函数的执行环境。 因此,我们可以使用一个显式的栈来模拟调用栈的行为,从而将递归转化为迭代形式: // === File: recursion.cpp === /* 使用迭代模拟递归 */ 所示,“Hello”中的每个字 符占用 1 字节,“算法”中的每个字符占用 2 字节。我们可以通过高位填 0 将“Hello 算法”中的所有字符都 编码为 2 字节长度。这样系统就可以每隔 2 字节解析一个字符,恢复这个短语的内容了。 图 3‑7 Unicode 编码示例 然而 ASCII 码已经向我们证明,编码英文只需 1 字节。若采用上述方案,英文文本占用空间的大小将会是 ASCII 编码下的两倍,非 ,则一棵 AVL 树的任意节点的平衡因子皆满足 −1 ≤ ? ≤ 1 。 7.5.2 AVL 树旋转 AVL 树的特点在于“旋转”操作,它能够在不影响二叉树的中序遍历序列的前提下,使失衡节点重新恢复平 衡。换句话说,旋转操作既能保持“二叉搜索树”的性质,也能使树重新变为“平衡二叉树”。 我们将平衡因子绝对值 > 1 的节点称为“失衡节点”。根据节点失衡情况的不同,旋转操作分为四种:右旋、0 码力 | 379 页 | 18.48 MB | 10 月前3Hello 算法 1.0.0b1 C++版
≤ 1 。 7.4.2. AVL 树旋转 AVL 树的独特之处在于「旋转 Rotation」的操作,其可 在不影响二叉树中序遍历序列的前提下,使失衡结点 重新恢复平衡。换言之,旋转操作既可以使树保持为「二叉搜索树」,也可以使树重新恢复为「平衡二叉树」。 我们将平衡因子的绝对值 > 1 的结点称为「失衡结点」。根据结点的失衡情况,旋转操作分为 右旋、左旋、先 右旋后左旋、先左旋后右旋,接下来我们来一起来看看它们是如何操作的。 如下图所示(结点下方为「平衡因子」),从底至顶看,二叉树中首个失衡结点是 结点 3。我们聚焦在以该失衡 结点为根结点的子树上,将该结点记为 node ,将其左子结点记为 child ,执行「右旋」操作。完成右旋后,该 子树已经恢复平衡,并且仍然为二叉搜索树。 7. 树 hello‑algo.com 114 Figure 7‑25. 右旋操作步骤 进而,如果结点 child 本身有右子结点(记为 grandChild ),则需要在「右旋」中添加一步:将 updateHeight(child); // 返回旋转后子树的根结点 return child; } Case 3 ‑ 先左后右 对于下图的失衡结点 3 ,单一使用左旋或右旋都无法使子树恢复平衡,此时需要「先左旋后右旋」,即先对 child 执行「左旋」,再对 node 执行「右旋」。 Figure 7‑29. 先左旋后右旋 Case 4 ‑ 先右后左 同理,取以上失衡二叉树的镜像,则需要「先右旋后左旋」,即先对0 码力 | 187 页 | 14.71 MB | 1 年前3Hello 算法 1.0.0b2 C++版
≤ 1 。 7.4.2. AVL 树旋转 AVL 树的独特之处在于「旋转 Rotation」的操作,其可 在不影响二叉树中序遍历序列的前提下,使失衡结点 重新恢复平衡。换言之,旋转操作既可以使树保持为「二叉搜索树」,也可以使树重新恢复为「平衡二叉树」。 我们将平衡因子的绝对值 > 1 的结点称为「失衡结点」。根据结点的失衡情况,旋转操作分为 右旋、左旋、先 右旋后左旋、先左旋后右旋,接下来我们来一起来看看它们是如何操作的。 如下图所示(结点下方为「平衡因子」),从底至顶看,二叉树中首个失衡结点是 结点 3。我们聚焦在以该失衡 结点为根结点的子树上,将该结点记为 node ,将其左子结点记为 child ,执行「右旋」操作。完成右旋后,该 子树已经恢复平衡,并且仍然为二叉搜索树。 7. 树 hello‑algo.com 114 Figure 7‑25. 右旋操作步骤 进而,如果结点 child 本身有右子结点(记为 grandChild ),则需要在「右旋」中添加一步:将 updateHeight(child); // 返回旋转后子树的根结点 return child; } Case 3 ‑ 先左后右 对于下图的失衡结点 3 ,单一使用左旋或右旋都无法使子树恢复平衡,此时需要「先左旋后右旋」,即先对 child 执行「左旋」,再对 node 执行「右旋」。 Figure 7‑29. 先左旋后右旋 Case 4 ‑ 先右后左 同理,取以上失衡二叉树的镜像,则需要「先右旋后左旋」,即先对0 码力 | 197 页 | 15.72 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理
= default (续) • 如果还想让编译器自动生成默认的无参构造函数,可以用 C++11 新增的这个语法: 不过,据我所知,初始化列表 的那个构造函数就没办法通过 = default 语法恢复…… 编译器默认生成的构造函数:拷贝构造函数 • 除了无参和初始化列表构造函数外,编译器默认还会生成这样一个特殊的构造函数: • Pig(Pig const &other); • 可见他的参数是一个0 码力 | 96 页 | 16.28 MB | 1 年前3《深入浅出MFC》2/e
类别老祖宗(CObject)的对象指针来容纳 它绝对没有问题,但终不好总是如此吧!不见得这样子就能够满足你的程序需求啊。 显然,你能够以Serialize 函数写档,我能够以Serialize 函数读档,但我就是没办法恢复 你原来的状态-- 除非我的程序能够「动态生成」。 MFC 支持动态生成, 靠的是一组非常神秘的宏( DECLARE_DYNCREATE 、 IMPLEMENT_DYNCREATE)和一个非常神秘 收到WM_PAINT,表示画面需要重绘,它会调用OnDraw(注),由 OnDraw 执行真正的绘图动作。什么时候会产生重绘消息WM_PAINT 呢?当使用者改 变窗口大小,或是将窗口图标化之后再恢复原状,或是来自程序(自己或别人)刻意的 制造。除了在必须重绘时重绘之外,做为一个绘图软件,Scribble 还必须「实时」反应 鼠标左键在窗口上移动的轨迹,不能等到WM_PAINT 产生了才有所反应。所以,我们 这个名词感觉陌生,事实上它就是对象导向世界里的Persistence(永 续生存),只是后者比较抽象一些。对象必须能够永续生存,也就是它们必须能够在程 式结束时储存到文件中,并且在程序重新激活时再恢复回来。储存和恢复对象的过程在 MFC 之中就称为serialization。负责这件重要任务的,是MFC CObject 类别中一个名为 Serialize 的虚拟函数,文件的「读」「写」动作均透过它。0 码力 | 1009 页 | 11.08 MB | 1 年前3
共 9 条
- 1