Hello 算法 1.1.0 C++ 版克隆仓库与下载代码 第三步:运行源代码。如图 0‑5 所示,对于顶部标有文件名称的代码块,我们可以在仓库的 codes 文件夹内 找到对应的源代码文件。源代码文件可一键运行,将帮助你节省不必要的调试时间,让你能够专注于学习内 容。 图 0‑5 代码块与对应的源代码文件 除了本地运行代码,网页版还支持 Python 代码的可视化运行(基于 pythontutor 实现)。如图 0‑6 所示,你 (?) 的一个渐近上界,记为 ?(?) = ?(?(?)) 。 如图 2‑8 所示,计算渐近上界就是寻找一个函数 ?(?) ,使得当 ? 趋向于无穷大时,?(?) 和 ?(?) 处于相同 的增长级别,仅相差一个常数项 ? 的倍数。 第 2 章 复杂度分析 hello‑algo.com 31 图 2‑8 函数的渐近上界 2.3.3 推算方法 渐近上界的数学味儿有点重,如果你感觉没有完全理 100000; for (int i = 0; i < size; i++) count++; return count; } 2. 线性阶 ?(?) 线性阶的操作数量相对于输入数据大小 ? 以线性级别增长。线性阶通常出现在单层循环中: // === File: time_complexity.cpp === /* 线性阶 */ int linear(int n) { int count =0 码力 | 379 页 | 18.47 MB | 1 年前3
Hello 算法 1.0.0 C++版克隆仓库与下载代码 第三步:运行源代码。如图 0‑5 所示,对于顶部标有文件名称的代码块,我们可以在仓库的 codes 文件夹内 找到对应的源代码文件。源代码文件可一键运行,将帮助你节省不必要的调试时间,让你能够专注于学习内 容。 图 0‑5 代码块与对应的源代码文件 除了本地运行代码,网页版还支持 Python 代码的可视化运行(基于 pythontutor 实现)。如图 0‑6 所示,你 (?) 的一个渐近上界,记为 ?(?) = ?(?(?)) 。 如图 2‑8 所示,计算渐近上界就是寻找一个函数 ?(?) ,使得当 ? 趋向于无穷大时,?(?) 和 ?(?) 处于相同 的增长级别,仅相差一个常数项 ? 的倍数。 第 2 章 复杂度分析 hello‑algo.com 31 图 2‑8 函数的渐近上界 2.3.3 推算方法 渐近上界的数学味儿有点重,如果你感觉没有完全理 100000; for (int i = 0; i < size; i++) count++; return count; } 2. 线性阶 ?(?) 线性阶的操作数量相对于输入数据大小 ? 以线性级别增长。线性阶通常出现在单层循环中: // === File: time_complexity.cpp === /* 线性阶 */ int linear(int n) { int count =0 码力 | 378 页 | 17.59 MB | 1 年前3
Hello 算法 1.2.0 简体中文 C++ 版克隆仓库与下载代码 第三步:运行源代码。如图 0‑5 所示,对于顶部标有文件名称的代码块,我们可以在仓库的 codes 文件夹内 找到对应的源代码文件。源代码文件可一键运行,将帮助你节省不必要的调试时间,让你能够专注于学习内 容。 图 0‑5 代码块与对应的源代码文件 除了本地运行代码,网页版还支持 Python 代码的可视化运行(基于 pythontutor 实现)。如图 0‑6 所示,你 (?) 的一个渐近上界,记为 ?(?) = ?(?(?)) 。 如图 2‑8 所示,计算渐近上界就是寻找一个函数 ?(?) ,使得当 ? 趋向于无穷大时,?(?) 和 ?(?) 处于相同 的增长级别,仅相差一个常数项 ? 的倍数。 第 2 章 复杂度分析 www.hello‑algo.com 31 图 2‑8 函数的渐近上界 2.3.3 推算方法 渐近上界的数学味儿有点重,如果你感觉没 100000; for (int i = 0; i < size; i++) count++; return count; } 2. 线性阶 ?(?) 线性阶的操作数量相对于输入数据大小 ? 以线性级别增长。线性阶通常出现在单层循环中: // === File: time_complexity.cpp === /* 线性阶 */ int linear(int n) { int count =0 码力 | 379 页 | 18.48 MB | 10 月前3
Hello 算法 1.0.0b1 C++版ZIP”直接下载代码压缩包,本地解压即可。 Figure 0‑5. 克隆仓库与下载代码 第三步:运行源代码。若代码块的顶部标有文件名称,则可在仓库 codes 文件夹中找到对应的 源代码文件。源 代码文件可以帮助你省去不必要的调试时间,将精力集中在学习内容上。 0. 写在前面 hello‑algo.com 6 Figure 0‑6. 代码块与对应的源代码文件 0.2.5. 在提问讨论中共同成长 阅读本书时,请不要“惯 ?(?) = ?(?(?)) Figure 2‑2. 函数的渐近上界 本质上看,计算渐近上界就是在找一个函数 ?(?) ,使得在 ? 趋向于无穷大时,?(?) 和 ?(?) 处于相同的增 长级别(仅相差一个常数项 ? 的倍数)。 2. 复杂度分析 hello‑algo.com 17 � 渐近上界的数学味儿有点重,如果你感觉没有完全理解,无需担心,因为在实际使用中我们只 需要会推算即可,数学意义可以慢慢领悟。 = 100000; for (int i = 0; i < size; i++) count++; return count; } 线性阶 ?(?) 线性阶的操作数量相对输入数据大小成线性级别增长。线性阶常出现于单层循环。 // === File: time_complexity.cpp === /* 线性阶 */ int linear(int n) { int count = 0;0 码力 | 187 页 | 14.71 MB | 1 年前3
Hello 算法 1.0.0b2 C++版ZIP”直接下载代码压缩包,本地解压即可。 Figure 0‑5. 克隆仓库与下载代码 第三步:运行源代码。若代码块的顶部标有文件名称,则可在仓库 codes 文件夹中找到对应的 源代码文件。源 代码文件可以帮助你省去不必要的调试时间,将精力集中在学习内容上。 0. 写在前面 hello‑algo.com 6 Figure 0‑6. 代码块与对应的源代码文件 0.2.5. 在提问讨论中共同成长 阅读本书时,请不要“惯 ?(?) = ?(?(?)) Figure 2‑2. 函数的渐近上界 本质上看,计算渐近上界就是在找一个函数 ?(?) ,使得在 ? 趋向于无穷大时,?(?) 和 ?(?) 处于相同的增 长级别(仅相差一个常数项 ? 的倍数)。 2. 复杂度分析 hello‑algo.com 17 � 渐近上界的数学味儿有点重,如果你感觉没有完全理解,无需担心,因为在实际使用中我们只 需要会推算即可,数学意义可以慢慢领悟。 = 100000; for (int i = 0; i < size; i++) count++; return count; } 线性阶 ?(?) 线性阶的操作数量相对输入数据大小成线性级别增长。线性阶常出现于单层循环。 // === File: time_complexity.cpp === /* 线性阶 */ int linear(int n) { int count = 0;0 码力 | 197 页 | 15.72 MB | 1 年前3
Hello 算法 1.0.0b4 C++版com 5 Figure 0‑4. 克隆仓库与下载代码 第三步:运行源代码。如果代码块顶部标有文件名称,则可以在仓库的 codes 文件夹中找到相应的源代码文 件。源代码文件将帮助你节省不必要的调试时间,让你能够专注于学习内容。 Figure 0‑5. 代码块与对应的源代码文件 0.2.4. 在提问讨论中共同成长 阅读本书时,请不要“惯着”那些没学明白的知识点。欢迎在评论区提出你的问题,我和其他小伙伴们将竭 ?(?) = ?(?(?)) Figure 2‑2. 函数的渐近上界 从本质上讲,计算渐近上界就是寻找一个函数 ?(?) ,使得当 ? 趋向于无穷大时,?(?) 和 ?(?) 处于相同 的增长级别,仅相差一个常数项 ? 的倍数。 2.2.4. 推算方法 渐近上界的数学味儿有点重,如果你感觉没有完全理解,也无需担心。因为在实际使用中,我们只需要掌握 推算方法,数学意义可以逐渐领悟。 2 100000; for (int i = 0; i < size; i++) count++; return count; } 线性阶 ?(?) 线性阶的操作数量相对于输入数据大小以线性级别增长。线性阶通常出现在单层循环中。 // === File: time_complexity.cpp === /* 线性阶 */ int linear(int n) { int count =0 码力 | 343 页 | 27.39 MB | 1 年前3
Hello 算法 1.0.0b5 C++版克隆仓库与下载代码 第三步:运行源代码。如图 0‑5 所示,对于顶部标有文件名称的代码块,我们可以在仓库的 codes 文件夹内 找到对应的源代码文件。源代码文件可一键运行,将帮助你节省不必要的调试时间,让你能够专注于学习内 容。 图 0‑5 代码块与对应的源代码文件 0.2.4 在提问讨论中共同成长 在阅读本书时,请不要轻易跳过那些没学明白的知识点。欢迎在评论区提出你的问题,我和小伙伴们将竭诚 (?) 的一个渐近上界,记为 ?(?) = ?(?(?)) 。 如图 2‑8 所示,计算渐近上界就是寻找一个函数 ?(?) ,使得当 ? 趋向于无穷大时,?(?) 和 ?(?) 处于相同 的增长级别,仅相差一个常数项 ? 的倍数。 图 2‑8 函数的渐近上界 第 2 章 复杂度分析 hello‑algo.com 29 2.3.3 推算方法 渐近上界的数学味儿有点重,如果你感觉没有完全理 100000; for (int i = 0; i < size; i++) count++; return count; } 2. 线性阶 ?(?) 线性阶的操作数量相对于输入数据大小 ? 以线性级别增长。线性阶通常出现在单层循环中: // === File: time_complexity.cpp === /* 线性阶 */ int linear(int n) { int count =0 码力 | 377 页 | 30.69 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 11 现代 CMake 进阶指南放到 src 目录下 。 第 2 章:项目配置变量 CMAKE_BUILD_TYPE 构建的类型,调试模式还是发布模式 • CMAKE_BUILD_TYPE 是 CMake 中一个特殊的变量,用于控制构建类型,他的值可以 是: • Debug 调试模式,完全不优化,生成调试信息,方便调试程序 • Release 发布模式,优化程度最高,性能最佳,但是编译比 Debug 慢 • MinSizeRel MinSizeRel 最小体积发布,生成的文件比 Release 更小,不完全优化,减少二进制体积 • RelWithDebInfo 带调试信息发布,生成的文件比 Release 更大,因为带有调试的符号信 息 • 默认情况下 CMAKE_BUILD_TYPE 为空字符串,这时相当于 Debug 。 各种构建模式在编译器选项上的区别 • 在 Release 模式下,追求的是程序的最佳性能表现,在此情况下,编译器会对程序做最大 模式下,追求的是程序的最佳性能表现,在此情况下,编译器会对程序做最大 的代码优化以达到最快运行速度。另一方面,由于代码优化后不与源代码一致,此模式下 一般会丢失大量的调试信息。 1. Debug: `-O0 -g` 2. Release: `-O3 -DNDEBUG` 3. MinSizeRel: `-Os -DNDEBUG` 4. RelWithDebInfo: `-O2 -g -DNDEBUG` • 此外,注意定义了0 码力 | 166 页 | 6.54 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串个字符。 • 区别在于 at 如果遇到 i 越界的情况,也就是检测到 i ≥ s.size() 时,会抛出 std::out_of_range 异常终止程序。使用 gdb 等调试 器就可以在出这个异常的时候暂停,帮你调试错误 ( BV1kP4y1K7Eo )。也可以从外部函数 catch 住这个异常(以 后再讲)。 • 而 [] 则不会抛出异常,他只是简单地给字符串的首地址指针和 i 做个 + 和 += 比 append 更直观,而且只要配合 string_view ,性能上就没有区别了,为什么不用呢? • 先把程序写出来,结果跑对了,再来考虑什么优化的问题。 • 直观的程序更容易调试,而 + 是非常直观的。——沃兹基硕德 • 小彭老师锐评:跑之前先学会走,反对心理作用优化、性能强迫症 。 • 围棋术语说:本手,妙手,俗手。 • 可能你以为自己这一步是妙手,其实是擦粑粑的手。 string_view 源码大赏 标准库 string 源码解析 第 8 章 string 的本质是 basic_string string 的本质是 basic_string • 所以在调试的时候经常会看到 string 被 c++filt 解析为 basic_string, allocator > 。 • 因为 std::string 0 码力 | 162 页 | 40.20 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 17 由浅入深学习 map 容器Python 对比 • Python 中 val = m[“key”] 读取元素,找不到键值会出错,调试时更早发现错误。 • C++ 中 val = m[“key”] 读取元素,找不到键值不会出错而是默默创建,还初始化为 0 。 • C++ 中 val = m.at(“key”) 读取元素,找不到键值会出错,调试时更早发现错误。 • 所以 C++ 中读取元素,应该用 at() 才对, at() 在读取时和多数语言的 行为一致。 • 很多初学者都会错误使用 [] 读取元素,他以为找不到键值会报错,结果他不报错,默默创 建了个 0 返回给你,导致实际报错的地方滞后,没发现错误在 map 的读取这里,严重影 响他的调试效率( javascript 的 undefined 直呼内行)。 写入 map 元素 • mapm; • 写入 map 中指定键值的元素有两种方法。 • m[“key”] 0 码力 | 90 页 | 8.76 MB | 1 年前3
共 17 条
- 1
- 2













