本文的源码在个人github,能够参考一下git
数组是数据结构中最简单,也是使用最普遍的一种。在原生的js中,数组给咱们提供了不少方便的操做方法,好比push()
, pop()
, shift()
, unshift()
。可是出于对数据结构的学习,咱们将不使用这些已有的方法,而是本身实现这些方法。这样也方便咱们计算其时间复杂度。这里咱们选择使用TypeScript
实现,主要是由于TypeScript的强类型控制,以及泛型这些高级特性。github
先来看咱们本身实现数组的实例属性以及构造函数,咱们用capacity来表示数组的容量,虽然在TypeScript中并无像Java那样严格限定数组长度,但咱们仍然但愿尽可能接近Java。咱们用size来表示当前数组中元素的个数数组
class MyArray<T> { private data: Array<T>; private size: number = 0; constructor(capacity = 10) { this.data = new Array(capacity); } }
在数组index位置插入元素是咱们常常使用的一个操做,那咱们就须要从以前数组中index位置开始,每一个元素向后移动一个位置。以便给新插入的元素挪出位置。在操做的末尾,咱们须要维护一下数组的size.数据结构
public add(index: number, e: T) { if (index < 0 || index > this.size) { throw new Error('Add failed. Required index >= 0 and index <= size.'); } if (this.size === this.data.length) { this.resize(2 * this.data.length); } for (let i = this.size - 1; i >= index; i--) { this.data[i + 1] = this.data[i]; } this.data[index] = e; this.size++; }
在数组中添加元素,最好状况下,用户只用操做一次,时间复杂度是O(1);最差的状况下,用户须要操做size次,时间复杂度是O(n)函数
这里有一点须要注意,当数组当前元素的个数size和capacity相等时,咱们须要给数组进行扩容为2倍处理,这个我后面会专门说起学习
这个没啥好说的,查询和修改数组中某个元素复杂度就是O(1)ui
public get(index: number): T { if (index < 0 || index >= this.size) { throw new Error('Get failed. Index is illegal.'); } return this.data[index]; }
在数组index位置删除元素,这里咱们须要把数组从index+1位置开始,每一个元素向前移动一个元素this
public remove(index: number): T { if (index < 0 || index >= this.size) { throw new Error('Remove failed. Index is illegal.'); } let ret = this.data[index]; for (let i = index + 1; i < this.size; i++) { this.data[i - 1] = this.data[i]; } this.size--; this.data[this.size] = undefined; // 若是数组中的元素仅为数组容量的1/4时,这时须要进行缩容操做 if (this.size === this.data.length / 4 && this.data.length / 2 !== 0) { this.resize(this.data.length / 2); } return ret; }
在数组中删除元素,最好状况下,用户只用操做一次,时间复杂度是O(1);最差的状况下,用户须要操做size次,时间复杂度是O(n)
当数组中的元素个数仅为数组容量的1/4时,咱们须要对数组进行缩容为1/2操做code
数组的扩容和缩容操做很简单,原理就是接受一个新的容量,把以前数组中的内容复制到新数组中,并返回新的数组blog
private resize(newCapacity: number): void { let newData = new Array(newCapacity); for (let i = 0; i < this.size; i++) { newData[i] = this.data[i]; } this.data = newData; }
更多相关数据结构,能够前往个人github。持续更新中,喜欢的话给个star~