Hello 算法 1.0.0b1 TypeScript 版算法有对应最优的数据结构。给定算法,一般可基于不同的数据结构实现,而最终执行效率往往相差很 大。 Figure 1‑2. 数据结构与算法的关系 如果将「LEGO 乐高」类比到「数据结构与算法」,那么可以得到下表所示的对应关系。 数据结构与算法 LEGO 乐高 输入数据 未拼装的积木 数据结构 积木组织形式,包括形状、大小、连接方式等 算法 把积木拼成目标形态的一系列操作步骤 输出数据 积木模型 1 ‧ 算法是在有限时间内解决特定问题的一组指令或操作步骤,数据结构是在计算机中组织与存储数据的方 式。 ‧ 数据结构与算法两者紧密联系。数据结构是算法的底座,算法是发挥数据结构的舞台。 ‧ 乐高积木对应数据,积木形状和连接形式对应数据结构,拼装积木的流程步骤对应算法。 12 2. 复杂度分析 2.1. 算法效率评估 2.1.1. 算法评价维度 在开始学习算法之前,我们首先要想清楚算 看,我们设计算法时追求两个层面的目标。 1. 找到问题解法。算法需要能够在规定的输入范围下,可靠地求得问题的正确解。 2. 寻求最优解法。同一个问题可能存在多种解法,而我们希望算法效率尽可能的高。 换言之,在可以解决问题的前提下,算法效率则是主要评价维度,包括: ‧ 时间效率,即算法的运行速度的快慢。 ‧ 空间效率,即算法占用的内存空间大小。 数据结构与算法追求“运行速度快、占用内存0 码力 | 186 页 | 14.71 MB | 1 年前3
Hello 算法 1.1.0 TypeScript版“计算操作运行时间统计”简化为“计算操作数量统计”,这样一来估算难度就大大降低了。 ‧ 时间复杂度也存在一定的局限性。例如,尽管算法 A 和 C 的时间复杂度相同,但实际运行时间差别很 大。同样,尽管算法 B 的时间复杂度比 C 高,但在输入数据大小 ? 较小时,算法 B 明显优于算法 C 。在 这些情况下,我们很难仅凭时间复杂度判断算法效率的高低。当然,尽管存在上述问题,复杂度分析仍 然是评判算法效率最有效且常用的方法。 (?2) ?3 + 10000?2 ?(?3) 2? + 10000?10000 ?(2?) 2.3.4 常见类型 设输入数据大小为 ? ,常见的时间复杂度类型如图 2‑9 所示(按照从低到高的顺序排列)。 ?(1) < ?(log ?) < ?(?) < ?(? log ?) < ?(?2) < ?(2?) < ?(?!) 常数阶 < 对数阶 < 线性阶 < 线性对数阶 < 平方阶 < recur() 在运行过程中会同时存在 ? 个未返回的 recur() ,从而占用 ?(?) 的栈帧空间。 2.4.3 常见类型 设输入数据大小为 ? ,图 2‑16 展示了常见的空间复杂度类型(从低到高排列)。 ?(1) < ?(log ?) < ?(?) < ?(?2) < ?(2?) 常数阶 < 对数阶 < 线性阶 < 平方阶 < 指数阶 图 2‑16 常见的空间复杂度类型 1. 常数阶0 码力 | 383 页 | 18.49 MB | 1 年前3
Hello 算法 1.0.0b5 TypeScript 版的数量的统计”,这样以来估算难度就大大降低了。 ‧ 时间复杂度也存在一定的局限性。例如,尽管算法 A 和 C 的时间复杂度相同,但实际运行时间差别很 大。同样,尽管算法 B 的时间复杂度比 C 高,但在输入数据大小 ? 较小时,算法 B 明显优于算法 C 。在 这些情况下,我们很难仅凭时间复杂度判断算法效率的高低。当然,尽管存在上述问题,复杂度分析仍 然是评判算法效率最有效且常用的方法。 (?2) ?3 + 10000?2 ?(?3) 2? + 10000?10000 ?(2?) 2.3.4 常见类型 设输入数据大小为 ? ,常见的时间复杂度类型如图 2‑9 所示(按照从低到高的顺序排列)。 ?(1) < ?(log ?) < ?(?) < ?(? log ?) < ?(?2) < ?(2?) < ?(?!) 常数阶 < 对数阶 < 线性阶 < 线性对数阶 < 平方阶 < void { if (n === 1) return; return recur(n - 1); } 2.4.3 常见类型 设输入数据大小为 ? ,图 2‑16 展示了常见的空间复杂度类型(从低到高排列)。 ?(1) < ?(log ?) < ?(?) < ?(?2) < ?(2?) 常数阶 < 对数阶 < 线性阶 < 平方阶 < 指数阶 图 2‑16 常见的空间复杂度类型 第 2 章 复杂度分析0 码力 | 378 页 | 30.70 MB | 1 年前3
Hello 算法 1.2.0 简体中文 TypeScript 版“计算操作运行时间统计”简化为“计算操作数量统计”,这样一来估算难度就大大降低了。 ‧ 时间复杂度也存在一定的局限性。例如,尽管算法 A 和 C 的时间复杂度相同,但实际运行时间差别很 大。同样,尽管算法 B 的时间复杂度比 C 高,但在输入数据大小 ? 较小时,算法 B 明显优于算法 C 。对 于此类情况,我们时常难以仅凭时间复杂度判断算法效率的高低。当然,尽管存在上述问题,复杂度分 析仍然是评判算法效率最有效且常用的方法。 (?2) ?3 + 10000?2 ?(?3) 2? + 10000?10000 ?(2?) 2.3.4 常见类型 设输入数据大小为 ? ,常见的时间复杂度类型如图 2‑9 所示(按照从低到高的顺序排列)。 ?(1) < ?(log ?) < ?(?) < ?(? log ?) < ?(?2) < ?(2?) < ?(?!) 常数阶 < 对数阶 < 线性阶 < 线性对数阶 < 平方阶 < recur() 在运行过程中会同时存在 ? 个未返回的 recur() ,从而占用 ?(?) 的栈帧空间。 2.4.3 常见类型 设输入数据大小为 ? ,图 2‑16 展示了常见的空间复杂度类型(从低到高排列)。 ?(1) < ?(log ?) < ?(?) < ?(?2) < ?(2?) 常数阶 < 对数阶 < 线性阶 < 平方阶 < 指数阶 图 2‑16 常见的空间复杂度类型 1. 常数阶0 码力 | 383 页 | 18.49 MB | 10 月前3
TypeScript Handbook(中文版)
will be 'string' 注意我们没必要使用尖括号( <> )来明确地传入类型;编译器可以查 看 myString 的值,然后把 T 设置为它的类型。 类型推论帮助我们保持代码精简 和高可读性。如果编译器不能够自动地推断出类型的话,只能像上面那样明确的传 入T的类型,在一些复杂的情况下,这是可能出现的。 使用泛型变量 TypeScript Handbook(中文版) 291 泛型 Handbook(中文版) 494 与其它构建工具整合 TypeScript Handbook(中文版) 495 与其它构建工具整合 在太平洋标准时间每天午夜会自动构建TypeScript的 master 分支代码并发布到 NPM和NuGet上。 下面将介绍如何获得并在工具里使用它们。 使用 npm npm install -g typescript@next 使用 NuGet 和 MSBuild 注意:你需要配置工程来使用NuGet包。 default 导入操 作 识别JavaScript里原型的赋值 在模块里使用路径映射 在其它模块里增加global/module作用域 在Visual Studio使用tsconfig.json做为高优先级的配置 基于 this 类型保护 支持自定义JSX工厂通过 --reactNamespace 增强for-in语句检查 JSX代码在VS 2015里高亮 发布TypeScript0 码力 | 557 页 | 7.48 MB | 1 年前3
Hello 算法 1.2.0 繁体中文 TypeScript 版的方法是找一臺計算機,執行這兩個演算法,並監控記錄它們的執行時間和記憶體佔用情況。這種評估方式 能夠反映真實情況,但也存在較大的侷限性。 一方面,難以排除測試環境的干擾因素。硬體配置會影響演算法的效能表現。比如一個演算法的並行度較高, 那麼它就更適合在多核 CPU 上執行,一個演算法的記憶體操作密集,那麼它在高效能記憶體上的表現就會 更好。也就是說,演算法在不同的機器上的測試結果可能是不一致的。這意味著我們需要在各種機器上進行 複雜度分析為我們提供了一把評估演算法效率的“標尺”,使我們可以衡量執行某個演算法所需的時間和空 間資源,對比不同演算法之間的效率。 複雜度是個數學概念,對於初學者可能比較抽象,學習難度相對較高。從這個角度看,複雜度分析可能不太 適合作為最先介紹的內容。然而,當我們討論某個資料結構或演算法的特點時,難以避免要分析其執行速度 和空間使用情況。 綜上所述,建議你在深入學習資料結構與演算法之 表 2‑1 迭代與遞迴特點對比 迭代 遞迴 實現方 式 迴圈結構 函式呼叫自身 第 2 章 複雜度分析 www.hello‑algo.com 27 迭代 遞迴 時間效 率 效率通常較高,無函式呼叫開銷 每次函式呼叫都會產生開銷 記憶體 使用 通常使用固定大小的記憶體空間 累積函式呼叫可能使用大量的堆疊幀空間 適用問 題 適用於簡單迴圈任務,程式碼直觀、可讀 性好 適0 码力 | 384 页 | 18.80 MB | 10 月前3
TypeScript 4.0 使用手册
will be 'string' 注意我们没必要使用尖括号( <> )来明确地传入类型;编译器可以查看 myString 的值,然后 把 T 设置为它的类型。 类型推论帮助我们保持代码精简和高可读性。如果编译器不能够自动地推断 出类型的话,只能像上面那样明确的传入T的类型,在一些复杂的情况下,这是可能出现的。 使用泛型创建像 identity 这样的泛型函数时,编译器要求你在函数体必须正确的使用这个通用的类 NuGet NuGet 与其它构建工具整合 - 362 - 本文档使用 书栈网 · BookStack.CN 构建 在太平洋标准时间每天午夜会自动构建TypeScript的 master 分支代码并发布到NPM和NuGet上。 下面将介绍如何获得并在工具里使用它们。 1. npm install -g typescript@next 注意:你需要配置工程来使用NuGet包。 详细信息参考配置MSBuild工程来使用NuGet。 default 导入操作 识别JavaScript里原型的赋值 在模块里使用路径映射 在其它模块里增加global/module作用域 在Visual Studio使用tsconfig.json做为高优先级的配置 基于 this 类型保护 支持自定义JSX工厂通过 --reactNamespace 增强for-in语句检查 JSX代码在VS 2015里高亮 发布TypeScript0 码力 | 683 页 | 6.27 MB | 1 年前3
TypeScript的发展历程Flow Type ●JS+类型标注 ●工具相对完善 ●上手容易 ●与TS设计相似* 比较 类型系统 难度 工具链 CoffeeScript 动态 低 差 BuckleScript 很强 高 较好 FlowType 强 较低 较好 TypeScript 强 低 很好 TS发展史 ●简单易用,不求完美 ●原汁原味,贴合JS ●从简单到强大 TS发展史 Pre 1.0 ●简单0 码力 | 64 页 | 6.17 MB | 1 年前3
共 8 条
- 1













