iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > html >如何用JavaScript学习算法复杂度
  • 437
分享到

如何用JavaScript学习算法复杂度

2024-04-02 19:04:59 437人浏览 安东尼
摘要

本篇内容介绍了“如何用javascript学习算法复杂度”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在本

本篇内容介绍了“如何用javascript学习算法复杂度”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

在本文中,我们将探讨 “二次方” 和 “n log(n)” 等术语在算法中的含义。

在后面的例子中,我将引用这两个数组,一个包含 5 个元素,另一个包含 50 个元素。我还会用到 JavaScript 中方便的 perfORMance  api 来衡量执行时间的差异。

const smArr = [5, 3, 2, 35, 2];  const bigArr = [5, 3, 2, 35, 2, 5, 3, 2, 35, 2, 5, 3, 2, 35, 2, 5, 3, 2, 35, 2, 5, 3, 2, 35, 2, 5, 3, 2, 35, 2, 5, 3, 2, 35, 2, 5, 3, 2, 35, 2, 5, 3, 2, 35, 2, 5, 3, 2, 35, 2];

什么是 Big O 符号?

Big O 表示法是用来表示随着数据集的增加,计算任务难度总体增长的一种方式。尽管还有其他表示法,但通常 big O  表示法是最常用的,因为它着眼于最坏的情况,更容易量化和考虑。最坏的情况意味着完成任务需要最多的操作次数;如果你在一秒钟内就能恢复打乱魔方,那么你只拧了一圈的话,不能说自己是做得最好的。

当你进一步了解算法时,就会发现这非常有用,因为在理解这种关系的同时去编写代码,就能知道时间都花在了什么地方。

当你了解更多有关 Big O 表示法的信息时,可能会看到下图中不同的变化。我们希望将复杂度保持在尽可能低的水平,最好避免超过 O(n)。

如何用JavaScript学习算法复杂度

O(1)

这是理想的情况,无论有多少个项目,不管是一个还是一百万个,完成的时间量都将保持不变。执行单个操作的大多数操作都是  O(1)。把数据写到数组、在特定索引处获取项目、添加子元素等都将会花费相同的时间量,这与数组的长度无关。

const a1 = performance.now(); smArr.push(27); const a2 = performance.now(); console.log(`Time: ${a2 - a1}`); // Less than 1 Millisecond   const b1 = performance.now(); bigArr.push(27); const b2 = performance.now(); console.log(`Time: ${b2 - b1}`); // Less than 1 Millisecond

O(n)

在默认情况下,所有的循环都是线性增长的,因为数据的大小和完成的时间之间存在一对一的关系。所以如果你有 1,000 个数组项,将会花费的 1,000  倍时间。

const a1 = performance.now(); smArr.forEach(item => console.log(item)); const a2 = performance.now(); console.log(`Time: ${a2 - a1}`); // 3 Milliseconds  const b1 = performance.now(); bigArr.forEach(item => console.log(item)); const b2 = performance.now(); console.log(`Time: ${b2 - b1}`); // 13 Milliseconds

O(n^2)

指数增长是一个陷阱,我们都掉进去过。你是否需要为数组中的每个项目找到匹配对?将循环放入循环中是一种很好的方式,可以把 1000  个项目的数组变成一百万个操作搜索,这将会使你的浏览器失去响应。与使用双重嵌套循环进行一百万次操作相比,最好在两个单独的循环中进行 2,000 次操作。

const a1 = performance.now(); smArr.forEach(() => {     arr2.forEach(item => console.log(item)); }); const a2 = performance.now(); console.log(`Time: ${a2 - a1}`); // 8 Milliseconds   const b1 = performance.now(); bigArr.forEach(() => {     arr2.forEach(item => console.log(item)); }); const b2 = performance.now(); console.log(`Time: ${b2 - b1}`); // 307 Milliseconds

O(log n)

我认为关于对数增长比较好的比喻,是想象在字典中查找像 “notation” 之类的单词。你不会在一个词条一个词条的去进行搜索,而是先找到 “N”  这一部分,然后是 “OPQ” 这一页,然后按字母顺序搜索列表直到找到匹配项。

通过这种“分而治之”的方法,找到某些内容的时间仍然会因字典的大小而改变,但远不及 O(n)  。因为它会在不查看大部分数据的情况下逐步搜索更具体的部分,所以搜索一千个项目可能需要少于 10 个操作,而一百万个项目可能需要少于 20  个操作,这使你的效率最大化。

在这个例子中,我们可以做一个简单的 快速排序

const sort = arr => {   if (arr.length < 2) return arr;    let pivot = arr[0];   let left = [];   let right = [];    for (let i = 1, total = arr.length; i < total; i++) {     if (arr[i] < pivot) left.push(arr[i]);     else right.push(arr[i]);   };   return [     ...sort(left),     pivot,     ...sort(right)   ]; }; sort(smArr); // 0 Milliseconds sort(bigArr); // 1 Millisecond

O(n!)

最糟糕的一种可能性是析因增长。最经典的例子就是旅行的推销员问题。如果你要在很多距离不同的城市之间旅行,如何找到在所有城市之间返回起点的最短路线?暴力方法将是检查每个城市之间所有可能的路线距离,这是一个阶乘并且很快就会失控。

由于这个问题很快会变得非常复杂,因此我们将通过简短的递归函数演示这种复杂性。这个函数会将一个数字去乘以函数自己,然后将数字减去1。阶乘中的每个数字都会这样计算,直到为  0,并且每个递归层都会把其乘积添加到原始数字中。

阶乘只是从 1 开始直至该数字的乘积。那么 6!是 1x2x3x4x5x6 = 720。

const factorial = n => {   let num = n;    if (n === 0) return 1   for (let i = 0; i < n; i++) {     num = n * factorial(n - 1);   };    return num; }; factorial(1); // 2 Milliseconds factorial(5); // 3 Milliseconds factorial(10); // 85 Milliseconds factorial(12); //  11,942 Milliseconds

我原本打算显示 factorial(15),但是 12 以上的值都太多,并且使页面崩溃了,这也证明了为什么需要避免这种情况。

“如何用JavaScript学习算法复杂度”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 如何用JavaScript学习算法复杂度

本文链接: https://www.lsjlt.com/news/85225.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何用JavaScript学习算法复杂度
    本篇内容介绍了“如何用JavaScript学习算法复杂度”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在本...
    99+
    2024-04-02
  • 怎么用JavaScript学习算法复杂度
    这篇文章给大家分享的是有关怎么用JavaScript学习算法复杂度的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。JavaScript的作用是什么1、能够嵌入动态文本于HTML页面。2、对浏览器事件做出响应。3、读...
    99+
    2023-06-14
  • 如何理解算法的复杂度
    本篇内容主要讲解“如何理解算法的复杂度”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解算法的复杂度”吧!1. Motivation - 为什么需要复杂度分...
    99+
    2024-04-02
  • 如何理解算法时间复杂度
    这篇文章主要讲解了“如何理解算法时间复杂度”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解算法时间复杂度”吧!我们可以用下面的表达式来表示:通常主要有...
    99+
    2024-04-02
  • 算法分类 ,时间复杂度 ,空间复杂度,优
        今天给大家带来一篇关于算法排序的分类,算法的时间复杂度,空间复杂度,还有怎么去优化算法的文章,喜欢的话,可以关注,有什么问题,可以评论区提问,可以与我私信,有什么好的意见,欢迎提出. 前言: 算法的复杂度分为时间复杂度与空间复杂...
    99+
    2023-01-30
    复杂度 算法 时间
  • C语言算法的时间复杂度和空间复杂度
    目录1.算法效率1.1 如何衡量一个算法的好坏1.2算法的复杂度2.时间复杂度2.1 时间复杂度的概念2.2 大O的渐进表示法2.3常见时间复杂度计算举例 3.空间复杂度4...
    99+
    2024-04-02
  • 八大排序算法(含时间复杂度、空间复杂度、算法稳定性)
    文章目录 八大排序算法(含时间复杂度、空间复杂度、算法稳定性)1、(直接)插入排序1.1、算法思想1.2、排序过程图解1.3、排序代码 2、希尔排序3、冒泡排序3.1、算法思想3.2、排...
    99+
    2023-10-19
    算法 排序算法 c语言 c++
  • 数据结构和算法:算法复杂度
    我们开始了算法复杂度的学习,本期教程我们学习后半段。复杂度只考虑操作数目的一个数量级(忽略了其他的组分),这是一种近似。为了表示这种近似,我们使用一个特定的符号,就是著名的 大 O 符号。大 O 符号(Big O notation...
    99+
    2023-06-01
  • Java算法之时间复杂度和空间复杂度的概念和计算
    目录一、算法效率二、时间复杂度2.1 时间复杂度的概念2.2 大O的渐进表示法2.3 时间复杂度的三种情况2.4 常见时间复杂度计算举例2.4.1 例子2.4.2 冒泡排序时间复杂度...
    99+
    2024-04-02
  • 数据结构--算法的时间复杂度和空间复杂度
    文章目录 算法效率时间复杂度时间复杂度的概念大O的渐进表示法计算实例 时间复杂度实例 常见复杂度对比例题 算法效率 算法效率是指算法在计算机上运行时所消耗的时间和资源。这是衡量算法...
    99+
    2023-09-08
    算法 数据结构 时间效率 复杂度
  • 数据结构与算法—时间复杂度和空间复杂度
    目录 1. 什么是数据结构? 2.什么是算法? 3、算法的复杂度 4、时间复杂度 (1) 时间复杂度的概念:  (2) 大O的渐进表示法:  六个例题: (3) 时间复杂度对比:  两个例题:  OJ题分析时间复杂度 5、空间复杂度 (1...
    99+
    2023-10-24
    数据结构
  • 如何在 Linux 上使用 Go 编写复杂算法?学习笔记来帮助你!
    Go 语言是一种快速、简单、高效的编程语言,它最初由 Google 开发,并于 2009 年首次亮相。Go 语言不仅易于学习和使用,而且还具有出色的并发性能和内存管理功能。因此,在 Linux 上使用 Go 编写复杂算法是一种非常流行的选...
    99+
    2023-10-24
    学习笔记 linux 编程算法
  • web算法的时间复杂度和空间复杂度是什么
    这篇文章主要介绍了web算法的时间复杂度和空间复杂度是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇web算法的时间复杂度和空间复杂度是什么文章都会有所收获,下面我们一起来...
    99+
    2024-04-02
  • web算法复杂度怎么理解
    本篇内容介绍了“web算法复杂度怎么理解”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!算法学(Algorithmics)是设计和研究算法的科...
    99+
    2023-06-03
  • 怎么理解Java算法复杂度
    本篇内容主要讲解“怎么理解Java算法复杂度”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解Java算法复杂度”吧!大O符号衡量时间复杂度通常使用”大O符号“。什么是大O符号?我们需要先看...
    99+
    2023-06-02
  • 递归算法时间复杂度怎么算
    递归算法的时间复杂度可以通过递归树来计算。递归树是一个树形结构,表示递归算法的执行过程。树的根节点表示原始问题,每个节点表示递归调用...
    99+
    2023-05-30
    递归算法时间复杂度 递归算法
  • ASP 编程中如何避免算法复杂度过高?
    ASP(Active Server Pages)是一种动态网页技术,它使用VBScript或JScript等编程语言进行编写。在ASP编程中,算法复杂度过高可能会导致网页响应时间过长,从而影响用户体验。为了避免这种情况的发生,我们需要采取一...
    99+
    2023-08-21
    编程算法 linux 文件
  • ASP编程算法面试:如何优化算法的时间复杂度?
    在 ASP 编程中,算法是至关重要的。它们可以帮助我们解决各种问题,从字符串匹配到图形渲染。不过,好的算法不仅需要正确性,还需要高效性。在这篇文章中,我们将探讨如何优化 ASP 编程算法的时间复杂度。 什么是时间复杂度? 在开始讨论优化算...
    99+
    2023-09-28
    编程算法 面试 path
  • Java如何分析算法的时间和空间复杂度
    目录计算复杂性算法的复杂性恒定复杂性–O(1)对数复杂性–O(Log N)线性复杂度–O(N)N Log N复杂性–O(N Log N...
    99+
    2024-04-02
  • C语言中算法的时间复杂度和空间复杂度是什么
    这篇文章给大家分享的是有关C语言中算法的时间复杂度和空间复杂度是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1.前言1.1 什么是数据结构?数据结构(Data Structure)是计算机存储、组织数据的方...
    99+
    2023-06-29
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作