实现上述的无需词典的ADT的一种简单方法,为了插入的心的条目,
我们只需要将谅解知道表额的前端,为了删除天目,只需要检查各个的知道发现新的天目,知道
发现一个与制定的关键码额温和的条目,其他方法也可以类似额实现。
基于无序列表额实现的无需词典
利用的无需词典实现的武宣词典的结构,如代码留:
性能分析:
借助的无需列表额L实现的,每个词典的只占用常用的的空间,股总体只要需要哦
O(n)的空间。
再次 ,我们从事通过调用了L.insertinFirst() 方法将新调用的知道表的首位。因此的每次插入的操作只需要时间。。
不幸的是,除了(通过迭代期的)桌椅的价差的每个条目之外,我们没有更好的方法对无需的方法,。也就是说
虽然在最好的情况下,find() 操作只需要常说的时间,但在最坏的情况下,每次的都 需要的O(n)的时间,同理,每次
remove 操作也需要O(n) 的时间,更糟的是,为了完成,我们总是需要的检查的每一个条目,因此该才做需要的
O(n)的时间。
总体来说: 如此实现的词典能都支持跨度的有效的插入操作,但查找的与删除的的低。但这并意味着这一方法实现方法毫无价值,
6.3.4 散列表的无序词典及其实现
散列的思想不仅可以用实现映射ADT的,也可以用实现的无需此地啊你的ADT方法,具体来说,使用一个哦通过装潢数组
其中的每个同分别对应于一组管家那么相等的天目,将没一组的天目组织委员一个自词典。
Dictionary_DLNode:
基于 散列表的实现的无序词典的,
基于散列表的实现的无序词典结构,
性能分析:
只要分析:
只要始终的保证张条因此足够小,同事选用适当的散列函数则每个同的对应的此电脑大,
在满足这些t条偶见的情况下,find(),insert(),remove() 操作的的平均复杂度的为O(1
),而操作的服务度的o(1+m) ,其中m为查找的命中的Tina母的实际数目。
需要的特别注意的是,这里的findALL() 方法复杂度的给出形式,是我们首次看到的一tt
复杂度的方式不同。该操作的执行的bubu进取决于输入的规模,而且反过来还取决于出书的规范。
此类的算法是“输出敏感的”。
6.4 有序词典
前面的曾提到:,基于无需列表的实现的词典结构费用适用于解决网络log 之类的问题,插入操作并发,茶渣吧,战术的操作却极少进行。另外的一些问题则正好。
就查找的操作而言,散列表的的平均性能不错,然而在最坏的情况下,可能几乎所有的天目都会冲突,玉石对散列表的查找的推出啊诶单一的散列表的查找, 只要有的O(n)的个条目相互重头,散列表的查找的就需要的)(n)的时间。d
代码:
/*
* 基于列表实现(无序)词典结构
*/
package dsa;
public class Dictionary_DLNode implements Dictionary {
private List L;//存放条目的列表
private EqualityTester T;//判等器
//构造方法
public Dictionary_DLNode()
{ this(new EqualityTesterDefault()); }
//默认构造方法
public Dictionary_DLNode(EqualityTester t)
{ L = new List_DLNode(); T = t; }
/***************************** ADT方法 *****************************/
//查询词典结构当前的规模
public int getSize()
{ return L.getSize(); }
//判断词典结构是否为空
public boolean isEmpty()
{ return L.isEmpty(); }
//若词典中存在以key为关键码的条目,则返回其中的一个条目;否则,返回null
public Entry find(Object key) {
Iterator P = L.positions();
while (P.hasNext()) {
Position pos = (Position)P.getNext();
Entry entry = (EntryDefault) pos.getElem();
if (T.isEqualTo(entry.getKey(), key)) return entry;
}
return null;
}
//返回由关键码为key的条目组成的迭代器
public Iterator findAll(Object key) {
List list = new List_DLNode();
Iterator P = L.positions();
while (P.hasNext()) {
Position pos = (Position)P.getNext();
Entry entry = (EntryDefault) pos.getElem();
if (T.isEqualTo(entry.getKey(), key))
list.insertLast(entry);
}
return new IteratorElement(list);
}
//插入条目(key, value),并返回该条目
public Entry insert(Object key, Object value) {
Entry entry = new EntryDefault(key, value);//创建新条目
L.insertFirst(entry);//将新条目插至表首,并
return entry;//返回null标志
}
//若词典中存在以key为关键码的条目,则将摘除其中的一个并返回;否则,返回null
public Entry remove(Object key) {
Iterator P = L.positions();
while (P.hasNext()) {//逐一对比
Position pos = (Position)P.getNext();//各个位置
Entry entry = (EntryDefault) pos.getElem();//处的条目
if (T.isEqualTo(entry.getKey(), key)) {//若发现key已出现在某个条目中,则
Entry oldEntry = entry;//先保留该条目
L.remove(pos);//删除该条目
return oldEntry;//最后返回原先的条目
}
}//若此循环结束,说明key尚未在词典中出现,因此
return null;//返回null标志
}
//返回词典中所有条目的一个迭代器
public Iterator entries()
{ return new IteratorElement(L); }//直接利用List接口的方法生成元素迭代器
}