`

hash表的学习--初步定义阶段

 
阅读更多

数据结构者,数据间关系+数据存储方式也。

选择何种数据结构,取决于需要解决什么样的问题。

任何一个数据结构都有它的优势,这个优势说白了就是本数据结构在进行XX操作时快,而选择何种数据结构就看要解决的问题需要在数据结构上进行何种操作来决定。

哈希表就是体现这个道理的一个很好的例子。

哈希表提供这么一种其它数据结构并不擅长的操作:

在理想情况下,能用常量时间查找到指定值的数据

普通数据结构如线性表、树、图等,其结点内的数据与数据所存储的位置之间的关系是随机的,所以要想提供查找某已知值的数据的位置只能通过比较方式进行,如:对于未排序的线性表,要从头至尾逐一比较是否“==”;对于二分查找,则要比较“>”“<”还是“==”。这样,时间复杂度是n或者logn

而哈希表通过在存储位置和数据值之间建立映射关系这一手段,将该操作的时间复杂度降低为O1)。

这个描述在存储位置和数据值之间建立映射关系的映射关系就是哈希函数。

将数据存入哈希表时,利用哈希函数为该数据安排存储位置;查找指定值数据时,也按照哈希函数得到目标索引。

实际操作起来时,由于数值域和索引域大小不同,所以不能简单地线性映射,而是需要建立较复杂的哈希函数,这就有可能造成冲突”——这是哈希面临的主要问题。好的哈希函数应该让随机数据值得到的哈希结果尽可能地随即和分散,而且减少冲突。

=====================分割线=======================

有这样一类问题,查找是否有出现多于一次的数据?笨方法只能从头至尾逐一比对,复杂性为O(N*N)。聪明一点的方法,如果数据不是很分散,可以用做记号的方法,用一个位数组(可用bool实现)记录各个位所代表的数据是否出现过,如果读入一个已经出现过的数据则说明它出现多于一次,用int代替bool,还可以记录下每个数据出现的次数,在遍历一次便可得到出现最多次的数据,复杂度为O(N)。但是如果数据很分散,这种线性映射就不管用了,因为内存会严重浪费,如果数据过于夸张,会造成很大BUFFER的申请,但是这种映射记录的思想还是可取的,这时就需要一个从很大的数据域向相对很小的地址域映射的工具来辅助,自然就是哈希

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics