 Hello 算法 1.0.0b1 TypeScript 版需要会推算即可,数学意义可以慢慢领悟。 2.2.4. 推算方法 推算出 ?(?) 后,我们就得到时间复杂度 ?(?(?)) 。那么,如何来确定渐近上界 ?(?) 呢?总体分为两步,首 先「统计操作数量」,然后「判断渐近上界」。 1) 统计操作数量 对着代码,从上到下一行一行地计数即可。然而,由于上述 ? ⋅ ?(?) 中的常数项 ? 可以取任意大小,因此操作 数量 ?(?) 中的各种系数、常数项都可以被 i++) { for (let j = 0; j < n + 1; j++) { console.log(0); } } } 2. 复杂度分析 hello‑algo.com 18 2) 判断渐近上界 时间复杂度由多项式 ?(?) 中最高阶的项来决定。这是因为在 ? 趋于无穷大时,最高阶的项将处于主导作用, 其它项的影响都可以被忽略。 以下表格给出了一些例子,其中有一些夸张的值,是想要向大家强调 「暴力枚举」和「辅助哈希表」分别对应 空间最优 和 时间最优 的两种解法。本着时间比空间更宝贵的原则,后 者是本题的最佳解法。 方法一:暴力枚举 考虑直接遍历所有所有可能性。通过开启一个两层循环,判断两个整数的和是否为 target ,若是则返回它俩 的索引(即下标)即可。 // === File: leetcode_two_sum.ts === /* 方法一:暴力枚举 */ function0 码力 | 186 页 | 14.71 MB | 1 年前3 Hello 算法 1.0.0b1 TypeScript 版需要会推算即可,数学意义可以慢慢领悟。 2.2.4. 推算方法 推算出 ?(?) 后,我们就得到时间复杂度 ?(?(?)) 。那么,如何来确定渐近上界 ?(?) 呢?总体分为两步,首 先「统计操作数量」,然后「判断渐近上界」。 1) 统计操作数量 对着代码,从上到下一行一行地计数即可。然而,由于上述 ? ⋅ ?(?) 中的常数项 ? 可以取任意大小,因此操作 数量 ?(?) 中的各种系数、常数项都可以被 i++) { for (let j = 0; j < n + 1; j++) { console.log(0); } } } 2. 复杂度分析 hello‑algo.com 18 2) 判断渐近上界 时间复杂度由多项式 ?(?) 中最高阶的项来决定。这是因为在 ? 趋于无穷大时,最高阶的项将处于主导作用, 其它项的影响都可以被忽略。 以下表格给出了一些例子,其中有一些夸张的值,是想要向大家强调 「暴力枚举」和「辅助哈希表」分别对应 空间最优 和 时间最优 的两种解法。本着时间比空间更宝贵的原则,后 者是本题的最佳解法。 方法一:暴力枚举 考虑直接遍历所有所有可能性。通过开启一个两层循环,判断两个整数的和是否为 target ,若是则返回它俩 的索引(即下标)即可。 // === File: leetcode_two_sum.ts === /* 方法一:暴力枚举 */ function0 码力 | 186 页 | 14.71 MB | 1 年前3
 Hello 算法 1.1.0 TypeScript版和 C 的时间复杂度相同,但实际运行时间差别很 大。同样,尽管算法 B 的时间复杂度比 C 高,但在输入数据大小 ? 较小时,算法 B 明显优于算法 C 。在 这些情况下,我们很难仅凭时间复杂度判断算法效率的高低。当然,尽管存在上述问题,复杂度分析仍 然是评判算法效率最有效且常用的方法。 2.3.2 函数渐近上界 给定一个输入大小为 ? 的函数: function algorithm(n: 不断的 实践中,就可以逐渐领悟其数学意义。 根据定义,确定 ?(?) 之后,我们便可得到时间复杂度 ?(?(?)) 。那么如何确定渐近上界 ?(?) 呢?总体分 为两步:首先统计操作数量,然后判断渐近上界。 1. 第一步:统计操作数量 针对代码,逐行从上到下计算即可。然而,由于上述 ? ⋅ ?(?) 中的常数项 ? 可以取任意大小,因此操作数量 ?(?) 中的各种系数、常数项都可以忽略。 。 ?(?) = 2?(? + 1) + (5? + 1) + 2 完整统计 (‑.‑|||) = 2?2 + 7? + 3 ?(?) = ?2 + ? 偷懒统计 (o.O) 2. 第二步:判断渐近上界 时间复杂度由 ?(?) 中最高阶的项来决定。这是因为在 ? 趋于无穷大时,最高阶的项将发挥主导作用,其他 项的影响都可以忽略。 表 2‑2 展示了一些例子,其中一些夸张的值是为了强调“系数无法撼动阶数”这一结论。当0 码力 | 383 页 | 18.49 MB | 1 年前3 Hello 算法 1.1.0 TypeScript版和 C 的时间复杂度相同,但实际运行时间差别很 大。同样,尽管算法 B 的时间复杂度比 C 高,但在输入数据大小 ? 较小时,算法 B 明显优于算法 C 。在 这些情况下,我们很难仅凭时间复杂度判断算法效率的高低。当然,尽管存在上述问题,复杂度分析仍 然是评判算法效率最有效且常用的方法。 2.3.2 函数渐近上界 给定一个输入大小为 ? 的函数: function algorithm(n: 不断的 实践中,就可以逐渐领悟其数学意义。 根据定义,确定 ?(?) 之后,我们便可得到时间复杂度 ?(?(?)) 。那么如何确定渐近上界 ?(?) 呢?总体分 为两步:首先统计操作数量,然后判断渐近上界。 1. 第一步:统计操作数量 针对代码,逐行从上到下计算即可。然而,由于上述 ? ⋅ ?(?) 中的常数项 ? 可以取任意大小,因此操作数量 ?(?) 中的各种系数、常数项都可以忽略。 。 ?(?) = 2?(? + 1) + (5? + 1) + 2 完整统计 (‑.‑|||) = 2?2 + 7? + 3 ?(?) = ?2 + ? 偷懒统计 (o.O) 2. 第二步:判断渐近上界 时间复杂度由 ?(?) 中最高阶的项来决定。这是因为在 ? 趋于无穷大时,最高阶的项将发挥主导作用,其他 项的影响都可以忽略。 表 2‑2 展示了一些例子,其中一些夸张的值是为了强调“系数无法撼动阶数”这一结论。当0 码力 | 383 页 | 18.49 MB | 1 年前3
 Hello 算法 1.0.0b5 TypeScript 版和 C 的时间复杂度相同,但实际运行时间差别很 大。同样,尽管算法 B 的时间复杂度比 C 高,但在输入数据大小 ? 较小时,算法 B 明显优于算法 C 。在 这些情况下,我们很难仅凭时间复杂度判断算法效率的高低。当然,尽管存在上述问题,复杂度分析仍 然是评判算法效率最有效且常用的方法。 2.3.2 函数渐近上界 给定一个输入大小为 ? 的函数: function algorithm(n: 要掌握 推算方法,数学意义就可以逐渐领悟。 根据定义,确定 ?(?) 之后,我们便可得到时间复杂度 ?(?(?)) 。那么如何确定渐近上界 ?(?) 呢?总体分 为两步:首先统计操作数量,然后判断渐近上界。 1. 第一步:统计操作数量 针对代码,逐行从上到下计算即可。然而,由于上述 ? ⋅ ?(?) 中的常数项 ? 可以取任意大小,因此操作数量 ?(?) 中的各种系数、常数项都可以被忽略 。 ?(?) = 2?(? + 1) + (5? + 1) + 2 完整统计 (‑.‑|||) = 2?2 + 7? + 3 ?(?) = ?2 + ? 偷懒统计 (o.O) 2. 第二步:判断渐近上界 时间复杂度由多项式 ?(?) 中最高阶的项来决定。这是因为在 ? 趋于无穷大时,最高阶的项将发挥主导作用, 其他项的影响都可以被忽略。 第 2 章 复杂度分析 hello‑algo.com0 码力 | 378 页 | 30.70 MB | 1 年前3 Hello 算法 1.0.0b5 TypeScript 版和 C 的时间复杂度相同,但实际运行时间差别很 大。同样,尽管算法 B 的时间复杂度比 C 高,但在输入数据大小 ? 较小时,算法 B 明显优于算法 C 。在 这些情况下,我们很难仅凭时间复杂度判断算法效率的高低。当然,尽管存在上述问题,复杂度分析仍 然是评判算法效率最有效且常用的方法。 2.3.2 函数渐近上界 给定一个输入大小为 ? 的函数: function algorithm(n: 要掌握 推算方法,数学意义就可以逐渐领悟。 根据定义,确定 ?(?) 之后,我们便可得到时间复杂度 ?(?(?)) 。那么如何确定渐近上界 ?(?) 呢?总体分 为两步:首先统计操作数量,然后判断渐近上界。 1. 第一步:统计操作数量 针对代码,逐行从上到下计算即可。然而,由于上述 ? ⋅ ?(?) 中的常数项 ? 可以取任意大小,因此操作数量 ?(?) 中的各种系数、常数项都可以被忽略 。 ?(?) = 2?(? + 1) + (5? + 1) + 2 完整统计 (‑.‑|||) = 2?2 + 7? + 3 ?(?) = ?2 + ? 偷懒统计 (o.O) 2. 第二步:判断渐近上界 时间复杂度由多项式 ?(?) 中最高阶的项来决定。这是因为在 ? 趋于无穷大时,最高阶的项将发挥主导作用, 其他项的影响都可以被忽略。 第 2 章 复杂度分析 hello‑algo.com0 码力 | 378 页 | 30.70 MB | 1 年前3
 Hello 算法 1.2.0 简体中文 TypeScript 版如果把具体的工作技能比作是武功的“招式”的话,那么基础科目应该更像是“内功”。 我认为学算法(以及其他基础科目)的意义不是在于在工作中从零实现它,而是基于学到的知识,在解决问 题时能够作出专业的反应和判断,从而提升工作的整体质量。举一个简单例子,每种编程语言都内置了排序 函数: ‧ 如果我们没有学过数据结构与算法,那么给定任何数据,我们可能都塞给这个排序函数去做了。运行顺 畅、性能不错,看上去并没有什么问题。 C 的时间复杂度相同,但实际运行时间差别很 大。同样,尽管算法 B 的时间复杂度比 C 高,但在输入数据大小 ? 较小时,算法 B 明显优于算法 C 。对 于此类情况,我们时常难以仅凭时间复杂度判断算法效率的高低。当然,尽管存在上述问题,复杂度分 析仍然是评判算法效率最有效且常用的方法。 2.3.2 函数渐近上界 给定一个输入大小为 ? 的函数: function algorithm(n: 不断的 实践中,就可以逐渐领悟其数学意义。 根据定义,确定 ?(?) 之后,我们便可得到时间复杂度 ?(?(?)) 。那么如何确定渐近上界 ?(?) 呢?总体分 为两步:首先统计操作数量,然后判断渐近上界。 1. 第一步:统计操作数量 针对代码,逐行从上到下计算即可。然而,由于上述 ? ⋅ ?(?) 中的常数项 ? 可以取任意大小,因此操作数量 ?(?) 中的各种系数、常数项都可以忽略。0 码力 | 383 页 | 18.49 MB | 10 月前3 Hello 算法 1.2.0 简体中文 TypeScript 版如果把具体的工作技能比作是武功的“招式”的话,那么基础科目应该更像是“内功”。 我认为学算法(以及其他基础科目)的意义不是在于在工作中从零实现它,而是基于学到的知识,在解决问 题时能够作出专业的反应和判断,从而提升工作的整体质量。举一个简单例子,每种编程语言都内置了排序 函数: ‧ 如果我们没有学过数据结构与算法,那么给定任何数据,我们可能都塞给这个排序函数去做了。运行顺 畅、性能不错,看上去并没有什么问题。 C 的时间复杂度相同,但实际运行时间差别很 大。同样,尽管算法 B 的时间复杂度比 C 高,但在输入数据大小 ? 较小时,算法 B 明显优于算法 C 。对 于此类情况,我们时常难以仅凭时间复杂度判断算法效率的高低。当然,尽管存在上述问题,复杂度分 析仍然是评判算法效率最有效且常用的方法。 2.3.2 函数渐近上界 给定一个输入大小为 ? 的函数: function algorithm(n: 不断的 实践中,就可以逐渐领悟其数学意义。 根据定义,确定 ?(?) 之后,我们便可得到时间复杂度 ?(?(?)) 。那么如何确定渐近上界 ?(?) 呢?总体分 为两步:首先统计操作数量,然后判断渐近上界。 1. 第一步:统计操作数量 针对代码,逐行从上到下计算即可。然而,由于上述 ? ⋅ ?(?) 中的常数项 ? 可以取任意大小,因此操作数量 ?(?) 中的各种系数、常数项都可以忽略。0 码力 | 383 页 | 18.49 MB | 10 月前3
 TypeScript 4.0 使用手册
BookStack.CN 构建 不需要对它写入,那么其它使用这些代码的人也不能够写入它们,并且要思考为什么会需要对这些变量 重新赋值。 使用 const 也可以让我们更容易的推测数据的流动。 跟据你的自己判断,如果合适的话,与团队成员商议一下。 这个手册大部分地方都使用了 let 声明。 TypeScript 包含的另一个 ECMAScript 2015 特性就是解构。完整列表请参见 the article 赋值到一个普通数组也是不可以的。 但 是你可以用类型断言重写: 只读属性 接口 - 109 - 本文档使用 书栈网 · BookStack.CN 构建 1. a = ro as number[]; 最简单判断该用 readonly 还是 const 的方法是看要把它做为变量使用还是做为一个属性。 做为 变量使用的话用 const ,若做为属性则使用 readonly 。 我们在第一个例子里使用了接口,TypeScript 属性,但这不会引发错误。 只有目标类型(这里是 Named )的 成员会被一一检查是否兼容。 这个比较过程是递归进行的,检查每个成员及子成员。 相对来讲,在比较原始类型和对象类型的时候是比较容易理解的,问题是如何判断两个函数是兼容的。 下面我们从两个简单的函数入手,它们仅是参数列表略有不同: 1. let x = (a: number) => 0; 2. let y = (b: number, s: string)0 码力 | 683 页 | 6.27 MB | 1 年前3 TypeScript 4.0 使用手册
BookStack.CN 构建 不需要对它写入,那么其它使用这些代码的人也不能够写入它们,并且要思考为什么会需要对这些变量 重新赋值。 使用 const 也可以让我们更容易的推测数据的流动。 跟据你的自己判断,如果合适的话,与团队成员商议一下。 这个手册大部分地方都使用了 let 声明。 TypeScript 包含的另一个 ECMAScript 2015 特性就是解构。完整列表请参见 the article 赋值到一个普通数组也是不可以的。 但 是你可以用类型断言重写: 只读属性 接口 - 109 - 本文档使用 书栈网 · BookStack.CN 构建 1. a = ro as number[]; 最简单判断该用 readonly 还是 const 的方法是看要把它做为变量使用还是做为一个属性。 做为 变量使用的话用 const ,若做为属性则使用 readonly 。 我们在第一个例子里使用了接口,TypeScript 属性,但这不会引发错误。 只有目标类型(这里是 Named )的 成员会被一一检查是否兼容。 这个比较过程是递归进行的,检查每个成员及子成员。 相对来讲,在比较原始类型和对象类型的时候是比较容易理解的,问题是如何判断两个函数是兼容的。 下面我们从两个简单的函数入手,它们仅是参数列表略有不同: 1. let x = (a: number) => 0; 2. let y = (b: number, s: string)0 码力 | 683 页 | 6.27 MB | 1 年前3
 TypeScript Handbook(中文版)
容易的推测数据的流动。 另一方面,用户很喜欢 let 的简洁性。 这个手册大部分地方都使用了 let 。 TypeScript Handbook(中文版) 239 变量声明 跟据你的自己判断,如果合适的话,与团队成员商议一下。 解构 Another TypeScript已经可以解析其它 ECMAScript 2015 特性了。 完整列表请参见 the article on the 上面代码的最后一行,可以看到就算把整个 ReadonlyArray 赋值到一个普通数组 也是不可以的。 但是你可以用类型断言重写: a = ro as number[]; readonly vs const 最简单判断该用 readonly 还是 const 的方法是看要把它做为变量使用还是做为 一个属性。 做为变量使用的话用 const ,若做为属性则使用 readonly 。 额外的属性检查 我 只有目标类型(这里 是 Named )的成员会被一一检查是否兼容。 这个比较过程是递归进行的,检查每个成员及子成员。 比较两个函数 相对来讲,在比较原始类型和对象类型的时候是比较容易理解的,问题是如何判断 两个函数是兼容的。 下面我们从两个简单的函数入手,它们仅是参数列表略有不 同: TypeScript Handbook(中文版) 307 类型兼容性 let x = (a: number)0 码力 | 557 页 | 7.48 MB | 1 年前3 TypeScript Handbook(中文版)
容易的推测数据的流动。 另一方面,用户很喜欢 let 的简洁性。 这个手册大部分地方都使用了 let 。 TypeScript Handbook(中文版) 239 变量声明 跟据你的自己判断,如果合适的话,与团队成员商议一下。 解构 Another TypeScript已经可以解析其它 ECMAScript 2015 特性了。 完整列表请参见 the article on the 上面代码的最后一行,可以看到就算把整个 ReadonlyArray 赋值到一个普通数组 也是不可以的。 但是你可以用类型断言重写: a = ro as number[]; readonly vs const 最简单判断该用 readonly 还是 const 的方法是看要把它做为变量使用还是做为 一个属性。 做为变量使用的话用 const ,若做为属性则使用 readonly 。 额外的属性检查 我 只有目标类型(这里 是 Named )的成员会被一一检查是否兼容。 这个比较过程是递归进行的,检查每个成员及子成员。 比较两个函数 相对来讲,在比较原始类型和对象类型的时候是比较容易理解的,问题是如何判断 两个函数是兼容的。 下面我们从两个简单的函数入手,它们仅是参数列表略有不 同: TypeScript Handbook(中文版) 307 类型兼容性 let x = (a: number)0 码力 | 557 页 | 7.48 MB | 1 年前3
共 6 条
- 1













