 《深入浅出MFC》2/emember,亦有他书译为「数据成员」 基础类别 Base Class,亦即父类别 衍生类别 Derived Class,亦即子类别 深入淺出 MFC 34 本书符号习惯 斜体字表示函数、常数、变量、语言保留字、宏、识别码等等,例如: CreateWindow 这是Win32 函数 strtok 这是C Runtime 函数库的函数 WM_CREATE Scribble Step2-修改使用者接口(第9章):这个版本变化了菜单,使程序多 了笔宽设定功能。由于菜单的变化,也带动了工具栏与状态列的变化。 从这个版本中我们可以学习如何使用资源编辑器,制作各式各样的程序资源。为了把 菜单命令处理函数放置在适当的类别之中,我们需要深入了解所谓的Message ■ ■ ■ ■ 第0章 你㆒定要知道(導讀) 37 Mapping 和Command Step3-增加「笔划宽度对话框」(第10 章):这个版本做出「画笔宽 度对话框」,使用者可以在其中设定细笔宽度和粗笔宽度。预设的细笔为两个 图素(pixel)宽,粗笔为五个图素宽。 从这个版本中可以学习如何以对话框编辑器设计对话框模板,以ClassWizard 增设对 话盒处理函数,以及如何以MFC 提供的DDX/DDV 机制做出对话框控制组件 (control)的内容传递与内容查核。DDX(Dialog Data0 码力 | 1009 页 | 11.08 MB | 1 年前3 《深入浅出MFC》2/emember,亦有他书译为「数据成员」 基础类别 Base Class,亦即父类别 衍生类别 Derived Class,亦即子类别 深入淺出 MFC 34 本书符号习惯 斜体字表示函数、常数、变量、语言保留字、宏、识别码等等,例如: CreateWindow 这是Win32 函数 strtok 这是C Runtime 函数库的函数 WM_CREATE Scribble Step2-修改使用者接口(第9章):这个版本变化了菜单,使程序多 了笔宽设定功能。由于菜单的变化,也带动了工具栏与状态列的变化。 从这个版本中我们可以学习如何使用资源编辑器,制作各式各样的程序资源。为了把 菜单命令处理函数放置在适当的类别之中,我们需要深入了解所谓的Message ■ ■ ■ ■ 第0章 你㆒定要知道(導讀) 37 Mapping 和Command Step3-增加「笔划宽度对话框」(第10 章):这个版本做出「画笔宽 度对话框」,使用者可以在其中设定细笔宽度和粗笔宽度。预设的细笔为两个 图素(pixel)宽,粗笔为五个图素宽。 从这个版本中可以学习如何以对话框编辑器设计对话框模板,以ClassWizard 增设对 话盒处理函数,以及如何以MFC 提供的DDX/DDV 机制做出对话框控制组件 (control)的内容传递与内容查核。DDX(Dialog Data0 码力 | 1009 页 | 11.08 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 11 现代 CMake 进阶指南MinSizeRel 最小体积发布,生成的文件比 Release 更小,不完全优化,减少二进制体积 • RelWithDebInfo 带调试信息发布,生成的文件比 Release 更大,因为带有调试的符号信 息 • 默认情况下 CMAKE_BUILD_TYPE 为空字符串,这时相当于 Debug 。 各种构建模式在编译器选项上的区别 • 在 Release 模式下,追求的是程序的最佳性能表现,在此情况下,编译器会对程序做最大 (OBJECT) 替代静态库 (STATIC) 避免跨平台的麻烦 。 对象库仅仅作为组织代码的方式,而实际生成的可执行文件只有一个,减轻了部署的困难。 静态库的麻烦: GCC 编译器自作聪明,会自动剔除没有引用符号的那些对 象 对象库可以绕开编译器的不统一:保证不会自动剔除没引用到的对象文件 虽然动态库也可以避免剔除没引用的对象文件,但引入了运行时链接的麻烦 add_library 无参数时,是静态库还是动态库 Windows 喜欢搞特殊 。 cd /d C:\\Program\ Files\ \(x86\)\\Microsoft\ Visual\ Studio\\2019\\ 怎么路径里动不动夹杂几个转移符、空格、特殊符号?这谁顶得住啊 。 高情商: Windows 是最适合练习你 C 语言转移符使用水平的地方 。 更通用的方式: find_package 更好的做法是用 CMake 的 find_package0 码力 | 166 页 | 6.54 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 11 现代 CMake 进阶指南MinSizeRel 最小体积发布,生成的文件比 Release 更小,不完全优化,减少二进制体积 • RelWithDebInfo 带调试信息发布,生成的文件比 Release 更大,因为带有调试的符号信 息 • 默认情况下 CMAKE_BUILD_TYPE 为空字符串,这时相当于 Debug 。 各种构建模式在编译器选项上的区别 • 在 Release 模式下,追求的是程序的最佳性能表现,在此情况下,编译器会对程序做最大 (OBJECT) 替代静态库 (STATIC) 避免跨平台的麻烦 。 对象库仅仅作为组织代码的方式,而实际生成的可执行文件只有一个,减轻了部署的困难。 静态库的麻烦: GCC 编译器自作聪明,会自动剔除没有引用符号的那些对 象 对象库可以绕开编译器的不统一:保证不会自动剔除没引用到的对象文件 虽然动态库也可以避免剔除没引用的对象文件,但引入了运行时链接的麻烦 add_library 无参数时,是静态库还是动态库 Windows 喜欢搞特殊 。 cd /d C:\\Program\ Files\ \(x86\)\\Microsoft\ Visual\ Studio\\2019\\ 怎么路径里动不动夹杂几个转移符、空格、特殊符号?这谁顶得住啊 。 高情商: Windows 是最适合练习你 C 语言转移符使用水平的地方 。 更通用的方式: find_package 更好的做法是用 CMake 的 find_package0 码力 | 166 页 | 6.54 MB | 1 年前3
 现代C++ 教程:高速上手C++11/14/17/20$(LDFLAGS_COMMON) -o $(TARGET) clean: rm -rf *.o $(TARGET) 注意:Makefile 中的缩进是制表符而不是空格符,如果你直接复制这段代码到你的编辑器中, 制表符可能会被自动替换掉,请自行确保在 Makefile 中的缩进是由制表符完成的。 如果你还不知道 Makefile 的使用也没有关系,本教程中不会构建过于复杂的代码,简单的 在命令行中使用 std::function 成为了可能。 左值、右值的纯右值、将亡值、右值 要弄明白右值引用到底是怎么一回事,必须要对左值和右值做一个明确的理解。 左值 (lvalue, left value),顾名思义就是赋值符号左边的值。准确来说,左值是表达式(不一定是赋 值表达式)后依然存在的持久对象。 右值 (rvalue, right value),右边的值,是指表达式结束后就不再存在的临时对象。 而 C++11 进行匹配。 57 6.1 正则表达式简介 第 6 章正则表达式 普通字符 普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所 有数字、所有标点符号和一些其他符号。 特殊字符 特殊字符是正则表达式里有特殊含义的字符,也是正则表达式的核心匹配语法。参见下表: 特别字 符 描述 $ 匹配输入字符串的结尾位置。 (,) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。0 码力 | 83 页 | 2.42 MB | 1 年前3 现代C++ 教程:高速上手C++11/14/17/20$(LDFLAGS_COMMON) -o $(TARGET) clean: rm -rf *.o $(TARGET) 注意:Makefile 中的缩进是制表符而不是空格符,如果你直接复制这段代码到你的编辑器中, 制表符可能会被自动替换掉,请自行确保在 Makefile 中的缩进是由制表符完成的。 如果你还不知道 Makefile 的使用也没有关系,本教程中不会构建过于复杂的代码,简单的 在命令行中使用 std::function 成为了可能。 左值、右值的纯右值、将亡值、右值 要弄明白右值引用到底是怎么一回事,必须要对左值和右值做一个明确的理解。 左值 (lvalue, left value),顾名思义就是赋值符号左边的值。准确来说,左值是表达式(不一定是赋 值表达式)后依然存在的持久对象。 右值 (rvalue, right value),右边的值,是指表达式结束后就不再存在的临时对象。 而 C++11 进行匹配。 57 6.1 正则表达式简介 第 6 章正则表达式 普通字符 普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所 有数字、所有标点符号和一些其他符号。 特殊字符 特殊字符是正则表达式里有特殊含义的字符,也是正则表达式的核心匹配语法。参见下表: 特别字 符 描述 $ 匹配输入字符串的结尾位置。 (,) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。0 码力 | 83 页 | 2.42 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 12 从计算机组成原理看 C 语言指针数据删除 ] 嘛。 有符号整数 vs 无符号整数 • 有时候我们是需要表示负数的。而刚刚那种二进制的做法,只能表示正数和零。 • 怎么办?可能有的同学会想,不妨这样来设计:让二进制的最高位表示符号位。 • 比如 00000011 表示 3 , 10000011 表示 -3 ,这样不就区分开来了吗?这叫做原码表示 法。 • 的确可以,这种表示方式牺牲了一位作为符号位,剩下 7 位继续表示值。 位继续表示值。 • 这样的设计下无符号可以表示 0 到 255 ,而有符号可以表示 -127 到 127 。 • 但是有一个问题,那 00000000 就表示 0 , 10000000 就表示 -0 ,而 0 有没有负号其 实无所谓, 0 和 -0 根本是同一个数,却有着不同的表示,这显然不对吧? • 因此,可以如 10000000 实际上表示 -1 , 11111111 则表示 -128 ,让负数部分整体“平 -0 这种奇怪的东西了,而且表示范围也扩大了一位,虽然是扩 大在负数部分。 有符号整数 vs 无符号整数 • 刚刚说的让 10000000 表示 -1 , 11111111 表示 -128 的方法就叫做反码表示法。 • 但是这样还有一个问题,那就是硬件电路上,需要完全重新设计,对符号位做一些特殊判 断,才能支持有符号整数的加减法,因此如今的计算机都采用了一种更聪明的表示法: • 他们让 111111110 码力 | 128 页 | 2.95 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 12 从计算机组成原理看 C 语言指针数据删除 ] 嘛。 有符号整数 vs 无符号整数 • 有时候我们是需要表示负数的。而刚刚那种二进制的做法,只能表示正数和零。 • 怎么办?可能有的同学会想,不妨这样来设计:让二进制的最高位表示符号位。 • 比如 00000011 表示 3 , 10000011 表示 -3 ,这样不就区分开来了吗?这叫做原码表示 法。 • 的确可以,这种表示方式牺牲了一位作为符号位,剩下 7 位继续表示值。 位继续表示值。 • 这样的设计下无符号可以表示 0 到 255 ,而有符号可以表示 -127 到 127 。 • 但是有一个问题,那 00000000 就表示 0 , 10000000 就表示 -0 ,而 0 有没有负号其 实无所谓, 0 和 -0 根本是同一个数,却有着不同的表示,这显然不对吧? • 因此,可以如 10000000 实际上表示 -1 , 11111111 则表示 -128 ,让负数部分整体“平 -0 这种奇怪的东西了,而且表示范围也扩大了一位,虽然是扩 大在负数部分。 有符号整数 vs 无符号整数 • 刚刚说的让 10000000 表示 -1 , 11111111 表示 -128 的方法就叫做反码表示法。 • 但是这样还有一个问题,那就是硬件电路上,需要完全重新设计,对符号位做一些特殊判 断,才能支持有符号整数的加减法,因此如今的计算机都采用了一种更聪明的表示法: • 他们让 111111110 码力 | 128 页 | 2.95 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 15 C++ 系列课:字符与字符串org/wiki/ASCII 计算机如何表达字符 • 众所周知,计算机只能处理二进制 整数,字符要怎么办呢? • 于是就有了 ASCII 码表,他规定, 每个英文字符(包括大小写字母、 数字、特殊符号)都对应着一个整 数。在计算机里只要存储这个的整 数,就能代表这个字符了。 • 例如 32 代表空格, 48 代表 ‘ 0’ , 65 代表 ‘ A’ , 97 代表 ‘ a’…… • 32~126 char 是无符号 8 位整数, signed char 是有 符号 8 位整数,而 char 类型只需是 8 位整数即可,可以是有符号也可以 是无符号,任凭编译器决定( C 标准委员会传统异能, khronos 直呼内行) 。 • 以 GCC 为例,他规定 char 在 x86 架构是有符号的 (char = signed char) ,而在 arm 架构上则认为是无符号的 (char = = unsigned char) ,因为他 认为“ arm 的指令集处理无符号 8 位整数更高效”,所以擅自把 char 魔改成无 符号的…… • 顺便一提, C++ 标准保证 char , signed char , unsigned char 是三个完全 不同的类型, std::is_same_v 分别判断他们总会得到 false ,无论 x86 还是 arm 。 • 但是奇葩的 C 语言却规定0 码力 | 162 页 | 40.20 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 15 C++ 系列课:字符与字符串org/wiki/ASCII 计算机如何表达字符 • 众所周知,计算机只能处理二进制 整数,字符要怎么办呢? • 于是就有了 ASCII 码表,他规定, 每个英文字符(包括大小写字母、 数字、特殊符号)都对应着一个整 数。在计算机里只要存储这个的整 数,就能代表这个字符了。 • 例如 32 代表空格, 48 代表 ‘ 0’ , 65 代表 ‘ A’ , 97 代表 ‘ a’…… • 32~126 char 是无符号 8 位整数, signed char 是有 符号 8 位整数,而 char 类型只需是 8 位整数即可,可以是有符号也可以 是无符号,任凭编译器决定( C 标准委员会传统异能, khronos 直呼内行) 。 • 以 GCC 为例,他规定 char 在 x86 架构是有符号的 (char = signed char) ,而在 arm 架构上则认为是无符号的 (char = = unsigned char) ,因为他 认为“ arm 的指令集处理无符号 8 位整数更高效”,所以擅自把 char 魔改成无 符号的…… • 顺便一提, C++ 标准保证 char , signed char , unsigned char 是三个完全 不同的类型, std::is_same_v 分别判断他们总会得到 false ,无论 x86 还是 arm 。 • 但是奇葩的 C 语言却规定0 码力 | 162 页 | 40.20 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 性能优化之无分支编程 Branchless Programming含义 英文全称 le 小于等于(有符号) less or equal ge 大于等于(有符号) greater or equal l 小于(有符号) less g 大于(有符号) greater be 小于等于(无符号) below or equal ae 大于等于(无符号) above or equal b 小于(无符号) below a 大于(无符号) above e 等于 equal0 码力 | 47 页 | 8.45 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 性能优化之无分支编程 Branchless Programming含义 英文全称 le 小于等于(有符号) less or equal ge 大于等于(有符号) greater or equal l 小于(有符号) less g 大于(有符号) greater be 小于等于(无符号) below or equal ae 大于等于(无符号) above or equal b 小于(无符号) below a 大于(无符号) above e 等于 equal0 码力 | 47 页 | 8.45 MB | 1 年前3
 C++高性能并行编程与优化 -  课件 - 10 从稀疏数据结构到量化数据类型如果 b 是常数且为 2 的幂次方,编译器会检测到, 并替换为更高效的位运算,反而减少了计算量。 • 此外如果 b 一定是 2 的幂次方,那么 (unsigned)a % b 也可以(先转换成无符号的取模)。 高效的解决:位运算 & • 如果 b 是 2 的幂次方,即: 2, 4, 8, 16, 32 等 。 • 则: a % b = a & (b - 1) • 比如 a % 8 可以改成 Python 一样的始终向下取整除 法。 >> 2 = unsigned 类型的位运算 >> 不一样 而 unsigned 类型的 >> n 会不会复制最高位, 只是单纯的位移,这会导致负数的符号位单独被位 移,补码失效,造成结果不对。 unsigned 类型的 >> 会生成 shr 指令, signed 类型的 >> 会生成 sar 指令。 我们需要负方向无限延伸的稀疏数据结果,那就只 pointer(11).dense(8) 开源的体素处理库: OpenVDB • OpenVDB 的稀疏体积,可以存储符号距 离场 (SDF) ,也可以存储烟雾仿真的结果 等。 • 据张心欣说, OpenVDB 赢得了奥斯卡奖 。 • 因为他经常用在影视特效中,主要是符号 距离场有时比 mesh 处理起来方便很多。 OpenVDB 的设计:如果用 SNode 来表示 • hash()0 码力 | 102 页 | 9.50 MB | 1 年前3 C++高性能并行编程与优化 -  课件 - 10 从稀疏数据结构到量化数据类型如果 b 是常数且为 2 的幂次方,编译器会检测到, 并替换为更高效的位运算,反而减少了计算量。 • 此外如果 b 一定是 2 的幂次方,那么 (unsigned)a % b 也可以(先转换成无符号的取模)。 高效的解决:位运算 & • 如果 b 是 2 的幂次方,即: 2, 4, 8, 16, 32 等 。 • 则: a % b = a & (b - 1) • 比如 a % 8 可以改成 Python 一样的始终向下取整除 法。 >> 2 = unsigned 类型的位运算 >> 不一样 而 unsigned 类型的 >> n 会不会复制最高位, 只是单纯的位移,这会导致负数的符号位单独被位 移,补码失效,造成结果不对。 unsigned 类型的 >> 会生成 shr 指令, signed 类型的 >> 会生成 sar 指令。 我们需要负方向无限延伸的稀疏数据结果,那就只 pointer(11).dense(8) 开源的体素处理库: OpenVDB • OpenVDB 的稀疏体积,可以存储符号距 离场 (SDF) ,也可以存储烟雾仿真的结果 等。 • 据张心欣说, OpenVDB 赢得了奥斯卡奖 。 • 因为他经常用在影视特效中,主要是符号 距离场有时比 mesh 处理起来方便很多。 OpenVDB 的设计:如果用 SNode 来表示 • hash()0 码力 | 102 页 | 9.50 MB | 1 年前3
 Hello 算法 1.1.0 C++ 版,则以上函数的操作数量为: ?(?) = 3 + 2? ?(?) 是一次函数,说明其运行时间的增长趋势是线性的,因此它的时间复杂度是线性阶。 我们将线性阶的时间复杂度记为 ?(?) ,这个数学符号称为大 ? 记号(big‑? notation),表示函数 ?(?) 的 渐近上界(asymptotic upper bound)。 时间复杂度分析本质上是计算“操作数量 ?(?)”的渐近上界,它具有明确的数学定义。 但对于较为复杂的算法,计算平均时间复杂度往往比较困难,因为很难分析出在数据分布下的整体数学期望。 在这种情况下,我们通常使用最差时间复杂度作为算法效率的评判标准。 为什么很少看到 Θ 符号? 可能由于 ? 符号过于朗朗上口,因此我们常常使用它来表示平均时间复杂度。但从严格意义上讲,这 种做法并不规范。在本书和其他资料中,若遇到类似“平均时间复杂度 ?(?)”的表述,请将其直接 理解为 Θ( 时间复杂度用于衡量算法运行时间随数据量增长的趋势,可以有效评估算法效率,但在某些情况下可 能失效,如在输入的数据量较小或时间复杂度相同时,无法精确对比算法效率的优劣。 ‧ 最差时间复杂度使用大 ? 符号表示,对应函数渐近上界,反映当 ? 趋向正无穷时,操作数量 ?(?) 的 增长级别。 ‧ 推算时间复杂度分为两步,首先统计操作数量,然后判断渐近上界。 ‧ 常见时间复杂度从低到高排列有 ?(1)、0 码力 | 379 页 | 18.47 MB | 1 年前3 Hello 算法 1.1.0 C++ 版,则以上函数的操作数量为: ?(?) = 3 + 2? ?(?) 是一次函数,说明其运行时间的增长趋势是线性的,因此它的时间复杂度是线性阶。 我们将线性阶的时间复杂度记为 ?(?) ,这个数学符号称为大 ? 记号(big‑? notation),表示函数 ?(?) 的 渐近上界(asymptotic upper bound)。 时间复杂度分析本质上是计算“操作数量 ?(?)”的渐近上界,它具有明确的数学定义。 但对于较为复杂的算法,计算平均时间复杂度往往比较困难,因为很难分析出在数据分布下的整体数学期望。 在这种情况下,我们通常使用最差时间复杂度作为算法效率的评判标准。 为什么很少看到 Θ 符号? 可能由于 ? 符号过于朗朗上口,因此我们常常使用它来表示平均时间复杂度。但从严格意义上讲,这 种做法并不规范。在本书和其他资料中,若遇到类似“平均时间复杂度 ?(?)”的表述,请将其直接 理解为 Θ( 时间复杂度用于衡量算法运行时间随数据量增长的趋势,可以有效评估算法效率,但在某些情况下可 能失效,如在输入的数据量较小或时间复杂度相同时,无法精确对比算法效率的优劣。 ‧ 最差时间复杂度使用大 ? 符号表示,对应函数渐近上界,反映当 ? 趋向正无穷时,操作数量 ?(?) 的 增长级别。 ‧ 推算时间复杂度分为两步,首先统计操作数量,然后判断渐近上界。 ‧ 常见时间复杂度从低到高排列有 ?(1)、0 码力 | 379 页 | 18.47 MB | 1 年前3
 Hello 算法 1.0.0 C++版,则以上函数的操作数量为: ?(?) = 3 + 2? ?(?) 是一次函数,说明其运行时间的增长趋势是线性的,因此它的时间复杂度是线性阶。 我们将线性阶的时间复杂度记为 ?(?) ,这个数学符号称为「大 ? 记号 big‑? notation」,表示函数 ?(?) 的「渐近上界 asymptotic upper bound」。 时间复杂度分析本质上是计算“操作数量 ?(?)”的渐近上界,它具有明确的数学定义。 但对于较为复杂的算法,计算平均时间复杂度往往比较困难,因为很难分析出在数据分布下的整体数学期望。 在这种情况下,我们通常使用最差时间复杂度作为算法效率的评判标准。 � 为什么很少看到 Θ 符号? 可能由于 ? 符号过于朗朗上口,因此我们常常使用它来表示平均时间复杂度。但从严格意义 上讲,这种做法并不规范。在本书和其他资料中,若遇到类似“平均时间复杂度 ?(?)”的表 述,请将其直接理解为 Θ( 时间复杂度用于衡量算法运行时间随数据量增长的趋势,可以有效评估算法效率,但在某些情况下可 能失效,如在输入的数据量较小或时间复杂度相同时,无法精确对比算法效率的优劣。 ‧ 最差时间复杂度使用大 ? 符号表示,对应函数渐近上界,反映当 ? 趋向正无穷时,操作数量 ?(?) 的 增长级别。 ‧ 推算时间复杂度分为两步,首先统计操作数量,然后判断渐近上界。 ‧ 常见时间复杂度从低到高排列有 ?(1)、0 码力 | 378 页 | 17.59 MB | 1 年前3 Hello 算法 1.0.0 C++版,则以上函数的操作数量为: ?(?) = 3 + 2? ?(?) 是一次函数,说明其运行时间的增长趋势是线性的,因此它的时间复杂度是线性阶。 我们将线性阶的时间复杂度记为 ?(?) ,这个数学符号称为「大 ? 记号 big‑? notation」,表示函数 ?(?) 的「渐近上界 asymptotic upper bound」。 时间复杂度分析本质上是计算“操作数量 ?(?)”的渐近上界,它具有明确的数学定义。 但对于较为复杂的算法,计算平均时间复杂度往往比较困难,因为很难分析出在数据分布下的整体数学期望。 在这种情况下,我们通常使用最差时间复杂度作为算法效率的评判标准。 � 为什么很少看到 Θ 符号? 可能由于 ? 符号过于朗朗上口,因此我们常常使用它来表示平均时间复杂度。但从严格意义 上讲,这种做法并不规范。在本书和其他资料中,若遇到类似“平均时间复杂度 ?(?)”的表 述,请将其直接理解为 Θ( 时间复杂度用于衡量算法运行时间随数据量增长的趋势,可以有效评估算法效率,但在某些情况下可 能失效,如在输入的数据量较小或时间复杂度相同时,无法精确对比算法效率的优劣。 ‧ 最差时间复杂度使用大 ? 符号表示,对应函数渐近上界,反映当 ? 趋向正无穷时,操作数量 ?(?) 的 增长级别。 ‧ 推算时间复杂度分为两步,首先统计操作数量,然后判断渐近上界。 ‧ 常见时间复杂度从低到高排列有 ?(1)、0 码力 | 378 页 | 17.59 MB | 1 年前3
 Hello 算法 1.2.0 简体中文 C++ 版,则以上函数的操作数量为: ?(?) = 3 + 2? ?(?) 是一次函数,说明其运行时间的增长趋势是线性的,因此它的时间复杂度是线性阶。 我们将线性阶的时间复杂度记为 ?(?) ,这个数学符号称为大 ? 记号(big‑? notation),表示函数 ?(?) 的 渐近上界(asymptotic upper bound)。 时间复杂度分析本质上是计算“操作数量 ?(?)”的渐近上界,它具有明确的数学定义。 但对于较为复杂的算法,计算平均时间复杂度往往比较困难,因为很难分析出在数据分布下的整体数学期望。 在这种情况下,我们通常使用最差时间复杂度作为算法效率的评判标准。 为什么很少看到 Θ 符号? 可能由于 ? 符号过于朗朗上口,因此我们常常使用它来表示平均时间复杂度。但从严格意义上讲,这 种做法并不规范。在本书和其他资料中,若遇到类似“平均时间复杂度 ?(?)”的表述,请将其直接 理解为 Θ( 时间复杂度用于衡量算法运行时间随数据量增长的趋势,可以有效评估算法效率,但在某些情况下可 能失效,如在输入的数据量较小或时间复杂度相同时,无法精确对比算法效率的优劣。 ‧ 最差时间复杂度使用大 ? 符号表示,对应函数渐近上界,反映当 ? 趋向正无穷时,操作数量 ?(?) 的 增长级别。 ‧ 推算时间复杂度分为两步,首先统计操作数量,然后判断渐近上界。 ‧ 常见时间复杂度从低到高排列有 ?(1)、0 码力 | 379 页 | 18.48 MB | 10 月前3 Hello 算法 1.2.0 简体中文 C++ 版,则以上函数的操作数量为: ?(?) = 3 + 2? ?(?) 是一次函数,说明其运行时间的增长趋势是线性的,因此它的时间复杂度是线性阶。 我们将线性阶的时间复杂度记为 ?(?) ,这个数学符号称为大 ? 记号(big‑? notation),表示函数 ?(?) 的 渐近上界(asymptotic upper bound)。 时间复杂度分析本质上是计算“操作数量 ?(?)”的渐近上界,它具有明确的数学定义。 但对于较为复杂的算法,计算平均时间复杂度往往比较困难,因为很难分析出在数据分布下的整体数学期望。 在这种情况下,我们通常使用最差时间复杂度作为算法效率的评判标准。 为什么很少看到 Θ 符号? 可能由于 ? 符号过于朗朗上口,因此我们常常使用它来表示平均时间复杂度。但从严格意义上讲,这 种做法并不规范。在本书和其他资料中,若遇到类似“平均时间复杂度 ?(?)”的表述,请将其直接 理解为 Θ( 时间复杂度用于衡量算法运行时间随数据量增长的趋势,可以有效评估算法效率,但在某些情况下可 能失效,如在输入的数据量较小或时间复杂度相同时,无法精确对比算法效率的优劣。 ‧ 最差时间复杂度使用大 ? 符号表示,对应函数渐近上界,反映当 ? 趋向正无穷时,操作数量 ?(?) 的 增长级别。 ‧ 推算时间复杂度分为两步,首先统计操作数量,然后判断渐近上界。 ‧ 常见时间复杂度从低到高排列有 ?(1)、0 码力 | 379 页 | 18.48 MB | 10 月前3
共 22 条
- 1
- 2
- 3













