文章目录
抽象数据类型 ADT(abstract data type)
抽象数据类型是带有一组操作的一些对象的集合。在ADT的定义中没有地方提到关于这组操作是如何实现的任何解释,像表,集合,图与他们的一些操作的对象可以被看做是抽象数据类型
表ADT
表ADT有许多操作实现,如insert和remove等。
顺序表简单数组实现
顺序表由简单数组实现,创建的时候需要估计表的大小,因为数组创建的时候需要指定大小。
数组的好处是find操作只要常数时间,但是删除和插入操作一般需要线性时间。比如在位置0处插入数据,就必须后面的元素向后移一位腾出空间来用于插入,而如果要在最后一位插入,就直接可以插入。不过平均来看,每次插入或者删除都需要移动一半的数据,所以时间为O(N)。
链表实现
链表由一系列节点组成,这些节点不需要在内存中相连,只要在节点中指定下一个节点的位置就行了。相比于顺序表,链表的情况正好相反。执行find操作时,链表需要从头遍历一遍,所以需要线性时间查找,但是执行insert和remove操作时却很方便。如果要在某个位置i插入时,只需要把它自己的next指向i+1位置,然后原先i位置的next指向自己就实现了插入。删除也是同样的道理,把前一个的next指向自己的后一个位置,那么自己就被删除了。
JAVA Collections API 中的表
JAVA语言包中含有一些普通数据结构的实现,通常叫做Collections API。其中含有Collection接口,Iterator接口还有List接口
Collection接口
Collection(集合)接口存储一组类型相同的对象,下面是该接口的一些最重要的部分
public interface Collection<anyType> extends Iterable<anyType>{
//返回大小
int size();
//判断是否为空
boolean isEmpty();
//清空
void clear();
//判断是否含有某元素
boolean contains(anyType x);
//删除某元素
boolean remove(anyType x);
//添加某元素
boolean add(anyType x);
//遍历
java.util.Iterator<anyType> iterator();
}
如下遍历
public static <anyType> void print(Collection<anyType> coll){
for(anyType item : coll){
System.out.println(item);
}
}
Iterator接口
实现Iterable接口的集合必须实现Iterator方法,该方法返回一个Iterator类型的对象,该Iterator是一个在java.util包中定义的接口
Iterator接口的思路是,通过Iterator方法,每个集合均可创建并返回给客户一个实现Iterator接口的对象,并将当前位置的概念在对象内部存储下来,如下
public interface Iterator<anyType> {
//判断是否有下一项
boolean hasNext();
//给出集合的下一项
anyType next();
//删除next返回的最新的项
void remove();
}
下面为遍历代码
public static <anyType> void print(Collection<anyType> coll){
Iterator<AnyType> itr = coll.iteartor();
for(itr.hasNext()){
anyType item = itr.next();
System.out.println(item);
}
}
使用迭代器时,使用其他的add,remove等方法是不合法的,而使用迭代器的remove是合法的。
List接口,ArrayList接口,LinkedLIst接口
java.util的list接口继承了Collection接口,因此它包含Collection接口的所有方法,外加一些其他的方法,下面为一些重要的方法
public interface LIst<AnyType> extends Collection<AnyType>{
//访问指定idx的值
AnyType get(int idx);
//更改指定idx的值
AnyType set(int idx, AnyType newVal);
//在指定idx后增加值
void add(int idx, AnyType x);
//删除指定idx的值
void remove(int idx);
//迭代器
ListIterator<AnyType> listIterator(int pos);
}
List ADT有两种实现形式
ArrayList类提供了一种可增长数组的实现,优点在于get()和set()操作只需要常数时间,缺点是删除插入操作代价昂贵。
而LinkedList是一种双链表的实现,删除插入的代价非常小,但是不容易做索引,get和set调用代价昂贵,除非调用接近表的端点。