数据结构与算法06__浅析哈希表
python中的字典是基于哈希表构建的,这里简单说说自己对哈希表的理解。
哈希表(Hash table)又称,散列表,主要由key和value键值对构成的数据结构,但不止于此。
首先,哈希表构建需要再内存创建一块空间存储数据。
再者,哈希表中我认为最为重要的就是哈希函数(hash function ),又称散列函数,这里称之为f(key)---->value,我们用f将key映射(其实就是加密方法,如md5,sha1,sha224等等),将key通过哈希函数映射,得到加密的value,这就是哈希表数据存储的方式。但不仅于此。
比如我们存储dic = {'张三':18, '李四':25}。这里的张三--->18和李四--->25,就是通过哈希函数加密存储的,我们通过同一个哈希函数f(因为是同一个相同的函数,所以时间复杂度是0(1),可以由key瞬间通过哈希函数瞬间得到value,与问题规模本身无关),可以f(张三)得到18,f(李四)得到25,但是这其中还有一步,value是通过地址映射得到的。也就是说,f(key)--->加密得到一个16进制的地址值,然后地址值对应的是value。
(注意:上面的加密方法(sha1,sha224等),相同值(如希望加密'123')通过sha1加密得到的16进制数,不管加密多少次,得到的这个值都是一样的。但是,如果加密‘1234’,则不是基于123的加密得到的,而是得到一个新的位数相同,但是值不一样的加密值。)
由于f(key)---->映射到地址值对应的value这个过程,需要我们首先说的创建一块内存空间,而这个内存空间可能就会带来一些影响。
比如说,哈希冲突,其原因有二,一是数据量太大,导致地址不够存;二是哈希函数构建有问题,不同key得到了相同的value。我们只简单讨论第一种情况的解决办法。
1,开放地址,也就是增加内存空间。2,再哈希。就是说在同义词产生地址冲突的时候用另一个哈希函数去求得另一个哈希地址,一直到不再有冲突。3,链地址,value---> new1_value ---> new2_value...。4,建立公共溢出区。
二、哈希函数的构造方法
除留余数法:这个方法我们在上述例子中也有用到过,取关键字被某一个不大于哈希表长m的数p除后所余得的数为哈希地址。即Hash(key)=key%p,p<=m(m为哈希表长)。这种方法比较简单也很常用。
参考:http://www.nowamagic.net/academy/detail/3008040