004-Hashing(没太理解,后续补充)

118 阅读2分钟

Comparison Model(比较模型):

Comparable items:

将元素看作black boxes,他们的数据是不透明的,只能通过不断比较得出数据(相对顺序和相等性)

支持的操作:

只能进行大小比较,运算符号包括,,=,{\le},{\ge},=,{\ne}等,
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

复杂度:

除了哈希表以外O(1)O(1),最快的即为lognlog_n,所以在考虑有没有比lognlog_n更快查找元素时,引出了DirectAccessArrayDirect Access Array

Decision Tree:

  • 每一个内部节点代表二元运算
  • 叶节点表示算法的结束,对该算法进行输出
  • 路径代表对不同的输入执行的操作
  • 一个叶节点代表每个算法的输出结果,所以叶节点的数量n+1\ge n+1

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就失去了效用根据鸽巢原理,所以m=θ(n)m=\theta(n)
  • Collision: 存在a,b,st.h(a)=h(b)h(a) = h(b)
  • 同一个元素被映射到了同一个位置如何解决呢?
    • open addrsting(开放寻址)
    • chaining

chaining:

Store collison in another data structure,将具有同一哈希值的键存储在同一位置上,并用链表等数据结构进行连接

Hash functions:

h(k)=k/mod  mh(k) = k /mod \;m,取模运算可以将大范围的键映射到小范围内,且同时取模运算具有周期性,可以均匀地分散键的分布,降低哈希碰撞的频率。

Universal:(theoretically)

hab(k) = (((ak + b) mod p) mod m)