《数据结构与算法Python语言描述》学习笔记chap8字典和集合-----20191207
数据检索:
一是已存储的数据集合,另一方面是用户检索时提供的信息。
具体检索 可以是确定特定数据是否存在于数据集中,相当于集合成员判断;也可以是希望找到与所提供信息相关的数据,类似于在字典里查词语的解释。
后一种方式,检索时提供的信息被看作是检索码或关键码(key)。这种关键码也常作为数据的一部分,存储在数据集里,这就是基于关键码的数据存储和检索。
作为检索基础的关键码,通常是数据项的某种(可能具有唯一性的)特征,可以是数据内容的一个组成部分,也可以是专门为数据检索建立的标签。(例如,为每个学生指定一个血好,作为检索的标签)
假设:需要存储的数据元素有两个部分组成,其中一部分是与检索有关的关键码,另一部分是与之关联的数据。
字典就是基于支持关键码的数据存储和检索的数据结构。
字典的使用中,最重要的也是是哦那个最频繁的操作就是检索。
在考虑字典的实现时,检索效率时最重要的考虑因素,
字典操作和效率:
实际中使用的字典可以分为两类:
静态字典:在建立之后,这种字典内容和结构都不再变化,主要操作只有检索。对这种字典,需要老了创建的代价,但最重要的检索效率。无论如何,创建工作只需要做一次,而检索是在字典的整个生命周期中反复进行的操作。
动态字典:在初始创建后,这种字典的内容(和结构)将一直处于动态变动之中。对这种字典,除了检索之外,最重要的基本操作还包括数据项的插入和删除等。在考虑这种字典的实现时,不仅需要考虑检索的效率,还必须考虑插入和删除操作的效率,需要在更多相互影响的因素中做权衡。
有关检索效率的评价标准,通常考虑的是在一次完整检索过程中比较关键码的平均次数,通常称为平均检索长度ASL。
字典和索引
字典是这种功能的统一:
1)作为一种数据存储结构,支持在字典里存储一批数据项;
2)提供支持数据检索的功能,设法维护从关键码找到相关数据的联系信息。
后一功能,页称为索引,其存在的目的就是为检索服务。
注意,各种字典都不应该允许修改字典关联中的关键码,因为关键码用于确定其所在项在字典里存储的位置,以支持高校检索。如果允许修改关键码,就可以破坏字典数据结构的完整性,导致后序检索操作失败。
字典元素:关联
在支持关键码的存储与检索的字典里,一个数据项可以划分为两大部分:其一是与检索有关的关键码部分,另外就是与检索无关的其他数据部分。这样,一个数据项就是一种二元组,即关联。
字典的线性表实现
将关键码和值的关联作为元素(数据项)顺序存入线性表,形成关联的序列,可以作为字典的一种实现技术,
检索就是在线性表里查找具有特定关键码的数据项,数据项的插入和删除等都是普通的线性表操作。
有序线性表和二分法检索
如果关键码取自一个有序集合(存在某种内在的序,例如整数的小于等于关系,字符串的字典序等),就可以按照关键码大小的顺序排列在字典里的项。在数据项按序排列时,可以采用二分法实现快速检索。
二分法检索是一种重要的检索技术,其基本思想是按比例逐步缩小需要考虑的数据范围,从而快速逼近需要找的数据。
基本操作过程如下:(假设字典里的数据项按关键码的升序排列):
1)初始时,考虑的元素区间是整个字典(一个顺序表);
2)取所考虑的元素范围里位置居中的那个数据项,比较该项的关键码与检索关键码,如果他们相等则检索结束;
3)如果检索关键码较大,则把检索范围修改为中间项之后的半区间;如果检索关键码较小,则把检索范围修改为中间项之前的半区间。
4)如果在关注范围内仍有数据就回到步骤2继续,否则检索失败结束。
# 合并字典
def merge_dict(dic1,dic2):
"""python3.5后至此的一行代码实现合并字典"""
return {**dic1,**dic2}
dic1 = {'a':1,'b':2}
dic2 = {'c':3,'d':4}
print(merge_dict(dic1,dic2))