数据结构C++——字典、跳表和散列

一、字典

字典(dictionary)是一些形如(k,v)的数对(元素/记录)所组成的集合。

  • 其中k是关键字,v是关键字k对应的值。
  • 任意两个数对,其关键字各不相同

多重字典:两个或多个数对有相同的关键字

有关字典的操作:

  • 确定字典是否为空。
  • 确定字典有多少数对。
  • 在字典中寻找/搜索具有给定关键字的数对。
  • 插入一个数对。
  • 删除一个具有给定关键字的数对

二、ADT

实例:

  • 关键字互不相同的数对/元素集合

操作:

  • empty()
  • size()
  • find(k)
  • insert( p )
  • erase(k)
template<class K, class E>
class dictionary{
   
public:
	virtual ~dictionary(){
   }
	virtual bool empty() const = 0;
	virtual int size() const = 0;
	virtual pair<const K,E>* find(const K&) const = 0;
	virtual void insert(const pair(const K,E)&) = 0;
	virtual void erase(const K&) = 0;
}

三、访问字典数对

两种方式:

  • 随机访问
  • 顺序访问

随机访问:按照给定的一个关键字来访问字典中的数对

顺序访问:按照关键字的递增顺序逐个访问字典中的数对

  • Begin:用来返回关键字最小的数对
  • Next:用来返回下一个数对

四、字典的描述

字典的线性结构描述:

  • 线性表描述
  • 跳表描述
  • 散列表描述

4.1 线性表描述

字典用有序线性表: (p0, p1, p2, …, pn-1),表示,关键字从左到右依次增大

使用线性表的描述方法

  • 数组描述: sortedArrayList
  • 链表描述: sortedChain

4.1.1 有序数组sortedArrayList

用数组描述的有序线性表类sortedArrayList :

  • 搜索:有序,所以可以折半搜索,时间为 O ( l o g n ) O(logn) O(logn)
  • 插入:首先确认该字典中是否存在相同关键字的数对,然后进行插入,插入操作的时间是 O ( n ) O(n) O(n)
  • 删除 : 首先要找到欲删除的数对,然后再进行删除,删除的时间复杂性为 O ( n ) O(n) O(n)

4.1.2 链表sortedChain

在这里插入图片描述

template<class K, class E>
class sortedChain{
   
public :
	……
	//返回关键字theKey匹配的数对的指针,若不存在匹配的数对,则返回NULL
	pair<const K,E> * find(const K& theKey) const;
	//插入一个数对thePair,覆盖已经存在的数对
	void insert(const pair<const K,E>& thePair);
	//删除关键字theKey匹配的数对
	void erase(const K& theKey);
	
protected:
	pairNode<const K,E> *firstNode; //指向链表第一个节点的指针
	int  dSize;         //表中的数对个数
}

template<class E, class K>
pair<const K,E> * find(const K& theKey) const;
{
   //返回关键字theKey匹配的数对的指针,若不存在匹配的数对,则返回NULL
	pairNode<K,E> *currentNode = firstNode;
   // 搜索与theKey相匹配的数对
	while (currentNode !=NULL && currentNode->element.first < theKey)
		currentNode = currentNode->next); 

  // 判断是否与theKey匹配
   if  (currentNode !=NULL && 
        currentNode->element.first = = theKey) // 与theKey相匹配
        return &currentNode->element;
   return NULL; // 不存在相匹配的数对
}

插入insert:类似于链表的插入
在这里插入图片描述

template<class E, class 
  • 9
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

边懵懵'.ㅅ'

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

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

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

打赏作者

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

抵扣说明:

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

余额充值