>[success] # 数组
~~~
1.数组(Array)是一种线性表数据结构。它用一组'连续的内存空间',
来存储一组'具有相同类型的数据'。
2.线性表,线性表可以理解数据排成像一条线一样的结构。每个线性
表上的数据最多只有前和后两个方向。
3.注释:js 数组不是传统意义上的数组,采用的也不是线性表的形式,
在 JavaScript 中,数组是哈希映射,表现形式类似于链表,但如今编译器
已经在为类型一致的数组分配连续的存储空间了(这里还是有点疑问??)
4.JS中的数组结构非常的简单(已经是浏览器帮助我们进行封装处理好的)可以存储不同的数据类型值
数组容量伴随存储的内容自动缩放
5.数组这种结构:
优势:基于索引直接进行查找和获取,效率很高
弊端:进行中间插入和删除操作时,性能非常低(数组塌陷和删除中间项的优化)
~~~
[js数组中文,下面给出英文原文章地址](https://juejin.im/entry/59ae664d518825244d207196)
作者:[Paul Shan](https://link.juejin.im/?target=http%3A%2F%2Flink.zhihu.com%2F%3Ftarget%3Dhttp%253A%2F%2Fvoidcanvas.com%2Fauthor%2Fpaulshan%2F)原文:[Diving deep into JavaScript array - evolution & performance](https://link.juejin.im/?target=http%3A%2F%2Flink.zhihu.com%2F%3Ftarget%3Dhttp%253A%2F%2Fvoidcanvas.com%2Fjavascript-array-evolution-performance%2F)
>[danger] ##### 线性表给数组带来的优势
~~~
1.如图,图片来自极客时间,通过图片可以看出数组在内存中开辟一块连续的、
大小相同的空间,用来存储数据
2.因为'连续的内存空间和相同类型的数据',这两个特性使得可以让数据进行随机访问,
即他的查询速度为O(1),也正是这个特性导致他的删除和插入某个元素后还要保证其
内存的连续性,因此速度为O(n)
3.以下图为例该数组的长度为10,分配的空间地址为1000-1039,其中首项的地址为1000
即根据这个可以得到个简单的公式'a[i]_address = base_address + i * data_type_size',
因此当我们取值的时候完全是脚标i这个常量控制因此复杂度为O(1),更准确地说:数组支持随机访问,
根据下标随机访问的时间复杂度为 O(1)
4.一下图为例如果是删除和插入,如果当插入或删除的是是末尾,即直接在末尾加入对应的内存空间
地址和数据复杂度为O(1),那如果是头部,则其他位置的数据的所有内存地址都需要进行平移则复杂度
为O(n),那他们的平均复杂度为O(n)
~~~
![](https://img.kancloud.cn/a7/3a/a73a178f6c11de07cbce81612c795b83_514x273.png)
* js查询和添加和删除的例子
~~~
1.通过下面案例可以看出及时是js数组,像首位插入数据和删除数据都O(n),如果频繁对头部做操作并且数据
量较大的时候还是要考虑这方面
~~~
~~~
var arr=[];
for(var i=0;i<=1000000;i++){
arr.push('abcdefghigk'+i);
}
console.time('arr');
arr.push(1)
console.timeEnd('arr');
console.time('arr1');
arr.unshift('1') // 查询耗时最多的
console.timeEnd('arr1');
console.time('arr2');
arr[1000000]
console.timeEnd('arr2');
~~~
- 接触数据结构和算法
- 数据结构与算法 -- 大O复杂度表示法
- 数据结构与算法 -- 时间复杂度分析
- 最好、最坏、平均、均摊时间复杂度
- 基础数据结构和算法
- 线性表和非线性表
- 结构 -- 数组
- JS -- 数组
- 结构 -- 栈
- JS -- 栈
- JS -- 栈有效圆括号
- JS -- 汉诺塔
- 结构 -- 队列
- JS -- 队列
- JS -- 双端队列
- JS -- 循环队列
- 结构 -- 链表
- JS -- 链表
- JS -- 双向链表
- JS -- 循环链表
- JS -- 有序链表
- 结构 -- JS 字典
- 结构 -- 散列表
- 结构 -- js 散列表
- 结构 -- js分离链表
- 结构 -- js开放寻址法
- 结构 -- 递归
- 结构 -- js递归经典问题
- 结构 -- 树
- 结构 -- js 二搜索树
- 结构 -- 红黑树
- 结构 -- 堆
- 结构 -- js 堆
- 结构 -- js 堆排序
- 结构 -- 排序
- js -- 冒泡排序
- js -- 选择排序
- js -- 插入排序
- js -- 归并排序
- js -- 快速排序
- js -- 计数排序
- js -- 桶排序
- js -- 基数排序
- 结构 -- 算法
- 搜索算法
- 二分搜索
- 内插搜索
- 随机算法
- 简单
- 第一题 两数之和
- 第七题 反转整数
- 第九题 回文数
- 第十三题 罗马数字转整数
- 常见一些需求
- 把原始 list 转换成树形结构