JavaScript 密集数组和稀疏数组

JavaScript 密集数组和稀疏数组

在JavaScript中,数组是一种用于存储值集合的数据结构。集合中的每个值都被赋予一个唯一的索引编号。JavaScript中的数组可以包含任何数据类型的值,如字符串、数字、对象,甚至其他数组。在JavaScript中,数组可以是密集数组和稀疏数组两种类型。

**“密集”和“稀疏”数组是两种用于组织和访问元素集合的重要数据结构类型。密集数组,也称为连续数组,在内存中按顺序存储元素,可以以常数时间访问任何元素。因此,密集数组非常适用于需要频繁访问元素或进行数值计算的应用程序。

另一方面,稀疏数组是一种设计用来存储大部分为空或零元素的数据结构。稀疏数组只存储非零或非空值,从而减少内存使用量并加速遍历非空值。然而,用稀疏数组访问单个元素可能比用密集数组慢,因为它需要搜索所需元素的索引。

密集数组: 密集数组是最常用的数组类型,我们都很熟悉。在密集数组中,每个元素都被定义并具有一个值,意味着数组中没有“空洞”。第一个元素的索引为0,第二个元素的索引为1,依此类推,每个索引从0到length-1都存在项目。

语法:

const arr_name = [item1, item2, item3, ...];

示例1:

Javascript

const fruits = ["mango","apple","grapes"]; 
console.log(fruits[0]);  
console.log(fruits[1]);  
console.log(fruits[2]);  
console.log(fruits.length);

输出

mango
apple
grapes
3

在上面的例子中,有一个名为fruits的数组,它包含三种可以通过它们各自的索引访问的水果。

例子2:

Javascript

const denseArray = [1,2,3,4,5]; 
console.log(denseArray);

输出

[ 1, 2, 3, 4, 5 ]

在上面的例子中,有一个名为denseArray的数组,它包含从1到5的自然数,由于数组中没有间隙,因此它是一个密集数组。

密集数组的内存实现: 在密集数组中,内存被分配为连续的内存块,这被称为连续内存分配,其中数组项按顺序从索引0到索引数组长度-1存储。第一个元素存储在索引0,第二个元素存储在索引1,依此类推。在内存中,密集数组被实现为连续的内存块,其中每个元素存储在固定大小的槽中。槽是连续分配的,因此可以使用元素的索引来直接计算其内存地址。 创建密集数组时,JavaScript会预留一块内存来存储指定数量的元素。数组中的每个元素被分配一个唯一的索引,从0开始,并且每个后续元素的索引递增1。 由于密集数组存储在连续的内存中,访问和修改其元素通常非常高效。可以使用标准指针算术根据索引计算元素的内存地址,从而实现快速随机访问。

稀疏数组: 稀疏数组可能包含空的或“空洞”项,意味着我们可以跳过一个或多个数组项。在JavaScript中,稀疏数组是指不是所有元素都被定义或初始化的数组。这意味着数组可能具有某些索引没有值的间隙或空洞。然而,像正常数组一样,访问和修改数组元素仍然是可能的。

语法:

const arr_name = [item1,item2, , , item3];

示例

Javascript

const sparseArray = [10, , , 40]; 
console.log(sparseArray)

输出

[ 10, <2 empty items>, 40 ]

创建Sparse数组的不同方式:

1. 使用数组字面量: 只需跳过不想指定的项目即可。换句话说,我们也可以使用数组字面量语法创建稀疏数组,通过省略特定索引的值。可以通过省略数组声明中的某些元素来创建稀疏数组。结果数组将在省略的元素应该出现的位置上留下“空洞”,并且这些空洞将被视为undefined值。

语法:

const arr_name = [item1,item2, , , item3];

例子:

Javascript

const colors = ["red","green","blue", ,"black"]; 
console.log(colors);

输出

[ 'red', 'green', 'blue', <1 empty item>, 'black' ]

在上面的例子中,我们省略了第3个索引处的项目的值,因此输出为空项目,我们也可以跳过多个索引处的数组项目。

2. 使用数组构造函数: 使用数组对象的帮助,我们可以使用数组构造函数创建稀疏数组。它接受一个参数作为数组的长度。要使用数组构造函数创建稀疏数组,您可以将所需的数组长度指定为参数,然后使用数组索引表示法将特定的元素设置为未定义。

语法:

const arr_name = new Array(arraySize);

Javascript

const arr = new Array(5); 
console.log(arr);

输出

[ <5 empty items> ]

在上面的例子中,我们指定了数组的长度为5,所以它创建了5个空项。

3. 删除数组项: 从数组中删除项会在相应的索引上创建空洞,空的项充当占位符。

语法:

const arr_name = [item1,item2,item3];
delete arr_name[index];

例子:

JavaScript

const nums = [1,2,3,4,5]; 
delete nums[2]; 
console.log(nums);

输出

[ 1, 2, <1 empty item>, 4, 5 ]

在上面的示例中,在删除一个空间之前,数组是密集的,但是删除后创建了一个空间,使得数组变成了稀疏数组。

4. 通过增加数组的长度: 每当我们增加数组的长度时,总会创建空的空间来容纳更多的元素。要通过增加现有数组的长度来创建稀疏数组,只需将数组的长度属性设置为大于当前长度的值即可。

语法:

const arr_name = [item1,item2,item3];
arr_name.length = requiredLength;

示例:

Javascript

const even = [2,4,6,8]; 
even.length = 6; 
console.log(even);

输出

[ 2, 4, 6, 8, <2 empty items> ]

稀疏数组的内存实现:

与稠密数组不同,稀疏数组不一定在连续的位置分配内存,也可以按块分配内存。稀疏数组在内存中被实现为一个带有编号属性的对象,就像一个普通数组一样。然而,与普通数组不同,稀疏数组只存储定义元素的索引和值,为未定义的元素留下间隙。这些间隙不占用内存空间,但可能影响某些数组操作的性能。因此,在使用稀疏数组时,有必要注意潜在的性能问题,并在需要时考虑替代的数据结构。

结论:

总结起来,稀疏数组和密集数组都是用于组织和访问元素集合的数据结构类型。密集数组,也称为连续数组,将元素按顺序存储在内存中。它们允许以常数时间访问任何元素,并适用于需要频繁访问元素或进行数值计算的应用程序。相反,稀疏数组设计用于存储大部分为空或零的元素。它们只存储非空或非零值,从而减少内存使用量并加快对非空值的迭代。然而,与密集数组相比,访问单个元素可能会较慢,因为它需要搜索所需元素的索引。

在选择稀疏数组和密集数组时,应考虑应用程序的具体要求。需要考虑的因素包括数据的大小、访问的频率和数据的稀疏性。密集数组适用于需要快速访问所有元素的应用程序,而稀疏数组更适用于具有大型、大部分为空的数据集的应用程序。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程