js数组API的时间复杂度大全

news2024/10/6 18:22:06

一句话总结:
数组为连续且有序的数据结构, 所以若根据下标查找则很快,index[i]一步到位就可实现查询,若遍历查找则很慢(相对而言)。而插入和删除,除了数组末尾的增删很快,其它处则很慢,因为若数组某处要插入或删除一截,当前位置之后的所有元素都会受影响,都必须一个一个地从原来的位置挪动,而数组末尾的增删则不影响其它元素。

常见的时间复杂度:

 

 

.entries() 时间复杂度为 O(1)。

迭代器对象会按顺序遍历数组中的每一项,并返回一个包含键(索引)和值的键值对,每次迭代都只需要访问数组中的一个元素,因此时间复杂度为 O(1)。 返回一个包含数组所有索引键值对的迭代器。

values()  时间复杂度为 O(1)

用于返回一个新的 Array Iterator 对象,该对象包含数组中每个元素的值。因为它只是返回一个迭代器对象,而不像遍历数组需要处理所有元素。

在实现上,values() 方法使用迭代器模式(Iterator pattern),通过生成器函数(Generator)返回一个新的 Array Iterator 对象。该对象可以通过 next() 方法逐个返回数组中的每个元素,并在到达数组末尾时返回 { done: true }

需要注意的是,由于 values() 方法返回的是一个迭代器对象,因此需要使用 for-of 循环或者手动调用 next() 方法来遍历数组的所有元素。同时,在使用 values() 方法时,也需要注意对返回的迭代器对象的正确使用和处理,以避免引发迭代器相关的错误。

isArray() 时间复杂度为 O(1)。

用于判断一个对象是否是数组。isArray() 方法的时间复杂度非常低,几乎可以忽略不计。该方法的底层实现通常是直接返回一个布尔值,即判断目标对象的 [[Class]] 属性是否为 "Array"

pop()  时间复杂度为 O(1)

在实现上,pop() 方法只需要修改数组的长度属性,并返回被删除的最后一个元素即可,不需要遍历整个数组。因此,pop() 方法的时间复杂度是常数时间复杂度,即 O(1)。

需要注意的是,当数组为空数组时调用 pop() 方法会返回 undefined,而不会有任何错误发生。因此,在使用 pop() 方法时,需要对数组是否为空进行特判。

push() 时间复杂度为 O(1)

用于在数组的末尾添加一个或多个元素,并返回添加元素后的数组的新长度。在实现上,push() 方法只需要修改数组的长度属性,并把新元素添加到数组的末尾即可,不需要遍历整个数组。因此,push() 方法的时间复杂度是常数时间复杂度,即 O(1)。

sort() 时间复杂度为 O(n log n)

用于对数组进行排序,并返回排序后的数组。sort() 方法的时间复杂度不确定,取决于具体的实现和输入数据,不同的实现可能会导致不同的时间复杂度。

在实现上,sort() 方法通常使用经典的快速排序(quicksort)算法,该算法的平均时间复杂度为 O(n log n),其中 n 是数组的长度,但是最坏情况下的时间复杂度为 O(n^2),如果数组本身已经有序(升序或降序),则可能会产生最坏情况,导致 sort() 方法的时间复杂度达到 O(n^2)。

为了避免最坏情况,可以使用一些优化措施,例如在排序前随机打乱数组的顺序,或者使用基于归并排序(mergesort)或堆排序(heapsort)的算法,这些算法的时间复杂度为稳定的 O(n log n)。

join() 时间复杂度为 O(n)

用于将数组中的所有元素以指定的分隔符连接成一个字符串。在实现上,join() 方法遍历一遍数组中的所有元素,把它们以指定的分隔符连接起来,并返回一个新的字符串。因此,join() 的时间复杂度和遍历一遍数组是等价的,也就是 O(n)。虽然 join() 的时间复杂度为 O(n),但是由于该方法本身的功能比较简单,实现方式也比较直接,所以对数组进行 join() 操作的性能消耗很小,在绝大多数情况下不会对程序的性能产生明显的影响。

keys()  时间复杂度为 O(n)

用于获取一个对象的所有属性名(即键),返回一个由所有属性名称组成的数组。在实现上,keys() 方法遍历一遍对象的所有属性,把属性的名称添加到一个数组中,并返回这个数组。因此,keys() 的时间复杂度和遍历一遍对象的所有属性是等价的,也就是O(n)。

concat()   数组末尾操作,时间复杂度O(n)    

具体来说,concat() 方法会将第一个数组的所有元素加入到结果数组中,然后将第二个数组的所有元素加入到结果数组中,以此类推,直到所有输入数组中的元素都被添加到结果数组中。因此,它的时间复杂度与元素总数成正比,为 O(n)。

concat() 方法只有一个参数且参数为一个空数组时,它的时间复杂度为 O(1),因为它只需要返回一个新的空数组。在其他情况下,它的时间复杂度都为 O(n)。

copyWithin()  时间复杂度为 O(n)

copyWithin() 方法需要遍历被复制的元素区间,并将每个元素复制到另一个位置,最终生成一个新的数组。由于需要将区间内所有元素复制一遍,因此时间复杂度为 O(n)。

.every() 时间复杂度为 O(n)

具体来说,every() 方法需要遍历数组中的每一个元素,并对其进行指定条件的判断,只有所有元素都满足条件时,该方法才返回 true。如果在遍历过程中发现不符合条件的元素,则会立即停止遍历,并返回 false。因此,时间复杂度为 O(n)。

fill() 时间复杂度为 O(n)

具体来说,fill() 方法需要遍历数组中的每一个元素,并将其替换为指定的元素。因为需要遍历数组中的所有元素,所以时间复杂度为 O(n)。

filter() 时间复杂度为 O(n)

具体来说,filter() 方法需要遍历数组中的每一个元素,并对每个元素进行指定条件的判断。如果满足条件,就将该元素加入到结果数组中。因为需要遍历数组中的所有元素,并将满足条件的元素挑选出来,所以时间复杂度为 O(n)。不会修改原数组,而是返回一个新的数组。

find()  时间复杂度为 O(n)

具体来说,find() 方法需要遍历数组中的每一个元素,并对每个元素进行指定条件的判断。如果找到第一个符合条件的元素,就返回该元素的值,并立即停止遍历。因为需要遍历数组中的所有元素,所以最坏情况下的时间复杂度为 O(n)。

findIndex()  时间复杂度为 O(n)

具体来说,findIndex() 方法需要遍历数组中的每一个元素,并对每个元素进行指定条件的判断。如果找到第一个符合条件的元素,就返回该元素在数组中的索引值,并立即停止遍历。因为需要遍历数组中的所有元素,所以最坏情况下的时间复杂度为 O(n)。如果没有找到满足条件的元素,则返回 -1。

findLast() 时间复杂度为 O(n)

具体来说,findLast() 方法需要遍历数组中的每一个元素,并对每个元素进行指定条件的判断。findLast() 方法返回数组中满足提供的测试函数条件的最后一个元素的值。如果没有找到对应元素,则返回 undefined.

findLastIndex 时间复杂度为 O(n)

具体来说,findLastIndex() 方法需要遍历数组中的每一个元素,并对每个元素进行指定条件的判断。findLast() 方法返回数组中满足提供的测试函数条件的最后一个元素的索引。如果没有找到对应元素,则返回 -1.

flat() 时间复杂度是 O(n)

flat() 方法需要递归遍历所有的元素,所以时间复杂度是 O(n),其中 n 表示数组中所有元素的个数。flat() 用于将嵌套的数组平铺为一个一维数组flat() 方法会按照一个指定的深度,递归地将数组中的所有元素提取出来,并放入一个新数组中,该新数组将成为返回值。如果没有提供深度选项,则默认的深度为1。

some()  时间复杂度为 O(n)

在实现上,some() 方法依次遍历数组中的元素,并对每个元素应用指定的回调函数,直到找到一个返回值为 true 的元素为止。如果找到了这样的元素,some() 方法就会立即返回 true,并停止遍历剩余的元素。否则,如果数组中所有元素都不符合指定规则,则 some() 方法返回 false。因此,some() 方法的时间复杂度为 O(n)。

forEach()时间复杂度是 O(n)

它用于遍历数组中的每个元素,并对每个元素执行指定的操作,例如输出到控制台、修改元素值等。forEach() 方法没有返回值,而是为每个元素调用指定的回调函数,通常用于循环遍历数组。无法在循环中使用 breakcontinue 的控制语句,也无法使用 return 来提前结束循环

map() 时间复杂度为 O(n)

用于对数组中的每个元素进行操作,返回一个新的数组,其中包含对每个元素进行操作后的对应结果。在实现上,map() 方法遍历一遍数组中的所有元素,对每个元素进行指定的操作,并把处理后的结果添加到一个新数组中,最终返回这个新数组。

需要注意的是,map() 方法不会修改原始数组,而是返回一个新的数组。如果不需要保留原始数组,可以考虑使用 forEach() 方法或 for...of 循环来代替 map() 方法。

reduce() 时间复杂度为 O(n)

用于对数组中的每个元素依次执行提供的回调函数,以累加器的方式进行归约,并返回最终的累加结果reduce() 方法的时间复杂度取决于回调函数的复杂度和数组的长度。假设回调函数的时间复杂度为 O(f),数组的长度为 n,则 reduce() 方法的时间复杂度为 O(n*f)。

在实现上,reduce() 方法使用提供的初始值(可选)和数组中的第一个元素作为参数调用回调函数,接着用回调函数的返回值作为下一次调用的参数继续执行,直到遍历整个数组,并返回最终累加结果。回调函数被调用的次数为数组的长度,因此,reduce() 方法的时间复杂度为 O(n),其中 n 是数组的长度。

reduceRight()  时间复杂度为 O(n)

同上,   只是用于从数组的末尾向前依次执行提供的回调函数

shift() 时间复杂度为 O(n)

用于删除数组的第一个元素,并返回被删除的元素。在实现上,shift() 方法需要把数组中每个元素向前移动一位,以覆盖被删除的第一个元素,并返回被删除的元素。因此,如果数组的长度非常大,shift() 方法的时间复杂度会非常高,达到 O(n),其中 n 是数组的长度。

unshift()  时间复杂度为 O(n)

用于向数组的开头插入一个或多个元素,并返回插入后数组的新长度。在实现上,unshift() 方法需要将插入位置之后的元素向右移动一位,以腾出位置给新元素。这个操作会导致数组中的所有元素向右移动一位,因此时间复杂度为 O(n)。同时,在插入多个元素时,需要逐一将每个元素插入到开头,因此需要进行 n 次插入操作,进一步增加时间复杂度。

slice() 时间复杂度为 O(n)

在实现上,slice() 方法使用指定的起始索引和结束索引从原数组中提取部分元素,然后将这些元素组成一个新数组并返回。在计算切片后新数组的长度时,对于起始索引和结束索引之间的元素,都需要进行一次遍历,这部分操作的时间复杂度为 O(k),其中 k 是切片后新数组的长度。因此,slice() 方法的时间复杂度为 O(n)。

toString() 时间复杂度为 O(n)

在实现上,toString() 方法会遍历数组中的每个元素,并使用逗号分隔符将其连接成一个字符串,最后返回该字符串。需要注意的是,如果数组元素是对象类型,则默认情况下会调用其 toString() 方法将其转换为字符串。

需要注意的是,由于 toString() 方法返回的是一个字符串,因此在使用该方法时需要注意类型转换,并避免产生不必要的错误。同时,在使用 toString() 方法时,也需要注意数组元素的类型和范围,以避免产生 JavaScript 实现本身的规范问题。

splice()  时间复杂度为 O(n)

用于向数组中增加或删除元素,并返回被删除的元素。在实现上,splice() 方法在删除元素时需要把被删除元素后面的元素向前移动一位,以填补被删除元素的空缺,因此会导致后续元素的位置发生变化。同时,在插入元素时也需要将插入位置之后的元素向右移动一位,以腾出位置给新元素。这些操作都需要涉及数组中剩余元素的移动,导致时间复杂度为 O(n)。

toLocaleString()  时间复杂度为 O(n)

用于将数组转换为本地化字符串。在实现上,toLocaleString() 方法使用本地化规则来格式化数组中的每个元素,然后使用本地化规则的分隔符将这些元素连接成一个字符串,最后返回该字符串。具体来说,toLocaleString() 方法会对数组中的每个元素调用其 toLocaleString() 方法,并使用本地化规则的适当格式化选项,例如货币符号、日期格式和小数点符号等。

from() 时间复杂度为 O(n)

用于将类似数组或可迭代对象转化为真正的数组。这是一个非常实用的方法,可以将各种可迭代对象(如字符串、Set 对象、Map 对象)转换为数组,方便进行数组的各种操作。

from() 方法接受一个可迭代对象(如一个字符串或一个类数组对象),并返回一个新的数组。可迭代对象是指拥有可迭代接口的对象,具有 Symbol.iterator 属性,例如字符串、数组、Set、Map 等。

includes() 时间复杂度为 O(n)

用于判断数组中是否包含指定的元素。该方法返回一个布尔值,如果目标元素在数组中,返回 true,否则返回 false。 这是因为在处理数组时,includes() 方法需要遍历整个数组,查找目标元素是否存在。因此,如果数组很大,性能开销可能会很大。需要注意的是,在数组中查找元素时,includes() 方法使用的是严格相等运算符(===),

indexOf() 时间复杂度为 O(n)

用于查找数组中指定元素的位置, 如果不存在则返回 -1。在最坏情况下,需要遍历整个数组才能找到目标元素。indexOf() 方法可能会使用一些优化算法,例如二分查找算法,使得其时间复杂度更低。

lastIndexOf()  时间复杂度为 O(n)

用于从数组的末尾开始查找指定元素第一次出现的位置。在实现上,lastIndexOf() 方法从数组的最后一个元素开始遍历,逐一向前查找指定元素,直到找到第一个匹配的元素,或遍历完所有元素。因此,lastIndexOf() 的时间复杂度和数组的长度是成正比的,即 O(n)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/424590.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【服务器数据恢复】 重装系统导致xfs文件系统分区丢失的数据恢复案例

服务器数据恢复环境: EMC某型号存储,20块磁盘组建raid5磁盘阵列,划分2个lun。 服务器故障: 管理员执行重装系统操作后发现分区发生改变,原先的sdc3分区丢失,该分区采用xfs文件系统,存储了公司重…

开放式耳机好用吗,推荐几款不错的开放式耳机

​开放式耳机是一种新型的耳机,相比于传统的耳机,开放式耳机听歌时不需要将耳朵堵上,不会因为长时间佩戴而对听力造成损害。它不需要入耳也能听到声音,在户外运动时能够及时听到环境音,避免安全隐患。现在在骨传导市面…

nodejs+vue 沃健身房管理系统

3)系统分析 本章主要是对系统可行性、系统性能、还有系统功能需求进行分析。 (4)系统设计 对系统系统功能和数据库等进行详细讲解。 (5)系统的实现 主要对个人中心、课程分类管理、用户管理、健身器材管理、健身教练管理、预约教练管理、健身课程管理、课程订单管理、健身视频管…

ESP32学习笔记08-adc单通道数据采集

8. adc单通道数据采集 8.1RTC SAR ADC 控制器 8.2ADC相关的api 8.2.1 配置adc的位宽 esp_err_t adc1_config_width(adc_bits_width_t width_bit);width_bit :位宽 返回值 ESP_OK 配置成功 ESP_ERR_INVALID_ARG 参数错误 esp32最大的宽度的12位typedef enum {

STM8S208MB -> 寄存器方式实现对Flash的连续读写操作(IAR)

代码 File: STM8S208MB_Flash_Op.c /*file: STM8S208MB_Flash_Op.cbrief: 读写Flashdata: 2023-04-14author: ArcherQAQ */#include "STM8S208MB_Flash_Op.h" #include "stdio.h"u8 dataBuf[] {0xFF, 0xFF}; // 写入Flash的数据 u8 Rec_Buf[100] {0x00…

天猫数据分析:2023年速食品(方便面)市场数据分析

我国的方便面市场是一个比较活跃的市场,其市场规模也比较庞大。近年来,随着中国经济的发展,消费者对方便面的需求量和要求也在不断变化,因此,我国方便面市场的规模和消费者的需求环境也正在不断改变。 根据鲸参谋电商数…

Excel技能之排名,小函数很强大

你还在熬夜加班搞Excel吗? 你还在用手指,指着电脑屏幕,一行一行核对数据吗? 你还在害怕被笑而不敢问同事吗? 赶紧来学Excel,收藏加关注,偷偷地进步!日积月累,必成大器&am…

12-python内存地址

1.查看内存地址 a1 print(id(a)) # 24319294835042.数据类型 (1)不可变数据类型:数值、字符串、布尔值、元组 数据存储在计算机中的某个位置,不管赋值给谁,内存地址都相同 a"jack" b"jack" prin…

常见分布式锁3:Redis setNx

Redis实现分布式锁的核心便在于SETNX命令,它是SET if Not eXists的缩写,如果键不存在,则将键设置为给定值,在这种情况下,它等于SET;当键已存在时,不执行任何操作;成功时返回1&#x…

【python游戏】努力制造阳光,让植物有力量对抗僵尸吧~

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 晃着脑袋生产阳光的向日葵,突突突吐着子弹的豌豆射手!​ 行动迟缓种类丰富的僵尸…… 印象最深的是“僵尸吃掉了你的脑子!” 还有疯狂的戴夫,无一不唤醒着我们的童年记忆​ 山…

Hive 拉链表的两种实现方式

目录 1.什么是拉链表 2.拉链表的产生背景 2.1数据同步 2.1.1全量同步 2.1.2增量同步 2.2增量同步和拉链表 3.拉链表的实现方式 3.1数据准备 3.2思路1 3.3思路2 1.什么是拉链表 我们首先要知道,拉链表是一个逻辑上的概念。 拉链表记录的是增量数据&#x…

(链表专题) 328. 奇偶链表 ——【Leetcode每日一题】

328. 奇偶链表 给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。 第一个 节点的索引被认为是 奇数 , 第二个 节点的索引为 偶数 ,以此类推。 请注意,偶…

在 RISC-V Linux 内核中添加模块

在 RISC-V Linux 内核中添加模块 flyfish 本例以添加helloworld字符设备为例 一 源码配置 1 源码 源码文件helloworld.c拷贝到 drivers/char 目录中 源码主要是输出Hello world init 2 Kconfig 打开drivers/char 目录下的Kconfig文件 在endmenu之前加上 config HELLO…

统信UOS专业版系统安装教程 - 全盘安装UOS系统

全文导读:本文介绍了UOS系统安装(全盘安装)的过程,如果没有特殊要求,推荐安装UOS系统都采用全盘安装。 准备环境 制作好统信UOS专业版启动U盘 一台CPU频率≥2GHz、内存≥4GB、硬盘≥64GB的电脑 安装步骤 一、制作…

MySQL复合查询

文章目录一、多表查询二、自连接三、子查询1.单行子查询2.多行子查询3.多列子查询4.在 from 子句中使用子查询5.合并查询一、多表查询 在实际开发中,数据往往来自不同的表,所以需要多表查询。 对多张表做笛卡尔积,实际上就是多张表的所有记…

js 特殊对象 - 数组

1.概述 数组也是对象的一种,数组是一种用于表达有顺序关系的值的集合的语言结构,也就是同类数据元素的有序集合。 数组的存储性能比普通对象要好,在开发中我们经常使用数组来存储一些数据。但是在JavaScript中是支持数组可以是不同的元素&…

使用CH9102F平替ESP32系列下载电路中的CP2102

乐鑫官方ESP32开发板的外围电路主要包含: USB-UART电路自动下载电路RC延迟电路重启按键下载按键电源降压芯片LDO下面简单介绍一下这些电路的功能。 ESP32的USB-UART电路部分,核心芯片CP2102。其作用是将USB接口传入的D、D-信号转换为串口信号RX、TX以及…

如何与 MACOM 建立 EDI 连接?

项目背景 MACOM提供高性能射频,微波和毫米波器件,其产品广泛应用于通信,航空航天,国防和工业市场。近年来MACOM在中国地区的业务一直高速增长。 为了提高其供应链的效率和准确性,MACOM使用EDI(电子数据交…

数据挖掘(4.1)--分类和预测

目录 前言 一、分类和预测 分类 预测 二、关于分类和预测的问题 准备分类和预测的数据 评价分类和预测方法 混淆矩阵 评估准确率 参考资料 前言 分类:离散型、分类新数据 预测:连续型、预测未知值 描述属性:连续、离散 类别属性&am…

扬尘天气在家如何防护措施 家里空气中的沙尘怎么处理

扬尘天气在家如何防护措施 家里空气中的沙尘怎么处理 大风起兮尘飞扬 风越强来,天越黄…… 随沙尘而来的还有呼呼呼的大风 刚刚过了一周 “阳光正好,微风不燥”的日子 还没好好感受春花绽放的温柔 沙尘天气就又杀回塔大了 除了吃土 “防护指南…