- 对表的所有操作都可以通过使用数组来实现。虽然数组是由固定容量创建的,但在需要的时候可以用双倍的容量创建。
- 数组的实现可以使得printList以线性时间被执行,而findKth操作则花费常数时间。
- 插人和删除的花费却潜藏着昂贵的开销,这要看插入和删除发生在什么地方。最坏的情形下,在位置0的插人(即在表的前端插入)首先需要将整个数组后移一个位置,空出空间来,而删除第一个元素则需要将表中的所有元素前移一个位置,因此这两种操作的最坏情况为O(N)。平均来看,这两种操作都需要移动表的一半的元素,因此仍然需要线性时 间。另一方面,如果所有的操作都发生在表的高端,那就没有元素需要移动,而添加和删除则只花费0(1)时间。
- 存在许多情形,在这些情形下的表是通过在高端进行插人操作建成的,其后只发生对数组的 访问(即只有findKth操作)。在这种情况下,数组是表的一种恰当的实现。
- 如果发生对表 的一些插人和删除操作,特别是对表的前端进行,那么数组就不是一种好的选择。下一节处理另 一种数据结构:链表(linked list)。
测试代码
package top.itcourse.adt;
public class AdtArray<T> {
// 1.数组初始大小为10(泛型无法直接创建数组,只能通过Object强转)
private T[] arr = (T[]) new Object[10];
// 2.扩展系数
private double dilatationFactor = 0.75;
// 3.表的长度(实际存放元素)
private int length = 0;
/**
* 数组扩容为当前大小的两倍
*/
private void dilatation() {
T[] aux = (T[])new Object[arr.length*2];
for(int i = 0; i < arr.length; ++i) {
aux[i] = arr[i];
}
arr = aux;
}
/**
* 检测下标是否越界。
* @param index:元素下标。
*/
private void checkIndex(int index) {
if(index > length || index < 0) {
throw new RuntimeException("下标越界异常!");
}
}
/**
* 在表的下标index处添加元素Element,如果index越界,将出现异常。
* @param index:待插入的下标位置。
* @param Element:待插入的元素。
*/
public void add(int index,T element) {
// 检测扩容
if(length > arr.length*dilatationFactor) {
dilatation();
}
// 下标越界异常检测
checkIndex(index);
// 数组元素进行整体移动
for(int i = length; i > index; --i) {
arr[i] = arr[i-1];
}
// 正式添加元素
arr[index] = element;
// 表 长度加1
length++;
}
/**
* 在表的末尾添加元素
* @param Element
*/
public void add(T element) {
add(length, element);
}
/**
* 打印表元素
*/
public void printList() {
for(int i = 0; i < length; ++i) {
System.out.print(arr[i] + "\t");
}
System.out.println();
}
/**
* 返回表中元素个数。
* @return:表长度
*/
public int size() {
return length;
}
/**
* 清空表。
*/
public void clear() {
arr = (T[]) new Object[10];
length = 0;
}
/**
* 移除掉下标为index处的元素。
* @param index:元素下标.
*/
public void remove(int index) {
// 下标值检查
checkIndex(index);
for(int i = index; i < length - 1; ++i) {
arr[i] = arr[i+1];
}
length--;
}
/**
* 根据下标index查找元素返回。
* @param index:元素下标。
* @return:返回查找结果。
*/
public T get(int index) {
// 检测越界
checkIndex(index);
return arr[index];
}
/**
* 返回元素首次出现的下标,元素不存在则返回-1,元素存在的唯一标准是两者equals方法返回true。
* @param elementd:待查找的元素。
* @return:元素首次出现的下标。
*/
public int get(T element) {
for(int i = 0; i < length; ++i) {
if(arr[i].equals(element)) {
return i;
}
}
return -1;
}
}
其它
关注下方微信公众号,
回复:
DS-AA-Java.code
欢迎加入交流群:451826376
更多信息:www.itcourse.top