文章目录
一、字典
字典(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 ¤tNode->element;
return NULL; // 不存在相匹配的数对
}
插入insert:类似于链表的插入
template<class E, class