数据结构学习---线性表的数组实现LIstArray

线性表的数组实现,其内部存放数据的实际上就是一个可变容量的数组,大家都知道数组的特性,获取数组中I的数据的时间为常数,所以做查询非常快。
package taxus.list;

public class ListArray implements List{

private final int LEN = 5;

private int size;

private Object[] elements;

private Strategy strategy;

public ListArray(){
this(new DefaultStrategy());
}

public ListArray(Strategy strategy){
this.strategy = strategy;
size = 0;
elements = new Object[LEN];
}


public int getSize() {
return size;
}


public boolean isEmpty() {
return size == 0;
}


public boolean contains(Object e) {
for (int i = 0; i < size; i++) {
if (strategy.equal(elements[i], e)) {
return true;
}
}
return false;
}


public int indexOf(Object e) {
for (int i = 0; i < size; i++) {
if (strategy.equal(elements[i], e)) {
return i;
}
}
return -1;
}


public void insert(int i, Object e) throws OutOfBoundaryException {
if (i < 0 || i > size) {
throw new OutOfBoundaryException("指定的插入序号越界,Size:" + size + " Index:" + i);
}
if (i >= elements.length) {
expandSpace();
}
for (int j = size; j > i; j--) {
elements[j] = elements[j-1];
}
elements[i] = e;
size++;
return;
}

private void expandSpace(){
Object[] a = new Object[elements.length * 2];
for (int i = 0; i < elements.length; i++) {
a[i] = elements[i];
}
elements = a;
}


public boolean insertBefore(Object obj, Object e) {
int i = indexOf(obj);
if (i < 0) {
return false;
}
insert(i, e);
return true;
}


public boolean insertAfter(Object obj, Object e) {
int i = indexOf(obj);
if (i < 0) {
return false;
}
insert(i + 1, e);
return true;
}

/**
* size length
* size实际大小
* length 创建的空间大小
* length >= size, 插入时size范围内安全,超出size有可能就超越length,删除时删除size范围内,
*/
public Object remove(int i) throws OutOfBoundaryException {
if (i < 0 || i > size) {
throw new OutOfBoundaryException("指定的插入序号越界,Size:" + size + " Index:" + i);
}
Object obj = elements[i];
for (int j = i; j < size - 1; j++) {
elements[j] = elements[j];
}
elements[--size] = null;
return obj;
}


public boolean remove(Object e) {
int i = indexOf(e);
if (i < 0) {
return false;
}
remove(i);
--size;
return true;
}


public Object replace(int i, Object e) throws OutOfBoundaryException {
if (i < 0 || i > size) {
throw new OutOfBoundaryException("指定的插入序号越界,Size:" + size + " Index:" + i);
}
Object old = elements[i];
elements[i] = e;
return old;
}


public Object get(int i) throws OutOfBoundaryException {
if (i < 0 || i > size) {
throw new OutOfBoundaryException("指定的插入序号越界,Size:" + size + " Index:" + i);
}
return elements[i];
}

public int getElementsLength(){
return elements.length;
}

}


在ArrayList类中一共有4个成员变量,其中elements数组及size用于存储线性表中的数据元素及元素个数,strategy完成线性表中原色的比较操作策略;LEN是elements的初始默认大小,数组的大小再后续的插入操作中可以发生变化。
算法getSize(), isEmpty(), replate(int i, Object e),get(i)的时间复杂度为1,由于数组的随机存取特性,因此,获取线性表中序号为i的原色或对其进行替换均可在常数时间内完成,通过size可以直接判断出线性表中元素个数和线性表是否为空。
算法contains(Object e), indexOf(Object e)主要是查找线性表中的某个元素,查找会出现不成功的情况,在整个查找过程中会比较接近一半的元素。
算法insert(int i, Object e), remove(i)主要按照序号来完成线性表的插入与删除操作,时间复杂度上面已经说明,为常数,除此之外在找到元素以后要进行相应操作会移动一半的数据元素,特别的在插入过程中还会出现空间扩展,采用平均时间分析后,算法消耗的时间为n/2。
算法insertBefore(Object obj, Object e),insertAfter(Object obj, Object e), remove(Object e),按照线性表中特定的元素来完成元素的插入,删除,操作,此时算法分别为先在线性表中找到对应的数据元素,然后在进行相应操作。在使用数组实现是运行时间为n。
除此之外我们还可以看到两个东西size和数组的elements.lengh,在此结构中要注意size <= elements.lengh,length为开辟的存储空间,size为空间中实际存放的元素数量,开辟了空间不一定要存放元素。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值