CMU15-445:Lecture #07 笔记

Lecture #07: Hash Tables

本文是对CMU15-445课程第7节笔记的一个粗略总结和翻译。仅供个人(M1kanN)复习使用。


1. Data Structures

  • DBMS为系统内部的许多不同部分使用各种数据结构。例子如下:
    • Internal Meta-Data:
      用来跟踪数据库和系统状态信息的数据。
    • Core Data Storage:
      数据结构被用来作为数据库中tuple的基础存储。
    • Temporary Data Structures:
      DBMS可以在处理查询的同事建立数据结构以加快执行速度。(如:用于链接的哈希表)
    • Table Indices:
      辅助数据结构使其更容易找到特定的tuple
  • 在为DBMS实现数据结构的时候,有两个主要的设计决定需要考虑。
    1. Data Organization:
      我们需要弄清楚如何布局内存,以及在数据结构内存储哪些信息,以便高效访问。
    2. Concurrency:
      我们还需要考虑如何使多个线程访问数据结构而不造成问题。

2. Hash Table

  • 哈希表实现了一个关联数组的抽象数据类型,将key映射到value。提供了平均\(O(1)\)的操作复杂度, 最坏为\(O(n)\) ,以及\(O(n)\)的存储复杂度。当然也需要优化

    哈希表的实现包含2部分:

    • Hash Function:
      trade off -> fast execution & collision
    • Hashing Scheme:
      如何处理collisions?
      trade off -> memory allocate & execute additional instructions

3. Hash Functions

  • 输进去一个key,出来一个代表这个key的整数。函数的输出是确定的。
  • 数据库用到的哈希函数不需要那么复杂,因为我们不需要担心保护这些key。而且这些函数主要由DBMS内部使用,因此信息不会泄露到系统之外。一般来说,关心哈希函数速度和collision就行了。

4. Static Hashing Schemes

  • 静态散列方案是指散列表的大小是固定的。即:如果DBMS哈希表存储空间用完了,就必须从头开始重建一个更大的哈希表。通畅为原大小的两倍。

  • 为了减小空间浪费,避免collisions很重要。一般我们都设置为期望存放key的大小的两倍容量。

    1. The number of elements is known ahead of time.
    2. Keys are unique
    3. There exists a perfect hash function.

    因此我们需要适当的选择哈希函数和哈希模式

4.1 Linear Probe Hashing

  • 最基础的哈希策略,也叫开放地址法。太简单了这里省略不翻译了。
  • 删除元素需要一定的技巧。因为如果是简单删除,然后将下面的移上一位的话,如果是循环表,可能会让上面的hash元素失效。
    解决方案:
    • tombstones:墓碑法,标记这里删除了。缺点是浪费空间
    • 删除元素后面相邻的移动一位,去填满删除的元素。但要注意,移动的entry必须是原来移动过的,才不会导致前面的hash失效。这种方法一般不会用。
  • Non-unique Keys:
    同样的key可能对应很多value的时候的方法:
    • Seperate Linked List: 链表存储
    • Redundant Keys:更常见的方法,在表中多次存储一个键,用线性探测法

4.2 Robin Hood Hashing

  • 线性探测法的扩展。旨在减少每个key与它们在哈希表中的最佳位置的最大距离。即,从更rich的key中偷取slot,并交给poor的key。
  • 在这个策略中,每个条目也记录了它们与最佳位置的距离,每次插入的时候,如果被插入的key与它们在当前位置的最佳位置的距离,比当前条目的距离更远,就替换当前条目,并继续尝试在表中的更远位置插入旧条目。
  • 例子:
    参考原PPT

4.3 Cuckoo Hashing

  • 维持多个哈希表。来调整key
  • 例子:
    参考原PPT

5. Dynamic Hashing Schemes

  • 静态哈希不能调整大小,不太行。所以才DBMS一般都用动态哈希。可以rebuild表,如果需要grow / shrink size。

5.1 Chained Hashing

  • 常用的结构。直接用链表。

5.2 Extendible Hashing

  • 这个结构在Project-1中有。做完项目后体会更深刻。
  • 详细请参考:extendible hashing

5.3 Linear Hashing

  • 当一个桶溢出的时候,这个方案并不立刻分割,而是保持一个分割指针,跟踪下一个要分割的桶。无论这个指针是否指向一个溢出的桶,DBMS都会进行分割。溢出的标准由设计者决定。感觉跟Extendible Hashing的操作挺像的。
  • 例子:
    图太多懒得截图了。
    参考原PPT
posted @ 2023-01-27 17:51  M1kanN  阅读(88)  评论(0编辑  收藏  举报