 2019-2021 美团技术年货 前端篇现状 虽然 MTFlutter 做了诸多 Flutter Native 层面的定制与优化,但在 Flutter Web 上 的建设才刚起步,具体表现在: ● MTFlutter 现有的基础依赖如:Request(请求封装)、Router(路由)、埋点、 容器桥、前端监控,尚未支持在 Web 中的实现。 ● MTFlutter 已实现了完整的 Flutter Module 的打包发布流程,但并不支持 有大量的工作(上图黄色部分所示),主要包括: ● 扩展基础依赖(如:Request、Router、埋点等)在 Web 侧的支持。 ● 完善工程化建设,例如:静态资源优化、构建与部署自动化。 ● 深入滚动性能与页面加载性能优化,使得 Flutter Web 能够满足基本的投产要求。 四、详细设计 4.1 基础依赖建设 企业级应用的基础开发依赖 ( 如:请求库、路由库、埋点库等 ),要重新在 Flutter Flutter 中 用 Dart 搭建一套,时间成本、兼容性、风险等都是不可控的。而 MTFlutter 是基于 原有 Native 基础依赖开发的 Plugin,因此并不支持 Web 端。此章节将展开介绍如 何丝滑无感地扩展 MTFlutter 基础依赖在 Web 端的实现。 4.1.1 Flutter Package 分平台编程 在 Flutter 中通过使用 Package 可以创建易于共享的模块化代码。官方强烈推荐使0 码力 | 738 页 | 50.29 MB | 1 年前3 2019-2021 美团技术年货 前端篇现状 虽然 MTFlutter 做了诸多 Flutter Native 层面的定制与优化,但在 Flutter Web 上 的建设才刚起步,具体表现在: ● MTFlutter 现有的基础依赖如:Request(请求封装)、Router(路由)、埋点、 容器桥、前端监控,尚未支持在 Web 中的实现。 ● MTFlutter 已实现了完整的 Flutter Module 的打包发布流程,但并不支持 有大量的工作(上图黄色部分所示),主要包括: ● 扩展基础依赖(如:Request、Router、埋点等)在 Web 侧的支持。 ● 完善工程化建设,例如:静态资源优化、构建与部署自动化。 ● 深入滚动性能与页面加载性能优化,使得 Flutter Web 能够满足基本的投产要求。 四、详细设计 4.1 基础依赖建设 企业级应用的基础开发依赖 ( 如:请求库、路由库、埋点库等 ),要重新在 Flutter Flutter 中 用 Dart 搭建一套,时间成本、兼容性、风险等都是不可控的。而 MTFlutter 是基于 原有 Native 基础依赖开发的 Plugin,因此并不支持 Web 端。此章节将展开介绍如 何丝滑无感地扩展 MTFlutter 基础依赖在 Web 端的实现。 4.1.1 Flutter Package 分平台编程 在 Flutter 中通过使用 Package 可以创建易于共享的模块化代码。官方强烈推荐使0 码力 | 738 页 | 50.29 MB | 1 年前3
 Hello 算法 1.2.0 简体中文 JavaScript 版。 第 1 章 初识算法 www.hello‑algo.com 11 1.1 算法无处不在 当我们听到“算法”这个词时,很自然地会想到数学。然而实际上,许多算法并不涉及复杂数学,而是更多 地依赖基本逻辑,这些逻辑在我们的日常生活中处处可见。 在正式探讨算法之前,有一个有趣的事实值得分享:你已经在不知不觉中学会了许多算法,并习惯将它们应 用到日常生活中了。下面我将举几个具体的例子来证实这一点。 数据结构与算法的关系 如图 1‑4 所示,数据结构与算法高度相关、紧密结合,具体表现在以下三个方面。 ‧ 数据结构是算法的基石。数据结构为算法提供了结构化存储的数据,以及操作数据的方法。 ‧ 算法为数据结构注入生命力。数据结构本身仅存储数据信息,结合算法才能解决特定问题。 ‧ 算法通常可以基于不同的数据结构实现,但执行效率可能相差很大,选择合适的数据结构是关键。 图 1‑4 数据结构与算法的关系 数据结构与算法犹如图 取当前看来最好的选择。 ‧ 算法是在有限时间内解决特定问题的一组指令或操作步骤,而数据结构是计算机中组织和存储数据的 方式。 ‧ 数据结构与算法紧密相连。数据结构是算法的基石,而算法为数据结构注入生命力。 ‧ 我们可以将数据结构与算法类比为拼装积木,积木代表数据,积木的形状和连接方式等代表数据结构, 拼装积木的步骤则对应算法。 1. Q & A Q:作为一名程序员,我在日常工作中从未0 码力 | 379 页 | 18.47 MB | 10 月前3 Hello 算法 1.2.0 简体中文 JavaScript 版。 第 1 章 初识算法 www.hello‑algo.com 11 1.1 算法无处不在 当我们听到“算法”这个词时,很自然地会想到数学。然而实际上,许多算法并不涉及复杂数学,而是更多 地依赖基本逻辑,这些逻辑在我们的日常生活中处处可见。 在正式探讨算法之前,有一个有趣的事实值得分享:你已经在不知不觉中学会了许多算法,并习惯将它们应 用到日常生活中了。下面我将举几个具体的例子来证实这一点。 数据结构与算法的关系 如图 1‑4 所示,数据结构与算法高度相关、紧密结合,具体表现在以下三个方面。 ‧ 数据结构是算法的基石。数据结构为算法提供了结构化存储的数据,以及操作数据的方法。 ‧ 算法为数据结构注入生命力。数据结构本身仅存储数据信息,结合算法才能解决特定问题。 ‧ 算法通常可以基于不同的数据结构实现,但执行效率可能相差很大,选择合适的数据结构是关键。 图 1‑4 数据结构与算法的关系 数据结构与算法犹如图 取当前看来最好的选择。 ‧ 算法是在有限时间内解决特定问题的一组指令或操作步骤,而数据结构是计算机中组织和存储数据的 方式。 ‧ 数据结构与算法紧密相连。数据结构是算法的基石,而算法为数据结构注入生命力。 ‧ 我们可以将数据结构与算法类比为拼装积木,积木代表数据,积木的形状和连接方式等代表数据结构, 拼装积木的步骤则对应算法。 1. Q & A Q:作为一名程序员,我在日常工作中从未0 码力 | 379 页 | 18.47 MB | 10 月前3
 阮一峰 《ECMAScript 6入门》 第三版参数生成source map文件 $ babel src -d lib -s 上面代码是在全局环境下,进行 Babel 转码。这意味着,如果项目要运行,全局环 境必须有 Babel,也就是说项目产生了对环境的依赖。另一方面,这样做也无法支 持不同项目使用不同版本的 Babel。 一个解决办法是将 babel-cli 安装在项目之中。 # 安装 $ npm install --save-dev babel-cli 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象 的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回 收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中。 这是因为垃圾回收机制依赖引用计数,如果一个值的引用次数不为 0 ,垃圾回收 机制就不会释放这块内存。结束使用该值之后,有时会忘记取消引用,导致内存无 法释放,进而可能会引发内存泄漏。WeakSet 里面的引用,都不计入垃圾回收机 函数从暂停状态到恢复运行,它的上下 文状态(context)是不变的。通过 next 方法的参数,就有办法在 Generator 函 数开始运行之后,继续向函数体内部注入值。也就是说,可以在 Generator 函数运 行的不同阶段,从外部向内部注入不同的值,从而调整函数行为。 再看一个例子。 Generator 函数的语法 396 function* foo(x) { var y = 2 *0 码力 | 679 页 | 2.66 MB | 1 年前3 阮一峰 《ECMAScript 6入门》 第三版参数生成source map文件 $ babel src -d lib -s 上面代码是在全局环境下,进行 Babel 转码。这意味着,如果项目要运行,全局环 境必须有 Babel,也就是说项目产生了对环境的依赖。另一方面,这样做也无法支 持不同项目使用不同版本的 Babel。 一个解决办法是将 babel-cli 安装在项目之中。 # 安装 $ npm install --save-dev babel-cli 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象 的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回 收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中。 这是因为垃圾回收机制依赖引用计数,如果一个值的引用次数不为 0 ,垃圾回收 机制就不会释放这块内存。结束使用该值之后,有时会忘记取消引用,导致内存无 法释放,进而可能会引发内存泄漏。WeakSet 里面的引用,都不计入垃圾回收机 函数从暂停状态到恢复运行,它的上下 文状态(context)是不变的。通过 next 方法的参数,就有办法在 Generator 函 数开始运行之后,继续向函数体内部注入值。也就是说,可以在 Generator 函数运 行的不同阶段,从外部向内部注入不同的值,从而调整函数行为。 再看一个例子。 Generator 函数的语法 396 function* foo(x) { var y = 2 *0 码力 | 679 页 | 2.66 MB | 1 年前3
 阮一峰 JavaScript 教程Chrome App 项目、Github 的 Electron 项目、以及 TideSDK 项目,都可以用来编写运行于 Windows、Mac OS 和 Android 等 多个桌面平台的程序,不依赖浏览器。 (7)小结 可以预期,JavaScript 最终将能让你只用一种语言,就开发出适应 不同平台(包括桌面端、服务器端、手机端)的程序。早在2013年9月 的统计之中,JavaScript 使得函数 createIncrementor 的内 部环境,一直存在。所以,闭包可以看作是函数内部作用域的一个接 口。 为什么会这样呢?原因就在于 inc 始终在内存中,而 inc 的存在依赖 于 createIncrementor ,因此也始终在内存中,不会在调用结束后,被 垃圾回收机制回收。 闭包的另一个用处,是封装对象的私有属性和私有方法。 1. function Person(name) console.log(foo); // 2 6. })() 上面代码中,严格模式下, eval 内部还是改写了外部变量,可见安全 风险依然存在。 总之, eval 的本质是在当前作用域之中,注入代码。由于安全风险和 不利于 JavaScript 引擎优化执行速度,所以一般不推荐使用。通常 情况下, eval 最常见的场合是解析 JSON 数据的字符串,不过正确 的做法应该是使用原生的0 码力 | 540 页 | 3.32 MB | 10 月前3 阮一峰 JavaScript 教程Chrome App 项目、Github 的 Electron 项目、以及 TideSDK 项目,都可以用来编写运行于 Windows、Mac OS 和 Android 等 多个桌面平台的程序,不依赖浏览器。 (7)小结 可以预期,JavaScript 最终将能让你只用一种语言,就开发出适应 不同平台(包括桌面端、服务器端、手机端)的程序。早在2013年9月 的统计之中,JavaScript 使得函数 createIncrementor 的内 部环境,一直存在。所以,闭包可以看作是函数内部作用域的一个接 口。 为什么会这样呢?原因就在于 inc 始终在内存中,而 inc 的存在依赖 于 createIncrementor ,因此也始终在内存中,不会在调用结束后,被 垃圾回收机制回收。 闭包的另一个用处,是封装对象的私有属性和私有方法。 1. function Person(name) console.log(foo); // 2 6. })() 上面代码中,严格模式下, eval 内部还是改写了外部变量,可见安全 风险依然存在。 总之, eval 的本质是在当前作用域之中,注入代码。由于安全风险和 不利于 JavaScript 引擎优化执行速度,所以一般不推荐使用。通常 情况下, eval 最常见的场合是解析 JSON 数据的字符串,不过正确 的做法应该是使用原生的0 码力 | 540 页 | 3.32 MB | 10 月前3
 前端开发者指南(2017)式的编程语言,支持 面向对象,命令式以及函数式编程风格。它有一个可被用来操作文字,数组,日期以及 正则表达式的 API,然而并不包含任何 I/O,因此像建网,存储或者图形工具之类的功能 就需要依赖它所在的开发环境。 — 维基百科 相关规范/文档: ECMAScript® 2017 语言规范 Web APIs (HTML5 及其他) 当使用 Javascript 给网页编写代码的时候,有许多的 可缩放矢量图形(亦称 SVG) 正则表达式 内容策略 Microdata / Microformats 任务管理器,构建工具,过程自动化工具 自适应网页设计 面向对象的程序设计 应用程序构建 模块 依赖管理 包管理 JavaScript 动画 CSS 动画 图表/图形 UI 控件 代码质量测试 代码覆盖率测试 代码复杂性分析 集成测试 命令行/命令行界面 模板策略 模板引擎 关于包管理工具的学习 包管理工具或者包管理系统,是一些以一致的风格对计算机操作系统中的软件包进行自 动化安装、升级、配置以及删除的软件工具。它通常维护着一个关于软件依赖性和版本 信息的数据库,用以解决软件之间的配对和依赖问题。 — 维基百科 综合学习: Javascript 包管理工具的工作原理入门 npm 和 Bower 中神奇的 SemVer Ranges [阅读] 包管理工具:给前端开发新手的介绍性指南0 码力 | 164 页 | 6.43 MB | 1 年前3 前端开发者指南(2017)式的编程语言,支持 面向对象,命令式以及函数式编程风格。它有一个可被用来操作文字,数组,日期以及 正则表达式的 API,然而并不包含任何 I/O,因此像建网,存储或者图形工具之类的功能 就需要依赖它所在的开发环境。 — 维基百科 相关规范/文档: ECMAScript® 2017 语言规范 Web APIs (HTML5 及其他) 当使用 Javascript 给网页编写代码的时候,有许多的 可缩放矢量图形(亦称 SVG) 正则表达式 内容策略 Microdata / Microformats 任务管理器,构建工具,过程自动化工具 自适应网页设计 面向对象的程序设计 应用程序构建 模块 依赖管理 包管理 JavaScript 动画 CSS 动画 图表/图形 UI 控件 代码质量测试 代码覆盖率测试 代码复杂性分析 集成测试 命令行/命令行界面 模板策略 模板引擎 关于包管理工具的学习 包管理工具或者包管理系统,是一些以一致的风格对计算机操作系统中的软件包进行自 动化安装、升级、配置以及删除的软件工具。它通常维护着一个关于软件依赖性和版本 信息的数据库,用以解决软件之间的配对和依赖问题。 — 维基百科 综合学习: Javascript 包管理工具的工作原理入门 npm 和 Bower 中神奇的 SemVer Ranges [阅读] 包管理工具:给前端开发新手的介绍性指南0 码力 | 164 页 | 6.43 MB | 1 年前3
 Hello 算法 1.1.0 JavaScript版算法世界。 第 1 章 初识算法 hello‑algo.com 11 1.1 算法无处不在 当我们听到“算法”这个词时,很自然地会想到数学。然而实际上,许多算法并不涉及复杂数学,而是更多 地依赖基本逻辑,这些逻辑在我们的日常生活中处处可见。 在正式探讨算法之前,有一个有趣的事实值得分享:你已经在不知不觉中学会了许多算法,并习惯将它们应 用到日常生活中了。下面我将举几个具体的例子来证实这一点。 所示,在程序运行时,数据会从硬盘中被读取到内存中,供 CPU 计算使用。缓存可以看作 CPU 的 一部分,它通过智能地从内存加载数据,给 CPU 提供高速的数据读取,从而显著提升程序的执行效率,减少 对较慢的内存的依赖。 图 4‑10 硬盘、内存和缓存之间的数据流通 4.4.2 数据结构的内存效率 在内存空间利用方面,数组和链表各自具有优势和局限性。 一方面,内存是有限的,且同一块内存不能被多个程序共享, 大。 哈希查找 ‧ 适合对查询性能要求很高的场景,平均时间复杂度为 ?(1) 。 ‧ 不适合需要有序数据或范围查找的场景,因为哈希表无法维护数据的有序性。 ‧ 对哈希函数和哈希冲突处理策略的依赖性较高,具有较大的性能劣化风险。 ‧ 不适合数据量过大的情况,因为哈希表需要额外空间来最大程度地减少冲突,从而提供良好的查询性 能。 树查找 ‧ 适用于海量数据,因为树节点在内存中是分散存储的。0 码力 | 379 页 | 18.46 MB | 1 年前3 Hello 算法 1.1.0 JavaScript版算法世界。 第 1 章 初识算法 hello‑algo.com 11 1.1 算法无处不在 当我们听到“算法”这个词时,很自然地会想到数学。然而实际上,许多算法并不涉及复杂数学,而是更多 地依赖基本逻辑,这些逻辑在我们的日常生活中处处可见。 在正式探讨算法之前,有一个有趣的事实值得分享:你已经在不知不觉中学会了许多算法,并习惯将它们应 用到日常生活中了。下面我将举几个具体的例子来证实这一点。 所示,在程序运行时,数据会从硬盘中被读取到内存中,供 CPU 计算使用。缓存可以看作 CPU 的 一部分,它通过智能地从内存加载数据,给 CPU 提供高速的数据读取,从而显著提升程序的执行效率,减少 对较慢的内存的依赖。 图 4‑10 硬盘、内存和缓存之间的数据流通 4.4.2 数据结构的内存效率 在内存空间利用方面,数组和链表各自具有优势和局限性。 一方面,内存是有限的,且同一块内存不能被多个程序共享, 大。 哈希查找 ‧ 适合对查询性能要求很高的场景,平均时间复杂度为 ?(1) 。 ‧ 不适合需要有序数据或范围查找的场景,因为哈希表无法维护数据的有序性。 ‧ 对哈希函数和哈希冲突处理策略的依赖性较高,具有较大的性能劣化风险。 ‧ 不适合数据量过大的情况,因为哈希表需要额外空间来最大程度地减少冲突,从而提供良好的查询性 能。 树查找 ‧ 适用于海量数据,因为树节点在内存中是分散存储的。0 码力 | 379 页 | 18.46 MB | 1 年前3
 Hello 算法 1.0.0 JavaScript版算法世界。 第 1 章 初识算法 hello‑algo.com 11 1.1 算法无处不在 当我们听到“算法”这个词时,很自然地会想到数学。然而实际上,许多算法并不涉及复杂数学,而是更多 地依赖基本逻辑,这些逻辑在我们的日常生活中处处可见。 在正式探讨算法之前,有一个有趣的事实值得分享:你已经在不知不觉中学会了许多算法,并习惯将它们应 用到日常生活中了。下面我将举几个具体的例子来证实这一点。 所示,在程序运行时,数据会从硬盘中被读取到内存中,供 CPU 计算使用。缓存可以看作 CPU 的 一部分,它通过智能地从内存加载数据,给 CPU 提供高速的数据读取,从而显著提升程序的执行效率,减少 对较慢的内存的依赖。 图 4‑10 硬盘、内存和缓存之间的数据流通 4.4.2 数据结构的内存效率 在内存空间利用方面,数组和链表各自具有优势和局限性。 一方面,内存是有限的,且同一块内存不能被多个程序共享, 大。 哈希查找 ‧ 适合对查询性能要求很高的场景,平均时间复杂度为 ?(1) 。 ‧ 不适合需要有序数据或范围查找的场景,因为哈希表无法维护数据的有序性。 ‧ 对哈希函数和哈希冲突处理策略的依赖性较高,具有较大的性能劣化风险。 ‧ 不适合数据量过大的情况,因为哈希表需要额外空间来最大程度地减少冲突,从而提供良好的查询性 能。 树查找 ‧ 适用于海量数据,因为树节点在内存中是分散存储的。0 码力 | 376 页 | 17.57 MB | 1 年前3 Hello 算法 1.0.0 JavaScript版算法世界。 第 1 章 初识算法 hello‑algo.com 11 1.1 算法无处不在 当我们听到“算法”这个词时,很自然地会想到数学。然而实际上,许多算法并不涉及复杂数学,而是更多 地依赖基本逻辑,这些逻辑在我们的日常生活中处处可见。 在正式探讨算法之前,有一个有趣的事实值得分享:你已经在不知不觉中学会了许多算法,并习惯将它们应 用到日常生活中了。下面我将举几个具体的例子来证实这一点。 所示,在程序运行时,数据会从硬盘中被读取到内存中,供 CPU 计算使用。缓存可以看作 CPU 的 一部分,它通过智能地从内存加载数据,给 CPU 提供高速的数据读取,从而显著提升程序的执行效率,减少 对较慢的内存的依赖。 图 4‑10 硬盘、内存和缓存之间的数据流通 4.4.2 数据结构的内存效率 在内存空间利用方面,数组和链表各自具有优势和局限性。 一方面,内存是有限的,且同一块内存不能被多个程序共享, 大。 哈希查找 ‧ 适合对查询性能要求很高的场景,平均时间复杂度为 ?(1) 。 ‧ 不适合需要有序数据或范围查找的场景,因为哈希表无法维护数据的有序性。 ‧ 对哈希函数和哈希冲突处理策略的依赖性较高,具有较大的性能劣化风险。 ‧ 不适合数据量过大的情况,因为哈希表需要额外空间来最大程度地减少冲突,从而提供良好的查询性 能。 树查找 ‧ 适用于海量数据,因为树节点在内存中是分散存储的。0 码力 | 376 页 | 17.57 MB | 1 年前3
 Hello 算法 1.2.0 繁体中文 JavaScript 版如圖 1‑4 所示,資料結構與演算法高度相關、緊密結合,具體表現在以下三個方面。 ‧ 資料結構是演算法的基石。資料結構為演算法提供了結構化儲存的資料,以及操作資料的方法。 ‧ 演算法為資料結構注入生命力。資料結構本身僅儲存資料資訊,結合演算法才能解決特定問題。 ‧ 演算法通常可以基於不同的資料結構實現,但執行效率可能相差很大,選擇合適的資料結構是關鍵。 圖 1‑4 資料結構與演算法的關係 來最好的選擇。 ‧ 演算法是在有限時間內解決特定問題的一組指令或操作步驟,而資料結構是計算機中組織和儲存資料 的方式。 ‧ 資料結構與演算法緊密相連。資料結構是演算法的基石,而演算法為資料結構注入生命力。 ‧ 我們可以將資料結構與演算法類比為拼裝積木,積木代表資料,積木的形狀和連線方式等代表資料結 構,拼裝積木的步驟則對應演算法。 1. Q & A Q:作為一名程式設計師,我在日常工0 码力 | 379 页 | 18.78 MB | 10 月前3 Hello 算法 1.2.0 繁体中文 JavaScript 版如圖 1‑4 所示,資料結構與演算法高度相關、緊密結合,具體表現在以下三個方面。 ‧ 資料結構是演算法的基石。資料結構為演算法提供了結構化儲存的資料,以及操作資料的方法。 ‧ 演算法為資料結構注入生命力。資料結構本身僅儲存資料資訊,結合演算法才能解決特定問題。 ‧ 演算法通常可以基於不同的資料結構實現,但執行效率可能相差很大,選擇合適的資料結構是關鍵。 圖 1‑4 資料結構與演算法的關係 來最好的選擇。 ‧ 演算法是在有限時間內解決特定問題的一組指令或操作步驟,而資料結構是計算機中組織和儲存資料 的方式。 ‧ 資料結構與演算法緊密相連。資料結構是演算法的基石,而演算法為資料結構注入生命力。 ‧ 我們可以將資料結構與演算法類比為拼裝積木,積木代表資料,積木的形狀和連線方式等代表資料結 構,拼裝積木的步驟則對應演算法。 1. Q & A Q:作為一名程式設計師,我在日常工0 码力 | 379 页 | 18.78 MB | 10 月前3
 Hello 算法 1.0.0b5 JavaScript版算法世界。 第 1 章 初识算法 hello‑algo.com 10 1.1 算法无处不在 当我们听到“算法”这个词时,很自然地会想到数学。然而实际上,许多算法并不涉及复杂数学,而是更多 地依赖于基本逻辑,这些逻辑在我们的日常生活中处处可见。 在正式探讨算法之前,有一个有趣的事实值得分享:你已经在不知不觉中学会了许多算法,并习惯将它们应 用到日常生活中了。下面,我将举几个具体例子来证实这一点。 大。 哈希查找 ‧ 适合对查询性能要求很高的场景,平均时间复杂度为 ?(1) 。 ‧ 不适合需要有序数据或范围查找的场景,因为哈希表无法维护数据的有序性。 ‧ 对哈希函数和哈希冲突处理策略的依赖性较高,具有较大的性能劣化风险。 ‧ 不适合数据量过大的情况,因为哈希表需要额外空间来最大程度地减少冲突,从而提供良好的查询性 能。 树查找 ‧ 适用于海量数据,因为树节点在内存中是离散存储的。 在持续增删节点的过程中,二叉搜索树可能产生倾斜,时间复杂度劣化至 ?(?) 。 ‧ 若使用 AVL 树或红黑树,则各项操作可在 ?(log ?) 效率下稳定运行,但维护树平衡的操作会增加额 外开销。 10.6 小结 ‧ 二分查找依赖于数据的有序性,通过循环逐步缩减一半搜索区间来实现查找。它要求输入数据有序,且 仅适用于数组或基于数组实现的数据结构。 第 10 章 搜索 hello‑algo.com 219 ‧ 暴力搜索通0 码力 | 375 页 | 30.68 MB | 1 年前3 Hello 算法 1.0.0b5 JavaScript版算法世界。 第 1 章 初识算法 hello‑algo.com 10 1.1 算法无处不在 当我们听到“算法”这个词时,很自然地会想到数学。然而实际上,许多算法并不涉及复杂数学,而是更多 地依赖于基本逻辑,这些逻辑在我们的日常生活中处处可见。 在正式探讨算法之前,有一个有趣的事实值得分享:你已经在不知不觉中学会了许多算法,并习惯将它们应 用到日常生活中了。下面,我将举几个具体例子来证实这一点。 大。 哈希查找 ‧ 适合对查询性能要求很高的场景,平均时间复杂度为 ?(1) 。 ‧ 不适合需要有序数据或范围查找的场景,因为哈希表无法维护数据的有序性。 ‧ 对哈希函数和哈希冲突处理策略的依赖性较高,具有较大的性能劣化风险。 ‧ 不适合数据量过大的情况,因为哈希表需要额外空间来最大程度地减少冲突,从而提供良好的查询性 能。 树查找 ‧ 适用于海量数据,因为树节点在内存中是离散存储的。 在持续增删节点的过程中,二叉搜索树可能产生倾斜,时间复杂度劣化至 ?(?) 。 ‧ 若使用 AVL 树或红黑树,则各项操作可在 ?(log ?) 效率下稳定运行,但维护树平衡的操作会增加额 外开销。 10.6 小结 ‧ 二分查找依赖于数据的有序性,通过循环逐步缩减一半搜索区间来实现查找。它要求输入数据有序,且 仅适用于数组或基于数组实现的数据结构。 第 10 章 搜索 hello‑algo.com 219 ‧ 暴力搜索通0 码力 | 375 页 | 30.68 MB | 1 年前3
 JavaScript Promise迷你书(中文版)com/"); // => 返回promise对象 如Promises Overview 中做的简单介绍一样,promise对象拥有几个实例方法, 我们使用 这些实例方法来为promise对象创建依赖于promise的具体状态、并且只会被执行一次的 回调函数。 为promise对象添加处理方法主要有以下两种 • promise对象被 resolve 时的处理(onFulfilled) • promise对象被 通知对象 }).catch(function(error){ console.error(error); }); 使用了Thenable的notification-thenable.js 和依赖于Promise的 notification-as-promise.js , 实际上都是非常相似的使用方法。 notification-thenable.js 和 notification-as-promise Thenable风格表现为位于回调和Promise风格中间的一种状态,作为类库的公开API有点 不太成熟,所以并不常见。 Thenable本身并不依赖于 Promise 功能,但是Promise之外也没有使用Thenable的方式, 所以可以认为Thenable间接依赖于Promise。 另外,用户需要对 Promise.resolve(thenable) 有所理解才能使用好Thenable,因此 作0 码力 | 112 页 | 1010.02 KB | 1 年前3 JavaScript Promise迷你书(中文版)com/"); // => 返回promise对象 如Promises Overview 中做的简单介绍一样,promise对象拥有几个实例方法, 我们使用 这些实例方法来为promise对象创建依赖于promise的具体状态、并且只会被执行一次的 回调函数。 为promise对象添加处理方法主要有以下两种 • promise对象被 resolve 时的处理(onFulfilled) • promise对象被 通知对象 }).catch(function(error){ console.error(error); }); 使用了Thenable的notification-thenable.js 和依赖于Promise的 notification-as-promise.js , 实际上都是非常相似的使用方法。 notification-thenable.js 和 notification-as-promise Thenable风格表现为位于回调和Promise风格中间的一种状态,作为类库的公开API有点 不太成熟,所以并不常见。 Thenable本身并不依赖于 Promise 功能,但是Promise之外也没有使用Thenable的方式, 所以可以认为Thenable间接依赖于Promise。 另外,用户需要对 Promise.resolve(thenable) 有所理解才能使用好Thenable,因此 作0 码力 | 112 页 | 1010.02 KB | 1 年前3
共 13 条
- 1
- 2













