在一些专业书籍或编程语言里,字典也被称为查找表、映射或者关联表等。
对于动态字典,还需支持插入和删除元素。
一个数据项就是一种二元组,下面称之为关联。
为了下面讨论的方便,现在首先定义一个关联对象的类Assoc,假定本章下面讨论的字典都以Assoc对象为元素:
class Assoc:
def __init__(self, key, value):
self.key = key
self.value = value
def ___lt__(self, other): # 有时(有些操作)可能需要考虑序(表示less than)
return self.key < other.key
def __le__(self, other):
return self.key < other.key or self.key == other.key
def __str__(self): # 定义字符串表示形式便于输出和交互(表示less than or equal to)
return "Assoc({0}{1})".format(self.key, self.value)
在元素有序的表上做二分法检索的函数可定义如下:
def bisearch(lst, key):
low, high = 0, len(lst) - 1
while low <= high: # 范围内还有元素
mid = low + (high - low) // 2
if key == lst[mid].key:
return lst[mid].value
if key < lst[mid].key:
high = mid - 1 # 在低半区继续
else:
low = mid + 1 # 在高半区继续
可以继承前面基于表的字典类,定义一个新的字典类:
class DictOrdList(DictList):
......
def search(self, key):
......
def insert(self, key, data):
......
def delete(self, key):
......
......
# end of class
首先讨论散列技术及其在字典方面的应用,即所谓的散列表(hash table)。
这说明,在通常情况下,散列函数h是一个从大集合到小集合的映射。
通俗地讲,散列函数的映射关系越乱越好,越不清晰越好
两种常用的散列函数:
- 除余法,适用于整数关键码。
- 基数转换法,适用于整数或字符串关键码。
下面是用Python写出的一个字符串散列函数:
def str_hash(s):
h1 = 0
for c in s:
h1 = h1 *29 + ord(c)
"""
ord(c, /)
Return the Unicode code point for a one-character string.
示例:
>>> ord('a')
97
"""
return h1
(读者:这一小节没有仔细看,下次好好看。)
冲突消解方法:
- 内消解方法(在基本的存储区内部解决冲突问题)。
- 外消解方法(在基本的存储区之外解决冲突)。
(读者:这里没仔细看。)
假设需要求交集的集合S和T由两个Python的表s和t表示,结果集合用表r表示。求交集的算法(注意,这里假设s和t的元素都从小到大排列):
r = []
i = 0 # i和j是s和t中下一次检查的元素的下标
j = 0
while i < len(s) and j < len(t):
if s[i] < t[j]:
i += 1
elif t[j] < s[i]:
j += 1
else: # s[i] = t[j]
r.append(s[i])
i += 1
j += 1
# 现在r就是得到的交集
(读者:这一小节没看)
(读者:没看)
(读者:没看)
(读者:没看)
参考文献:
1.《数据结构与算法-Python语言描述》。