 新语⾔,新思维 解读⼀个并发问题的多种实现 - 陶召胜新语⾔言,新思维 解读⼀一个并发问题的多种实现 陶召胜 next: 异步编程的问题 变量量读写冲突 异步任务1 异步任务2 共享变量量 读、写 读、写 IO阻塞 回调地狱 Future也有不不⾜足 • get 很容易易导致另⼀一个对象阻塞 • 不不⽀支持多值、⾼高级错误处理理 next: 多任务求解1-10,000,000的和 序号 语⾔言 关键点 1 JavaScript JavaScript 不不再有回调地狱,变异步为顺序化思维,程序更更加可读 2 Go ⾼高并发调度,通道让异步编程更更简单 3 Scala (1)简洁的异步编程 (2)AKKA:分布式计算框架 4 Java (1)fork/join (2)CompletableFuture (3)反应式编程(Reactive Programming ) next: JavaScript 关键点:不 e) 例例⼦子JavaScript实现(Generator) 例例⼦子JavaScript实现(async/await) 多进程,利利⽤用多核 输出: next: Go 关键点:⾼高并发调度,通道让异步编程更更简单 2015年年 Go 1.5 2016年年 Go1.6、1.7 2017年年 Go1.8、 1.9 goroutine gorutine在逻辑处理理器器上执⾏行行0 码力 | 42 页 | 9.85 MB | 1 年前3 新语⾔,新思维 解读⼀个并发问题的多种实现 - 陶召胜新语⾔言,新思维 解读⼀一个并发问题的多种实现 陶召胜 next: 异步编程的问题 变量量读写冲突 异步任务1 异步任务2 共享变量量 读、写 读、写 IO阻塞 回调地狱 Future也有不不⾜足 • get 很容易易导致另⼀一个对象阻塞 • 不不⽀支持多值、⾼高级错误处理理 next: 多任务求解1-10,000,000的和 序号 语⾔言 关键点 1 JavaScript JavaScript 不不再有回调地狱,变异步为顺序化思维,程序更更加可读 2 Go ⾼高并发调度,通道让异步编程更更简单 3 Scala (1)简洁的异步编程 (2)AKKA:分布式计算框架 4 Java (1)fork/join (2)CompletableFuture (3)反应式编程(Reactive Programming ) next: JavaScript 关键点:不 e) 例例⼦子JavaScript实现(Generator) 例例⼦子JavaScript实现(async/await) 多进程,利利⽤用多核 输出: next: Go 关键点:⾼高并发调度,通道让异步编程更更简单 2015年年 Go 1.5 2016年年 Go1.6、1.7 2017年年 Go1.8、 1.9 goroutine gorutine在逻辑处理理器器上执⾏行行0 码力 | 42 页 | 9.85 MB | 1 年前3
 Rspack 基于 Rust 的高性能Web 构建工具但没有一个方案能解决所有问题 Rspack 有哪些特性? ??? 快! performance is the best feature! Rspack 有哪些特性? ??? Rust 实现核心部分,充分利用并发和 LTO 优化 Rspack 有哪些特性? ???️ O(≈1) 增量 HMR,只编译修改的模块 Rspack 有哪些特性? ⚡️ Dev 启动耗时 Rspack 有哪些特性? 一些业务收益0 码力 | 29 页 | 4.51 MB | 1 年前3 Rspack 基于 Rust 的高性能Web 构建工具但没有一个方案能解决所有问题 Rspack 有哪些特性? ??? 快! performance is the best feature! Rspack 有哪些特性? ??? Rust 实现核心部分,充分利用并发和 LTO 优化 Rspack 有哪些特性? ???️ O(≈1) 增量 HMR,只编译修改的模块 Rspack 有哪些特性? ⚡️ Dev 启动耗时 Rspack 有哪些特性? 一些业务收益0 码力 | 29 页 | 4.51 MB | 1 年前3
 2019-2021 美团技术年货 前端篇资源路径,更新 JSON 文件并发布到配置平台; 前端 < 49 ● 第三部分:通过发布流水线提供的 API,把 PROJECT_ID、发布环境注入 HTML 文件中,为运行阶段提供全局变量以便读取。 通过对流水线编译期的整合,我们可以生成新的云端 JSON 并上传到云端,为运行 阶段的下发提供数据基础。 监听阶段 我们知道,浏览器对文件请求的并发数量是有限制的,为了保证浏览器对当前页面的 当前页面的 渲染处于高优先级,同时还能完成预缓存的功能,我们设计了一套对缓存文件的加载 策略,在不影响当前页面加载的情况下,实现对缓存文件的加载操作。以下为详细的 技术方案: 图 17 预缓存监听阶段 在页面 DOMContentLoaded 之后,我们会监听三部分的的变化。 ● 第一部分是监听 DOM 的变化。这部分主要是在页面发生 Ajax 请求之后, 随着 MV 模式的变动,DOM 为代表。经过实践,我们发现第 一种方案基于神经网络的代码生成算法虽然简单粗暴,但复杂层布局的准确率较低、 可解释程度不高导致后续无法持续优化。方案二中 Sketch 源文件信息量丰富、算法 自定义程度高、优化空间大。因此,我们调研了业界基于 Sketch 的代码自动生成方 案(已对外公布或者开源),发现了一些不足并尝试解决,下面从算法准确率、代码可 读性、研发流程覆盖度等方面做一下对比(该对比结果仅考察业界方案对我们自己业0 码力 | 738 页 | 50.29 MB | 1 年前3 2019-2021 美团技术年货 前端篇资源路径,更新 JSON 文件并发布到配置平台; 前端 < 49 ● 第三部分:通过发布流水线提供的 API,把 PROJECT_ID、发布环境注入 HTML 文件中,为运行阶段提供全局变量以便读取。 通过对流水线编译期的整合,我们可以生成新的云端 JSON 并上传到云端,为运行 阶段的下发提供数据基础。 监听阶段 我们知道,浏览器对文件请求的并发数量是有限制的,为了保证浏览器对当前页面的 当前页面的 渲染处于高优先级,同时还能完成预缓存的功能,我们设计了一套对缓存文件的加载 策略,在不影响当前页面加载的情况下,实现对缓存文件的加载操作。以下为详细的 技术方案: 图 17 预缓存监听阶段 在页面 DOMContentLoaded 之后,我们会监听三部分的的变化。 ● 第一部分是监听 DOM 的变化。这部分主要是在页面发生 Ajax 请求之后, 随着 MV 模式的变动,DOM 为代表。经过实践,我们发现第 一种方案基于神经网络的代码生成算法虽然简单粗暴,但复杂层布局的准确率较低、 可解释程度不高导致后续无法持续优化。方案二中 Sketch 源文件信息量丰富、算法 自定义程度高、优化空间大。因此,我们调研了业界基于 Sketch 的代码自动生成方 案(已对外公布或者开源),发现了一些不足并尝试解决,下面从算法准确率、代码可 读性、研发流程覆盖度等方面做一下对比(该对比结果仅考察业界方案对我们自己业0 码力 | 738 页 | 50.29 MB | 1 年前3
 Web的未来
新技术和新语言带来的改变是什么样语言 ● 简单、熟悉的面向对象语言 ● 基于类,单继承、多实现 ● 熟悉的语法和恰当的词法作用域 ● 可选的静态类型 ● 单线程和基于Isolate的并发 为什么喜欢 Dart 1. 开源 2. 有 Google 当靠山 3. 执行效率高 4. 有机会成为 Android 内置的虚拟机,用来写手机 App 5. 可以用来写服务器后台程序 6. 可以写 Web 前端程序,在浏览器内运行 http://www.dartlang.org/performance/ Dart 语法特性 ● 纯面向对象:类 ● 范型 ● 函数、闭包 ● 库:import ● 可选类型 ● 词法作用域 ● 异步与并发编程 ● getter 和 setter ● 方法级联调用 ● 操作符重载 ● Markdown注释 ● 支持 Mixin ● 基于Mirror的反射 ● 不支持 eval ● ……0 码力 | 91 页 | 3.44 MB | 1 年前3 Web的未来
新技术和新语言带来的改变是什么样语言 ● 简单、熟悉的面向对象语言 ● 基于类,单继承、多实现 ● 熟悉的语法和恰当的词法作用域 ● 可选的静态类型 ● 单线程和基于Isolate的并发 为什么喜欢 Dart 1. 开源 2. 有 Google 当靠山 3. 执行效率高 4. 有机会成为 Android 内置的虚拟机,用来写手机 App 5. 可以用来写服务器后台程序 6. 可以写 Web 前端程序,在浏览器内运行 http://www.dartlang.org/performance/ Dart 语法特性 ● 纯面向对象:类 ● 范型 ● 函数、闭包 ● 库:import ● 可选类型 ● 词法作用域 ● 异步与并发编程 ● getter 和 setter ● 方法级联调用 ● 操作符重载 ● Markdown注释 ● 支持 Mixin ● 基于Mirror的反射 ● 不支持 eval ● ……0 码力 | 91 页 | 3.44 MB | 1 年前3
 陈新新 Flutter & Dart全栈开发多Isolate增强并发处理理能⼒力力 闲⻥鱼 - 让你的闲置游起来 本地测试 本地调⽤用远程服务 单次请求所有⽇日志回传 Dart Zone HTTP 闲⻥鱼 - 让你的闲置游起来 ⽆无冲突调试 Isolate加载每个⼈人的代码 只调试指定Isolate 闲⻥鱼 - 让你的闲置游起来 部署时间:20分钟 -> 3秒 本地测试远程服务 ⽆无冲突调试 效率提⾼高 闲⻥鱼 -0 码力 | 39 页 | 17.12 MB | 1 年前3 陈新新 Flutter & Dart全栈开发多Isolate增强并发处理理能⼒力力 闲⻥鱼 - 让你的闲置游起来 本地测试 本地调⽤用远程服务 单次请求所有⽇日志回传 Dart Zone HTTP 闲⻥鱼 - 让你的闲置游起来 ⽆无冲突调试 Isolate加载每个⼈人的代码 只调试指定Isolate 闲⻥鱼 - 让你的闲置游起来 部署时间:20分钟 -> 3秒 本地测试远程服务 ⽆无冲突调试 效率提⾼高 闲⻥鱼 -0 码力 | 39 页 | 17.12 MB | 1 年前3
 [试读] Angular 5 高级编程■ ■ ■ 译 者 序 在欣欣向荣的 Web 前端领域,新的框架层出不穷,如此多的选择给开发者带来极大的 痛苦:学习难度如何?开发效率如何?运行性能如何?可维护性高吗?还有开发社区、发 展前景等因素需要考虑。评估任何一个框架不仅要看其优势,还要看它给开发者挖的坑有 多深。Angular 框架自最初的 AngularJS,迭代到最新的 Angular 5,其不变的最显著特征就 片段。JavaScript 打开一个回连到服务器的连接,并等待信号重新加载页面,当服务器检测 到 todo 目录中的任何文件发生变更时,就会发送信号。一旦保存 index.html 文件,服务器 将检测到变更并发送信号,浏览器将重新加载,反映新的内容,如图 2-2 所示。 图 2-2 编辑 HTML 文件的内容 第 2 章 ■ 第一个 Angular 应用程序 13 ■ 提示: 所用平台特有的不同引导方法。支持 Angular 的每个平台的开发人员都提供了他们平台特 有的引导方法的详细信息。 浏览器执行引导文件中的代码,这会调用 Angular,后者又处理 HTML 文档并发现 todo-app 元素。用于定义组件的 selector 属性匹配到 todo-app 元素,这让 Angular 删除占位 符内容,并将其替换为组件模板(从 app.component.html0 码力 | 42 页 | 6.14 MB | 1 年前3 [试读] Angular 5 高级编程■ ■ ■ 译 者 序 在欣欣向荣的 Web 前端领域,新的框架层出不穷,如此多的选择给开发者带来极大的 痛苦:学习难度如何?开发效率如何?运行性能如何?可维护性高吗?还有开发社区、发 展前景等因素需要考虑。评估任何一个框架不仅要看其优势,还要看它给开发者挖的坑有 多深。Angular 框架自最初的 AngularJS,迭代到最新的 Angular 5,其不变的最显著特征就 片段。JavaScript 打开一个回连到服务器的连接,并等待信号重新加载页面,当服务器检测 到 todo 目录中的任何文件发生变更时,就会发送信号。一旦保存 index.html 文件,服务器 将检测到变更并发送信号,浏览器将重新加载,反映新的内容,如图 2-2 所示。 图 2-2 编辑 HTML 文件的内容 第 2 章 ■ 第一个 Angular 应用程序 13 ■ 提示: 所用平台特有的不同引导方法。支持 Angular 的每个平台的开发人员都提供了他们平台特 有的引导方法的详细信息。 浏览器执行引导文件中的代码,这会调用 Angular,后者又处理 HTML 文档并发现 todo-app 元素。用于定义组件的 selector 属性匹配到 todo-app 元素,这让 Angular 删除占位 符内容,并将其替换为组件模板(从 app.component.html0 码力 | 42 页 | 6.14 MB | 1 年前3
 Hello 算法 1.0.0b1 JavaScript版算法有对应最优的数据结构。给定算法,一般可基于不同的数据结构实现,而最终执行效率往往相差很 大。 Figure 1‑2. 数据结构与算法的关系 如果将「LEGO 乐高」类比到「数据结构与算法」,那么可以得到下表所示的对应关系。 数据结构与算法 LEGO 乐高 输入数据 未拼装的积木 数据结构 积木组织形式,包括形状、大小、连接方式等 算法 把积木拼成目标形态的一系列操作步骤 输出数据 积木模型 1 ‧ 算法是在有限时间内解决特定问题的一组指令或操作步骤,数据结构是在计算机中组织与存储数据的方 式。 ‧ 数据结构与算法两者紧密联系。数据结构是算法的底座,算法是发挥数据结构的舞台。 ‧ 乐高积木对应数据,积木形状和连接形式对应数据结构,拼装积木的流程步骤对应算法。 12 2. 复杂度分析 2.1. 算法效率评估 2.1.1. 算法评价维度 在开始学习算法之前,我们首先要想清楚算 看,我们设计算法时追求两个层面的目标。 1. 找到问题解法。算法需要能够在规定的输入范围下,可靠地求得问题的正确解。 2. 寻求最优解法。同一个问题可能存在多种解法,而我们希望算法效率尽可能的高。 换言之,在可以解决问题的前提下,算法效率则是主要评价维度,包括: ‧ 时间效率,即算法的运行速度的快慢。 ‧ 空间效率,即算法占用的内存空间大小。 数据结构与算法追求“运行速度快、占用内存0 码力 | 185 页 | 14.70 MB | 1 年前3 Hello 算法 1.0.0b1 JavaScript版算法有对应最优的数据结构。给定算法,一般可基于不同的数据结构实现,而最终执行效率往往相差很 大。 Figure 1‑2. 数据结构与算法的关系 如果将「LEGO 乐高」类比到「数据结构与算法」,那么可以得到下表所示的对应关系。 数据结构与算法 LEGO 乐高 输入数据 未拼装的积木 数据结构 积木组织形式,包括形状、大小、连接方式等 算法 把积木拼成目标形态的一系列操作步骤 输出数据 积木模型 1 ‧ 算法是在有限时间内解决特定问题的一组指令或操作步骤,数据结构是在计算机中组织与存储数据的方 式。 ‧ 数据结构与算法两者紧密联系。数据结构是算法的底座,算法是发挥数据结构的舞台。 ‧ 乐高积木对应数据,积木形状和连接形式对应数据结构,拼装积木的流程步骤对应算法。 12 2. 复杂度分析 2.1. 算法效率评估 2.1.1. 算法评价维度 在开始学习算法之前,我们首先要想清楚算 看,我们设计算法时追求两个层面的目标。 1. 找到问题解法。算法需要能够在规定的输入范围下,可靠地求得问题的正确解。 2. 寻求最优解法。同一个问题可能存在多种解法,而我们希望算法效率尽可能的高。 换言之,在可以解决问题的前提下,算法效率则是主要评价维度,包括: ‧ 时间效率,即算法的运行速度的快慢。 ‧ 空间效率,即算法占用的内存空间大小。 数据结构与算法追求“运行速度快、占用内存0 码力 | 185 页 | 14.70 MB | 1 年前3
 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.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
 阮一峰 JavaScript 教程入门真的不难。 JavaScript 的性能优势体现在以下方面。 (1)灵活的语法,表达力强。 JavaScript 既支持类似 C 语言清晰的过程式编程,也支持灵活的 函数式编程,可以用来写并发处理(concurrent)。这些语法特性已 经被证明非常强大,可以用于许多场合,尤其适用异步编程。 JavaScript 的所有值都是对象,这为程序员提供了灵活性和便利 性。因为你可以很方便 WebAssembly,就可以在浏览器里面运行。 (3)事件驱动和非阻塞式设计。 JavaScript 程序可以采用事件驱动(event-driven)和非阻塞式 (non-blocking)设计,在服务器端适合高并发环境,普通的硬件就 可以承受很大的访问量。 JavaScript 是一种开放的语言。它的标准 ECMA-262 是 ISO 国 际标准,写得非常详尽明确;该标准的主要实现(比如 V8 和 SpiderMonkey 2009年,Node.js 项目诞生,创始人为 Ryan Dahl,它标志着 JavaScript 可以用于服务器端编程,从此网站的前端和后端可以使 用同一种语言开发。并且,Node.js 可以承受很大的并发流量,使得 开发某些互联网大规模的实时应用变得容易。 2009年,Jeremy Ashkenas 发布了 CoffeeScript 的最初版 本。CoffeeScript 可以被转换为 JavaScript0 码力 | 540 页 | 3.32 MB | 10 月前3 阮一峰 JavaScript 教程入门真的不难。 JavaScript 的性能优势体现在以下方面。 (1)灵活的语法,表达力强。 JavaScript 既支持类似 C 语言清晰的过程式编程,也支持灵活的 函数式编程,可以用来写并发处理(concurrent)。这些语法特性已 经被证明非常强大,可以用于许多场合,尤其适用异步编程。 JavaScript 的所有值都是对象,这为程序员提供了灵活性和便利 性。因为你可以很方便 WebAssembly,就可以在浏览器里面运行。 (3)事件驱动和非阻塞式设计。 JavaScript 程序可以采用事件驱动(event-driven)和非阻塞式 (non-blocking)设计,在服务器端适合高并发环境,普通的硬件就 可以承受很大的访问量。 JavaScript 是一种开放的语言。它的标准 ECMA-262 是 ISO 国 际标准,写得非常详尽明确;该标准的主要实现(比如 V8 和 SpiderMonkey 2009年,Node.js 项目诞生,创始人为 Ryan Dahl,它标志着 JavaScript 可以用于服务器端编程,从此网站的前端和后端可以使 用同一种语言开发。并且,Node.js 可以承受很大的并发流量,使得 开发某些互联网大规模的实时应用变得容易。 2009年,Jeremy Ashkenas 发布了 CoffeeScript 的最初版 本。CoffeeScript 可以被转换为 JavaScript0 码力 | 540 页 | 3.32 MB | 10 月前3
 Hello 算法 1.0.0 JavaScript版“计算操作运行时间统计”简化为“计算操作数量统计”,这样一来估算难度就大大降低了。 ‧ 时间复杂度也存在一定的局限性。例如,尽管算法 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 码力 | 376 页 | 17.57 MB | 1 年前3 Hello 算法 1.0.0 JavaScript版“计算操作运行时间统计”简化为“计算操作数量统计”,这样一来估算难度就大大降低了。 ‧ 时间复杂度也存在一定的局限性。例如,尽管算法 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 码力 | 376 页 | 17.57 MB | 1 年前3
共 49 条
- 1
- 2
- 3
- 4
- 5













