 Hello 算法 1.2.0 繁体中文 TypeScript 版你邁入資料結構與演算法的知識殿堂。 1.2 演算法是什麼 1.2.1 演算法定義 演算法(algorithm)是在有限時間內解決特定問題的一組指令或操作步驟,它具有以下特性。 ‧ 問題是明確的,包含清晰的輸入和輸出定義。 ‧ 具有可行性,能夠在有限步驟、時間和記憶體空間下完成。 ‧ 各步驟都有確定的含義,在相同的輸入和執行條件下,輸出始終相同。 1.2.2 資料結構定義 資料結構(data 執行效率可能相差很大,選擇合適的資料結構是關鍵。 圖 1‑4 資料結構與演算法的關係 資料結構與演算法猶如圖 1‑5 所示的拼裝積木。一套積木,除了包含許多零件之外,還附有詳細的組裝說明 書。我們按照說明書一步步操作,就能組裝出精美的積木模型。 第 1 章 初識演算法 www.hello‑algo.com 15 圖 1‑5 拼裝積木 兩者的詳細對應關係如表 1‑1 所示。 表 1‑1 將資料結構與演算法類比為拼裝積木 資料結構與演算法 拼裝積木 輸入資料 未拼裝的積木 資料結構 積木組織形式,包括形狀、大小、連線方式等 演算法 把積木拼成目標形態的一系列操作步驟 輸出資料 積木模型 值得說明的是,資料結構與演算法是獨立於程式語言的。正因如此,本書得以提供基於多種程式語言的實 現。 約定俗成的簡稱 在實際討論時,我們通常會將“資料結構與演算法”簡稱為“演算法”。比如眾所周知的 LeetCode0 码力 | 384 页 | 18.80 MB | 10 月前3 Hello 算法 1.2.0 繁体中文 TypeScript 版你邁入資料結構與演算法的知識殿堂。 1.2 演算法是什麼 1.2.1 演算法定義 演算法(algorithm)是在有限時間內解決特定問題的一組指令或操作步驟,它具有以下特性。 ‧ 問題是明確的,包含清晰的輸入和輸出定義。 ‧ 具有可行性,能夠在有限步驟、時間和記憶體空間下完成。 ‧ 各步驟都有確定的含義,在相同的輸入和執行條件下,輸出始終相同。 1.2.2 資料結構定義 資料結構(data 執行效率可能相差很大,選擇合適的資料結構是關鍵。 圖 1‑4 資料結構與演算法的關係 資料結構與演算法猶如圖 1‑5 所示的拼裝積木。一套積木,除了包含許多零件之外,還附有詳細的組裝說明 書。我們按照說明書一步步操作,就能組裝出精美的積木模型。 第 1 章 初識演算法 www.hello‑algo.com 15 圖 1‑5 拼裝積木 兩者的詳細對應關係如表 1‑1 所示。 表 1‑1 將資料結構與演算法類比為拼裝積木 資料結構與演算法 拼裝積木 輸入資料 未拼裝的積木 資料結構 積木組織形式,包括形狀、大小、連線方式等 演算法 把積木拼成目標形態的一系列操作步驟 輸出資料 積木模型 值得說明的是,資料結構與演算法是獨立於程式語言的。正因如此,本書得以提供基於多種程式語言的實 現。 約定俗成的簡稱 在實際討論時,我們通常會將“資料結構與演算法”簡稱為“演算法”。比如眾所周知的 LeetCode0 码力 | 384 页 | 18.80 MB | 10 月前3
 TypeScript Handbook(中文版)
有 .d.ts 文 件。以前这是错误的。从TypeScript 2.1开始,这更容易了。 使用TypeScript 2.1,您可以导入JavaScript模块,而不需要类型声明。如果类型声 明(如 declare module "foo" { ... } 或 node_modules/@types/foo )存 在,则仍然优先。 对于没有声明文件的模块的导入,在使用了 --noImplicitAny 以前使用模块加载器(例如AMD和SystemJS)导入没有代码的资源是不容易的。 之前,必须为每个资源定义一个外部模块声明。 TypeScript 2.0支持使用通配符符号( * )定义一类模块名称。这种方式,一个声 明只需要一次扩展名,而不再是每一个资源。 示例 declare module "*!text" { const content: string; export default content; 不仅是在循环里引入了一个 新的变量环境,而是针对每次迭代都会创建这样一个新作用域。 这就是我们在使用 立即执行的函数表达式时做的事,所以在 setTimeout 例子里我们仅使用 let 声 明就可以了。 for (let i = 0; i < 10 ; i++) { setTimeout(function() {console.log(i); }, 100 * i); } 会输出与预料一致的结果:0 码力 | 557 页 | 7.48 MB | 1 年前3 TypeScript Handbook(中文版)
有 .d.ts 文 件。以前这是错误的。从TypeScript 2.1开始,这更容易了。 使用TypeScript 2.1,您可以导入JavaScript模块,而不需要类型声明。如果类型声 明(如 declare module "foo" { ... } 或 node_modules/@types/foo )存 在,则仍然优先。 对于没有声明文件的模块的导入,在使用了 --noImplicitAny 以前使用模块加载器(例如AMD和SystemJS)导入没有代码的资源是不容易的。 之前,必须为每个资源定义一个外部模块声明。 TypeScript 2.0支持使用通配符符号( * )定义一类模块名称。这种方式,一个声 明只需要一次扩展名,而不再是每一个资源。 示例 declare module "*!text" { const content: string; export default content; 不仅是在循环里引入了一个 新的变量环境,而是针对每次迭代都会创建这样一个新作用域。 这就是我们在使用 立即执行的函数表达式时做的事,所以在 setTimeout 例子里我们仅使用 let 声 明就可以了。 for (let i = 0; i < 10 ; i++) { setTimeout(function() {console.log(i); }, 100 * i); } 会输出与预料一致的结果:0 码力 | 557 页 | 7.48 MB | 1 年前3
 TypeScript 4.0 使用手册
const 是 对 let 的一个增强,它能阻止对一个变量再次赋值。 因为TypeScript是JavaScript的超集,所以它本身就支持 let 和 const 。 下面我们会详细说 明这些新的声明方式以及为什么推荐使用它们来代替 var 。 如果你之前使用JavaScript时没有特别在意,那么这节内容会唤起你的回忆。 如果你已经 对 var 声明的怪异之处了如指掌,那么你可以轻松地略过这节。 return x + y; }; 只要参数类型是匹配的,那么就认为它是有效的函数类型,而不在乎参数名是否正确。 第二部分是返回值类型。 对于返回值,我们在函数和返回值类型之前使用( => )符号,使之清晰明 了。 如之前提到的,返回值类型是函数类型的必要部分,如果函数没有返回任何值,你也必须指定返 回值类型为 void 而不能留空。 函数的类型只是由参数类型和返回值组成的。 函数中使用的捕获变量不会体现在类型里。 你应该会记得之前的一个例子,我们有时候想操作某类型的一组值,并且我们知道这组值具有什么样的 属性。 在 loggingIdentity 例子中,我们想访问 arg 的 length 属性,但是编译器并不能证 明每种类型都有 length 属性,所以就报错了。 1. function loggingIdentity TypeScript 4.0 使用手册
const 是 对 let 的一个增强,它能阻止对一个变量再次赋值。 因为TypeScript是JavaScript的超集,所以它本身就支持 let 和 const 。 下面我们会详细说 明这些新的声明方式以及为什么推荐使用它们来代替 var 。 如果你之前使用JavaScript时没有特别在意,那么这节内容会唤起你的回忆。 如果你已经 对 var 声明的怪异之处了如指掌,那么你可以轻松地略过这节。 return x + y; }; 只要参数类型是匹配的,那么就认为它是有效的函数类型,而不在乎参数名是否正确。 第二部分是返回值类型。 对于返回值,我们在函数和返回值类型之前使用( => )符号,使之清晰明 了。 如之前提到的,返回值类型是函数类型的必要部分,如果函数没有返回任何值,你也必须指定返 回值类型为 void 而不能留空。 函数的类型只是由参数类型和返回值组成的。 函数中使用的捕获变量不会体现在类型里。 你应该会记得之前的一个例子,我们有时候想操作某类型的一组值,并且我们知道这组值具有什么样的 属性。 在 loggingIdentity 例子中,我们想访问 arg 的 length 属性,但是编译器并不能证 明每种类型都有 length 属性,所以就报错了。 1. function loggingIdentity- (arg: T): T { 2. console.log(arg.length); 0 码力 | 683 页 | 6.27 MB | 1 年前3
 Hello 算法 1.1.0 TypeScript版的单位价值最高,因此替 换后的总价值一定大于 res 。这与 res 是最优解矛盾,说明最优解中必须包含物品 ? 。 对于该解中的其他物品,我们也可以构建出上述矛盾。总而言之,单位价值更大的物品总是更优选择,这说 明贪心策略是有效的。 如图 15‑6 所示,如果将物品重量和物品单位价值分别看作一张二维图表的横轴和纵轴,则分数背包问题可转 化为“求在有限横轴区间下围成的最大面积”。这个类比可以帮助我们从几何角度理解贪心策略的有效性。0 码力 | 383 页 | 18.49 MB | 1 年前3 Hello 算法 1.1.0 TypeScript版的单位价值最高,因此替 换后的总价值一定大于 res 。这与 res 是最优解矛盾,说明最优解中必须包含物品 ? 。 对于该解中的其他物品,我们也可以构建出上述矛盾。总而言之,单位价值更大的物品总是更优选择,这说 明贪心策略是有效的。 如图 15‑6 所示,如果将物品重量和物品单位价值分别看作一张二维图表的横轴和纵轴,则分数背包问题可转 化为“求在有限横轴区间下围成的最大面积”。这个类比可以帮助我们从几何角度理解贪心策略的有效性。0 码力 | 383 页 | 18.49 MB | 1 年前3
 Hello 算法 1.0.0b5 TypeScript 版的单位价值最高,因此替 换后的总价值一定大于 res 。这与 res 是最优解矛盾,说明最优解中必须包含物品 ? 。 对于该解中的其他物品,我们也可以构建出上述矛盾。总而言之,单位价值更大的物品总是更优选择,这说 明贪心策略是有效的。 如图 15‑6 所示,如果将物品重量和物品单位价值分别看作一个 2D 图表的横轴和纵轴,则分数背包问题可 被转化为“求在有限横轴区间下的最大围成面积”。这个类比可以帮助我们从几何角度理解贪心策略的有效0 码力 | 378 页 | 30.70 MB | 1 年前3 Hello 算法 1.0.0b5 TypeScript 版的单位价值最高,因此替 换后的总价值一定大于 res 。这与 res 是最优解矛盾,说明最优解中必须包含物品 ? 。 对于该解中的其他物品,我们也可以构建出上述矛盾。总而言之,单位价值更大的物品总是更优选择,这说 明贪心策略是有效的。 如图 15‑6 所示,如果将物品重量和物品单位价值分别看作一个 2D 图表的横轴和纵轴,则分数背包问题可 被转化为“求在有限横轴区间下的最大围成面积”。这个类比可以帮助我们从几何角度理解贪心策略的有效0 码力 | 378 页 | 30.70 MB | 1 年前3
 Hello 算法 1.2.0 简体中文 TypeScript 版的单位价值最高,因此替 换后的总价值一定大于 res 。这与 res 是最优解矛盾,说明最优解中必须包含物品 ? 。 对于该解中的其他物品,我们也可以构建出上述矛盾。总而言之,单位价值更大的物品总是更优选择,这说 明贪心策略是有效的。 如图 15‑6 所示,如果将物品重量和物品单位价值分别看作一张二维图表的横轴和纵轴,则分数背包问题可转 化为“求在有限横轴区间下围成的最大面积”。这个类比可以帮助我们从几何角度理解贪心策略的有效性。0 码力 | 383 页 | 18.49 MB | 10 月前3 Hello 算法 1.2.0 简体中文 TypeScript 版的单位价值最高,因此替 换后的总价值一定大于 res 。这与 res 是最优解矛盾,说明最优解中必须包含物品 ? 。 对于该解中的其他物品,我们也可以构建出上述矛盾。总而言之,单位价值更大的物品总是更优选择,这说 明贪心策略是有效的。 如图 15‑6 所示,如果将物品重量和物品单位价值分别看作一张二维图表的横轴和纵轴,则分数背包问题可转 化为“求在有限横轴区间下围成的最大面积”。这个类比可以帮助我们从几何角度理解贪心策略的有效性。0 码力 | 383 页 | 18.49 MB | 10 月前3
共 6 条
- 1













