一、数据结构描述:
1. 插入操作:对于一般数组(不包括有序数组)而言,插入一个元素,即在数组的最后面添加一项。当然,我们这里讨论的并不全面,因为一个数组的长度定义以后就不能再改变。所以,在添加数据项时,还要保证没有超过数组的长度限制。一旦超过了数组容量,就会报错ArrayIndexOutOfBoundsException。所以,对于长度固定的数组而言,并不适用于实际应用中的所有地方。
2. 删除操作:数组元素的删除可能并不像你想象的那么简单,其实它的执行效率比较低。每删除一个元素,就可能需要移动若干的元素,来填补删除的空洞。举例说明:数组中存放有10个元素,如果删除第4个元素,那么从第5个到第10个元素需要依次向前移动一位(即移动了6个元素的位置)。
3. 查找操作:对于一般数组,查找的效率并不是很高,需要从头到尾进行遍历,直到找到需要的元素。但是,对于一种特殊的数组——有序数组而言,采用我们后面即将提到的二分法查找,效率将非常的高。
二、效率的比较:
由上面的描述可以看出,对于一般数组的插入操作,消耗时间用大O表示法为:O(1),即消耗常数的时间。而删除操作和查找操作消耗的时间为O(N)。可见,对于一般数组的删除和查找还有很多可以改进的空间。
三、Java语言描述算法
package com.solid.array;
/**
* 数据结构和算法(Java描述)——线性数组的数据结构和算法
*/
public class HighArray {
//数组对象
private long[] arr;
//数组元素个数
private static int nElems;
/**
* 构造函数
* @param max
*/
public HighArray(int max) {
arr = new long[max];
nElems = 0;
}
/**
* 向数组中插入某个元素
* @param value
*/
public void insert(long value) {
arr[nElems] = value;
nElems++;
}
/**
* 查找数组中的某个元素(这里假设元素个数没有重复)
* @param value
*/
public void find(long value) {
int i;
for(i=0; i<nElems; i++) {
if(arr[i] == value) {
break;
}
}
if(i == nElems) {
System.out.print("can't find: " + value);
} else {
System.out.println("find it!");
}
}
/**
* 删除数组中的某个元素(这里假设元素个数没有重复)
* @param value
* @return
*/
public boolean delete(long value) {
int i;
for(i=0; i<nElems; i++) {
if(value == arr[i]) {
break;
}
}
if(i == nElems) {
return false;
} else {
for(int j=i; j<nElems; j++) {
arr[j] = arr[j+1];
nElems--;
}
return true;
}
}
/**
* 显示数组中的所有元素
*/
public void display() {
for(int i=0; i<nElems; i++) {
System.out.print("arr["+i+"]=" + arr[i] + " ");
}
System.out.println();
}
}