Hello 算法 1.1.0 JavaScript版一方面,难以排除测试环境的干扰因素。硬件配置会影响算法的性能。比如在某台计算机中,算法 A 的运行 时间比算法 B 短;但在另一台配置不同的计算机中,可能得到相反的测试结果。这意味着我们需要在各种机 器上进行测试,统计平均效率,而这是不现实的。 另一方面,展开完整测试非常耗费资源。随着输入数据量的变化,算法会表现出不同的效率。例如,在输入 数据量较小时,算法 A 的运行时间比算法 B 短;而在输 图 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出错误。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为尾递归(tail recursion)。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 ‧ 尾递归:求和操作是在“递”的过程中执行的,“归”的过程只需层层返回。 第 2 章 复杂度分析 hello‑algo.com 25 图 2‑5 尾递归过程 Tip 请注意,许多编译器或解释器并不支持尾递归优化。例如,Python 默认不支持尾递归优化,因此即 使函数是尾递归形式,仍然可能会遇到栈溢出问题。 3. 递归树 当处理与“分治”相关的算法问题时,递归往往比迭代的思路更加直观、代码更加易读。以“斐波那契数列”0 码力 | 379 页 | 18.46 MB | 1 年前3
Hello 算法 1.0.0 JavaScript版一方面,难以排除测试环境的干扰因素。硬件配置会影响算法的性能。比如在某台计算机中,算法 A 的运行 时间比算法 B 短;但在另一台配置不同的计算机中,可能得到相反的测试结果。这意味着我们需要在各种机 器上进行测试,统计平均效率,而这是不现实的。 另一方面,展开完整测试非常耗费资源。随着输入数据量的变化,算法会表现出不同的效率。例如,在输入 数据量较小时,算法 A 的运行时间比算法 B 短;而在输 图 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出错误。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为「尾递归 tail recursion」。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 作。 ‧ 尾递归:求和操作是在“递”的过程中执行的,“归”的过程只需层层返回。 第 2 章 复杂度分析 hello‑algo.com 25 图 2‑5 尾递归过程 � 请注意,许多编译器或解释器并不支持尾递归优化。例如,Python 默认不支持尾递归优化, 因此即使函数是尾递归形式,仍然可能会遇到栈溢出问题。 3. 递归树 当处理与“分治”相关的算法问题时,递归往往比迭代的思路更加直观、代码更加易读。以“斐波那契数列”0 码力 | 376 页 | 17.57 MB | 1 年前3
Hello 算法 1.2.0 简体中文 JavaScript 版图 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出错误。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为尾递归(tail recursion)。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 尾递归:求和操作是在“递”的过程中执行的,“归”的过程只需层层返回。 第 2 章 复杂度分析 www.hello‑algo.com 25 图 2‑5 尾递归过程 Tip 请注意,许多编译器或解释器并不支持尾递归优化。例如,Python 默认不支持尾递归优化,因此即 使函数是尾递归形式,仍然可能会遇到栈溢出问题。 3. 递归树 当处理与“分治”相关的算法问题时,递归往往比迭代的思路更加直观、代码更加易读。以“斐波那契数列” === File: time_complexity.js === /* 平方阶(冒泡排序) */ function bubbleSort(nums) { let count = 0; // 计数器 // 外循环:未排序区间为 [0, i] for (let i = nums.length - 1; i > 0; i--) { // 内循环:将未排序区间 [0, i] 中的最大元素交换至该区间的最右端0 码力 | 379 页 | 18.47 MB | 10 月前3
2019-2021 美团技术年货 前端篇可用于直接绘制的视图对象 鸿蒙系统的 UI 框架提供了很多常用视图组件(Component),比如按钮、文字、图 片、列表等,但我们需要抛开这些上层组件,获得直接绘制的能力。借助官方 媒体播 放器开发指导 文档,可以发现鸿蒙提供了 SurfaceProvider 类,它管理的 Surface 对象可以用于视频解码后的展示。而 Flutter 渲染与视频上屏从原理上是类似的,因 此我们可以借用 接收到事件之后,会将其打包传 递至引擎层,后者将事件传发给 Flutter 框架层,并完成事件的消费、分发和逻辑处 理。同样,整个流程的大部分工作已经由 Flutter 统一,我们要做的仅仅是在原生容 器上监听用户的输入,并封装成指定格式交给引擎层而已。 在鸿蒙系统上,我们可以借助平台提供的 多模输入 API,实现多种类型事件的监听: flutterComponent.setTouchEventL 集合。区别在于:Flutter Web 重写了 dart:ui 层(黄色部分),利用 DOM、Canvas 对齐了 Flutter Native 的 UI 渲染能力,使得 Flutter 编写的 UI 能够在现代浏览器上正常展示。 此外,得益于 dart2js 这个早已成熟的工具,Dart 逻辑能够很容易的转换为 JavaS- cript,进而在 Web 中被正常运行。 二、面临的挑战 综上所述,我们选择基于0 码力 | 738 页 | 50.29 MB | 1 年前3
Hello 算法 1.0.0b5 JavaScript版图 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出报错。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为「尾递归 tail recursion」。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 求和操作。 ‧ 尾递归:求和操作是在“递”的过程中执行的,“归”的过程只需层层返回。 第 2 章 复杂度分析 hello‑algo.com 24 图 2‑5 尾递归过程 请注意,许多编译器或解释器并不支持尾递归优化。例如,Python 默认不支持尾递归优化,因此即使函数 是尾递归形式,但仍然可能会遇到栈溢出问题。 3. 递归树 当处理与“分治”相关的算法问题时,递归往往比迭代的思路更 === /* 平方阶(冒泡排序) */ 第 2 章 复杂度分析 hello‑algo.com 33 function bubbleSort(nums) { let count = 0; // 计数器 // 外循环:未排序区间为 [0, i] for (let i = nums.length - 1; i > 0; i--) { // 内循环:将未排序区间 [0, i] 中的最大元素交换至该区间的最右端0 码力 | 375 页 | 30.68 MB | 1 年前3
ECMAScript规范 第三版 中文版JScript。该语言由 Netscape 公司的 Brendan Eich 发明并首先出现在该公司 的 Navigator 2.0 浏览器中。该语言至今已经在所有来自 Netscape 的全部子系列浏览器和从 Internet Explorer3.0 开始所有来自 Microsoft 的浏览器中出现。 该标准的研发起始于 1996 年 11 月。ECMA 标准的首个版本于 1997 年 6 月被 ECMA 公共协 业程序员,语言的一些方面会多少有些不严格。 ECMAScript 从一开始就被设计成一种网页脚本语言(Web scripting language)作为基于网页 的、客户端—服务器端(C/S)构架的建筑师,它能提供一 种机制,用来使浏览器中的网站页面更 加活跃,并展示服务器端的处理情况。ECMAScript 能够为各种主机环境,以及这个文档所描述 的核心脚本编程语言之外任何特定的主机环境,提供基本的脚本编程能力。 ECMAScript Simplicity. OOPSLA '87 Conference Proceedings,pp. 227-C241,Orlando,FL,October 1987. 4.1 网页脚本 网页浏览器为 ECMAScript 提供了一个宿主环境以进行客户端的计算,例如:代表窗口、 菜单、浮动条、对话框、文本区域、锚点、框架、历史、cookies,以及输入/输出功能的对 象。 深入说来,主机环境提0 码力 | 58 页 | 563.06 KB | 1 年前3
JavaScript 正则表达式迷你书 老姚 - v1.1regex.test("\1\2\3\4\5\6\7\8\9") ); console.log( "\1\2\3\4\5\6\7\8\9".split("") ); Chrome 浏览器打印的结果(不同的浏览器和版本,打印的结果可能不一样): 3.3.4. 分组后面有量词会怎样? 分组后面有量词的话,分组最终捕获到的数据是最后一次的匹配。比如如下的测试案例: JavaScript 正则表达式迷你书 join('&'); } console.log( compress("a=1&b=2&a=3&b=4") ); // => "a=1,3&b=2,4" 7.3.5. 综合运用 最后这里再做个简单实用的正则测试器。 具体效果如下: JavaScript 正则表达式迷你书 7. 第七章 正则表达式编程 | 第 74 页 运行效果如下: 代码,直接贴了,相信你能看得懂(代码改编于《JavaScript Regular 当然,对我而言,正则表达式不仅应用在代码里。生活中也会经常使用它。比如个人平时回答网友问题时, 一些网站私信里贴的代码中字符都是转义的。此时我都会贴到某个编辑器里,然后写个正则,再一次性替 换,真方便。 另外一个例子是,一些代码编辑器的代码格式化功能,总有让人不舒服的地方,此时我都会用写好正则表达 式,再格式化一下。 还有一个很应景的例子,在编辑本书时,经常要在指定位置插入特定的语法格式,比如代码段前面要插入:0 码力 | 89 页 | 3.42 MB | 11 月前3
JavaScript 正则表达式迷你书 老姚 - v1.0console.log( regex.test("\1\2\3\4\5\6\7\8\9") ); console.log( "\1\2\3\4\5\6\7\8\9".split("") ); Chrome 浏览器打印的结果: 3.3.4. 分组后面有量词会怎样? 分组后面有量词的话,分组最终捕获到的数据是最后一次的匹配。比如如下的测试案例: JavaScript 正则表达式迷你书 3. 第三章 正则表达式括号的作用 join('&'); } console.log( compress("a=1&b=2&a=3&b=4") ); // => "a=1,3&b=2,4" 7.3.5. 综合运用 最后这里再做个简单实用的正则测试器。 具体效果如下: JavaScript 正则表达式迷你书 7. 第七章 正则表达式编程 | 第 74 页 运行效果如下: 代码,直接贴了,相信你能看得懂(代码改编于《JavaScript Regular 当然,对我而言,正则表达式不仅应用在代码里。生活中也会经常使用它。比如个人平时回答网友问题时, 一些网站私信里贴的代码中字符都是转义的。此时我都会贴到某个编辑器里,然后写个正则,再一次性替换 ,真方便。 另外一个例子是,一些代码编辑器的代码格式化功能,总有让人不舒服的地方,此时我都会用写好正则表达 式,再格式化一下。 还有一个很应景的例子,在编辑本书时,经常要在指定位置插入特定的语法格式,比如代码段前面要插入“[0 码力 | 89 页 | 3.42 MB | 11 月前3
廖雪峰JavaScript教程原型继承 6 浏览器 6.1 浏览器对象 6.2 操作DOM 6.2.1 更新DOM 6.2.2 插入DOM - 2 - 本文档使用 书栈(BookStack.CN) 构建 6.2.3 删除DOM 6.3 操作表单 6.4 操作文件 6.5 AJAX 6.6 Promise 6.7 Canvas 7 jQuery 7.1 选择器 7.1.1 层级选择器 7.1.2 查找和过滤 《廖雪峰JavaScript教程》 由 进击的皇虫 使用 书栈(BookStack.CN) 进行构 建,生成于 2018-07-13。 书栈(BookStack.CN) 仅提供文档编写、整理、归类等功能,以及对文档内容的生成和导出工 具。 文档内容由网友们编写和整理,书栈(BookStack.CN) 难以确认文档内容知识点是否错漏。如果 您在阅读文档获取知识的时候,发现文档内容有不恰当的地方,请向我们反馈,让我们共同携手,将知 JavaScript驱动的。 简单地说,JavaScript是一种运行在浏览器中的解释型的编程语言。 那么问题来了,为什么我们要学JavaScript?尤其是当你已经掌握了某些其他编程语言如Java、 C++的情况下。 简单粗暴的回答就是:因为你没有选择。在Web世界里,只有JavaScript能跨平台、跨浏览器驱动网 页,与用户交互。 Flash背后的ActionScript曾经流行0 码力 | 264 页 | 2.81 MB | 10 月前3
Hello 算法 1.0.0b1 JavaScript版难以排除测试环境的干扰因素。硬件配置会影响到算法的性能表现。例如,在某台计算机中,算法 A 比算法 B 运行时间更短;但换到另一台配置不同的计算机中,可能会得到相反的测试结果。这意味着我们需要在各种机 器上展开测试,而这是不现实的。 展开完整测试非常耗费资源。随着输入数据量的大小变化,算法会呈现出不同的效率表现。比如,有可能输入 数据量较小时,算法 A 运行时间短于算法 B ,而在输入数据量较大时,测试结果截然相反。因此,若想要达 === File: time_complexity.js === /* 平方阶(冒泡排序) */ function bubbleSort(nums) { let count = 0; // 计数器 // 外循环:待排序元素数量为 n-1, n-2, ..., 1 for (let i = nums.length - 1; i > 0; i--) { // 内循环:冒泡操作 for (let 当然,由于结点需要额外存储指针,因此 链表结点比数组元素占用更大。 综上,我们不能简单地确定哪种实现更加省内存,需要 case‑by‑case 地分析。 5.1.4. 栈典型应用 ‧ 浏览器中的后退与前进、软件中的撤销与反撤销。每当我们打开新的网页,浏览器就将上一个网页执行 入栈,这样我们就可以通过「后退」操作来回到上一页面,后退操作实际上是在执行出栈。如果要同时 支持后退和前进,那么则需要两个栈来配合实现。 ‧0 码力 | 185 页 | 14.70 MB | 1 年前3
共 20 条
- 1
- 2













