Comparison Model(比较模型):
Comparable items:
将元素看作black boxes,他们的数据是不透明的,只能通过不断比较得出数据(相对顺序和相等性)
支持的操作:
只能进行大小比较,运算符号包括等,
outputs are binary: True.False
Goal:
Store a set of n comparable items, support find(k) operation
Running Time:
is lower bounded by comparison times,so count comparisons
复杂度:
除了哈希表以外,最快的即为,所以在考虑有没有比更快查找元素时,引出了
Decision Tree:
- 每一个内部节点代表二元运算
- 叶节点表示算法的结束,对该算法进行输出
- 路径代表对不同的输入执行的操作
- 一个叶节点代表每个算法的输出结果,所以叶节点的数量
Direct Access Array:
Give item unique integer key k in {0, . . . , u − 1}, store item in an array at index k
为什么变快了:
其具有线性分支因子,且可以通过键(key)直接访问数组的位置,
隐性问题:
当键的范围过大,而数据集的范围很小时,会造成空间浪费
Hashing:
- map keys to a smaller range m = Θ(n) and use smaller direct access array(对原有数组进行压缩)
- Hash function: h(k) : {0, . . . , u − 1} → {0, . . . , m − 1}
- If m << u, hash map就失去了效用根据鸽巢原理,所以
- Collision: 存在a,b,st.
- 同一个元素被映射到了同一个位置如何解决呢?
- open addrsting(开放寻址)
- chaining
chaining:
Store collison in another data structure,将具有同一哈希值的键存储在同一位置上,并用链表等数据结构进行连接
Hash functions:
,取模运算可以将大范围的键映射到小范围内,且同时取模运算具有周期性,可以均匀地分散键的分布,降低哈希碰撞的频率。
Universal:(theoretically)
hab(k) = (((ak + b) mod p) mod m)