无序词典的方法

   实现上述的无需词典的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接口的方法生成元素迭代器
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

执于代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值