Hash表是一种可以将查找元素的时间复杂度降为O(1)的高效算法。

基本原理:将所有的数据通过hash函数映射到hash表里面,如果需要查找元素的时候再通过hash函数来计算出来元素在hash表里面的位置,从而一次将需要的元素找到。

hive里的hash用法_hash表

存在的问题

如果有两个或者更多的元素通过hash函数映射的hash位置是相同的那么就会出现问题。

解决办法

线性探测:

hive里的hash用法_hash表_02

在产生hash冲突的时候,在hash表里面依次查找下一个没有填数据的位置,并且将产生冲突的数据填入。

问题:

如果当前面的数据产生hash冲突的时候会将后面的数据位置占上,那么如果后面的数据进行填入的时候就没有在应该在的位置上面,那么就会在查找效率上面有所下降。

hive里的hash用法_hive里的hash用法_03

二次探测:

为了解决线性探测的缺点,那么使用二次探测可以在一定的程度上面得到缓解。

index = di + i^2;

通过这里的i^2可以曾加距离hash冲突的位置,这样就可以减少后面的数据没有出现在本来应该出现的位置上面。

hive里的hash用法_hive里的hash用法_04

链地址法:

利用线性探测和二次探测都是避免不了会将后面的元素本来应该放置的位置侵占。

如果将hash表里面的元素换成链表的节点,那么产生hash冲突的时候可以将产生冲突的数据依次加入到链表里面,那么无论多少的数据产生冲突 都可以将元素放到指定的链表里面,那么需要查找元素的时候就可以遍历链表来查找。

hive里的hash用法_hash表_05

缺点:如果在一个固定的位置上面产生冲突的元素过多,那么在查找一个元素的时候就相当于遍历一个单链表,那么效率依旧不太高。但是可以将单链表的数据结构改成AVL树或者红黑树。