厦门市集美区建设局网站,有家装饰有限公司地址,职业培训机构哪家最好,机械加工网格刀厂家目录
散列表
散列函数
散列冲突解决
1、开放寻址法
1.1 线性探测
1.2 二次探测
1.3 双重散列
2、链表法
使用场景
单词查找
散列表与链表的结合使用LRU
散列表总结
散列表实例 散列表
Word 单词拼写功能#xff0c;如何实现的#xff1f;散列表#xff08;Has…目录
散列表
散列函数
散列冲突解决
1、开放寻址法
1.1 线性探测
1.2 二次探测
1.3 双重散列
2、链表法
使用场景
单词查找
散列表与链表的结合使用LRU
散列表总结
散列表实例 散列表
Word 单词拼写功能如何实现的散列表Hash Table
散列表用的是数组支持按照下标随机访问数据的特性。散列表其实是数组的一种扩展。 用空间换时间
散列表就是用数组支持按照下标随机访问的时候时间复杂度O(1)的特性。
通过散列函数把元素的键值映射为下标然后将数据存储在数组中对应的下标位置。当查询键值元素时用散列函数将键值转化数组下标从对应的数组下标的位置取数据。 散列函数
Hash(key) key表示元素的键值hash(key)的值表示经过散列函数计算得到的散列值
散列函数设计的要求
散列函数计算得到的散列值是一个非负整数如果key1key2,hash(key1) hash(key2)如果key1不等于key2,那hash(key1)不等于hash(key2)
散列冲突无法避免如著名的MD5,SHA,CRC.而且数组的存储空间有限也会增大散列冲突的概率。
1、设计散列函数
要点1散列函数的设计不能太复杂2、散列函数生成的值要尽可能随机并且均匀分布。
方法直接寻址法平方取中法折叠法随机数法。
Hash(nice) ((n - a) * 26 * 26 *26 (i - a)*26 * 26 (c - a)*26 (e-a)) 散列冲突解决
1、开放寻址法
如果出现散列冲突重新探测一个空闲位置将其插入。
探测方法
1.1 线性探测
插入线性探测存储位置被占用就从当前位置开始依次往后查找尾部结束接着从头找直到找到空闲位置为止。
查找通过散列函数求出要查找元素的键值对应的散列值然后从数组中下标为散列值的元素和查找的元素。如果相等找到。如果没有顺序往后依次查找。如果变量数组中空位置还没有找到则说明查找元素并没有在散列列表中。
删除特殊标记deleted。当线性探测查找的时候遇到标记为deleted空间。并不是停下来而且继续探测。
缺点当插入的数据越来越多散列冲突的可能性越来越大空闲位置越来越少探测时间越久。
1.2 二次探测
与线性探测很像线性探测每次探测的步长是1hash(key)0,hash(key)1, hash(key)2
二次探测每次探测的步长变成原来的二次方 hash(key)0 hash(key)1^2 hash(key)2^2
1.3 双重散列
不仅仅要使用一个散列函数使用一组散列函数hash1(key),hash2(key) ,hash3(key)。函数依次使用直到找到空闲位置。
不管那种探测方法当散列表中空闲位置不多的时候散列冲突的概率会大大提高。一般情况下尽可能保证散列表中有一定比例的空闲槽位。我们用装载因子来表示空位的多少。 散列表的装载因子 填入表中元素个数 / 散列表的长度
装载因子越大数目空闲位置越少冲突越多散列表的性能会下降。
装载因子过大解决方法
动态扩容降低装载因子
装载因子的阈值设置要权衡时间、空间复杂度。如果内存空间多对执行效率要求高可以降低负载因子的阈值反之增加负载因子。
动态扩容可能需要多次。可以将扩容操作穿插在插入操作过程中分批完成。当装载因子大于阈值后值申请空间并不将老的数据搬移到新散列表中。
动态扩容期间的插入操作
当有新数据要插入时将新数据插入新散列表中并且从老的散列表中拿出一个数据放入新散列表。每次插入一个数据到散列表。重复上面的过程老的数据搬移到新散列表中。插入操作的时间不受影响。时间复杂度O(1)
优点散列表中的数据都存储在数组中可以有效利用CPU缓存加快查询速度。缺点删除数据比较麻烦需要标记已删除的数据
当数据量比较小装载因子小
2、链表法
在散列表中每个桶会对应一条链表。所有散列值相同的元素我们都放到相同桶位对应的链表中。
当插入时只需要通过散列函数计算出对应的散列桶位。
将其插入到对应链表中。时间复杂度O(1)
查找删除一个元素。计算对应的桶然后遍历链表查找或删除。复杂度与链表长度k成正比O(k)
优点对内存利用率比较好需要时申请对于大装载因子的容忍度更高只要散列函数的随机值均匀即使装载因子10也就是链表的长度变长查找效率下降但比顺序表查找快很多。链表的升华更加高效的散列表缺点链表因为要存储指针对于较小的对象比较耗内存。链表节点零散分布不连续对CPU缓存不友好。使用跳表、红黑树取代链表。即使冲突在极端情况下查找时间O(logn)使用场景
1、单词查找
常用英文单词20万左右。假设单词平均长度是10个字母占用10字节空间。 20万英文单词大约占用2MB空间。这个大小完全可以放在内存里。当用户输入某个英文单词时拿用户输入的单词去散列表中查找。如果查到则说明拼写正确。
2、10万条URL访问日志
如何按照访问次数给URL排序
遍历10万条数据以URL为key,访问次数为value存入散列表中。同时记录最大访问的次数K。时间复杂度O(n)如果K不是很大可以使用桶排序时间复杂度O(n),如果K很大如大于10万就使用快速排序 O(nlogn)
3、两个字符串数组比较
有两个字符串数组每个数组有10万条字符串如何快速找出两个数组中相同的字符串。 以第一个字符串构建散列表key为字符串value表示出现次数。变量第二个字符串数组以字符串key在散列表中查找如果value大于0则说明存在相同字符串。时间复杂度O(n)
4、散列表与链表的结合使用LRU
借助散列表可以把LRU缓存淘汰算法的时间复杂度降低为O(1)
当需要缓存数据时先在链表中查找这个数据没有找到直接将数据放到链表尾部如果找到了就把它移动到链表的尾部。所以单纯的使用链表实现LRU缓存淘汰算法的时间复杂度很高O(n)将散列表与链表一起使用时间复杂度O(1)
散列表总结
工业级散列表的特性
1支持快速插入语、删除查找
2、内存占用不能浪费过多内存
3、稳定性极端情况下的退化 实现散列表
1、设计合适的散列函数
2、定义装载因子阈值并支持动态扩容
3、选择合适的散列冲突解决方法 散列表实例
#include stdio.h
#include stdlib.h
#include stdbool.h
#include string.h
#include time.h#define HASH_SHIFT 4
#define HASH_SIZE (1HASH_SHIFT)
#define HASH_MASK (HASH_SIZE - 1)struct hash_table{unsigned int used;unsigned long entry[HASH_SIZE];
};void hash_table_reset(struct hash_table *table)
{int i;table-used 0;for(i 0;iHASH_SIZE;i)table-entry[i] ~0;
}unsigned int hash_function(unsigned long value)
{return value HASH_MASK;
}void dump_hash_table(struct hash_table *table)
{int i;for(i 0;iHASH_SIZE;i){if(table-entry[i] ~0)printf(%2u: ,i);elseprintf(%2u: %2u\n,i,table-entry[i],hash_function(table-entry[i]));}
}void hash_function_test()
{int i;srandom(time(NULL));for(i 0;i10;i){unsigned long val random();printf(%10u-%2u,val,hash_function(val));}
}unsigned int next_probe(unsigned int pre_key)
{return(pre_key 1) HASH_MASK;
}void next_probe_test()
{int i;unsigned int key1,key2;key1 0;for(i 0;iHASH_SIZE;i){key2 next_probe(key1);printf(%2u - %2u\n,key1,key2);key1 key2;}
}void hash_table_add(struct hash_table *table,unsigned long value)
{unsigned int key hash_function(value);if(table-used HASH_SIZE)return;while(table-entry[key] ! ~0)key next_probe(key);table-entry[key] value;table-used;
}unsigned int hash_table_slot(struct hash_table *table,unsigned long value)
{int i;unsigned int key hash_function(value);for(i 0;iHASH_SIZE;i){if(table-entry[key] value || table-entry[key] ~0)break;key next_probe(key);}return key;
}bool hash_table_find(struct hash_table *table,unsigned long value)
{return table-entry[hash_table_slot(table,value)] value;
}void hash_table_del(struct hash_table *table,unsigned long value)
{unsigned int i,k,j;if(!hash_table_find(table,value))return;//findi j hash_table_slot(table,value);while(true){table-entry[i] ~0;do{j next_probe(j);if(table-entry[j] ~0)return;k hash_function(table-entry[j]);}while((ij)?(ik kj) : (ik || kj));table-entry[i] table-entry[j];i j;}table-used;
}void hash_table_add_test()
{struct hash_table table;hash_table_reset(table);hash_table_add(table,1234);int ret;ret hash_table_find(table,1234);printf(ret res%d\n,ret);
}void hash_table_del_test()
{struct hash_table table;int i;hash_table_reset(table);for(i 0;iHASH_SIZE;i)hash_table_add(table,i);dump_hash_table(table);hash_table_del(table,5);dump_hash_table(table);
}void main()
{//hash_table_add_test();hash_table_del_test();return;
}
文章转载自: http://www.morning.srrzb.cn.gov.cn.srrzb.cn http://www.morning.xwbld.cn.gov.cn.xwbld.cn http://www.morning.yrnll.cn.gov.cn.yrnll.cn http://www.morning.ljllt.cn.gov.cn.ljllt.cn http://www.morning.rgdcf.cn.gov.cn.rgdcf.cn http://www.morning.pqrhb.cn.gov.cn.pqrhb.cn http://www.morning.dzpnl.cn.gov.cn.dzpnl.cn http://www.morning.bpmfq.cn.gov.cn.bpmfq.cn http://www.morning.stbfy.cn.gov.cn.stbfy.cn http://www.morning.dmthy.cn.gov.cn.dmthy.cn http://www.morning.nrxsl.cn.gov.cn.nrxsl.cn http://www.morning.psxcr.cn.gov.cn.psxcr.cn http://www.morning.mhnr.cn.gov.cn.mhnr.cn http://www.morning.jjnql.cn.gov.cn.jjnql.cn http://www.morning.qygfb.cn.gov.cn.qygfb.cn http://www.morning.mkhwx.cn.gov.cn.mkhwx.cn http://www.morning.zrkp.cn.gov.cn.zrkp.cn http://www.morning.jgncd.cn.gov.cn.jgncd.cn http://www.morning.hhzdj.cn.gov.cn.hhzdj.cn http://www.morning.rdzgm.cn.gov.cn.rdzgm.cn http://www.morning.xckqs.cn.gov.cn.xckqs.cn http://www.morning.tqbw.cn.gov.cn.tqbw.cn http://www.morning.wtbzt.cn.gov.cn.wtbzt.cn http://www.morning.hmdyl.cn.gov.cn.hmdyl.cn http://www.morning.dxzcr.cn.gov.cn.dxzcr.cn http://www.morning.dnqliv.cn.gov.cn.dnqliv.cn http://www.morning.cczrw.cn.gov.cn.cczrw.cn http://www.morning.dlurfdo.cn.gov.cn.dlurfdo.cn http://www.morning.trjr.cn.gov.cn.trjr.cn http://www.morning.cyysq.cn.gov.cn.cyysq.cn http://www.morning.qljxm.cn.gov.cn.qljxm.cn http://www.morning.pnmgr.cn.gov.cn.pnmgr.cn http://www.morning.pntzg.cn.gov.cn.pntzg.cn http://www.morning.qtqjx.cn.gov.cn.qtqjx.cn http://www.morning.gpryk.cn.gov.cn.gpryk.cn http://www.morning.zzfjh.cn.gov.cn.zzfjh.cn http://www.morning.pfkrw.cn.gov.cn.pfkrw.cn http://www.morning.ddfp.cn.gov.cn.ddfp.cn http://www.morning.rfgkf.cn.gov.cn.rfgkf.cn http://www.morning.bhrbr.cn.gov.cn.bhrbr.cn http://www.morning.btqqh.cn.gov.cn.btqqh.cn http://www.morning.hzqjgas.com.gov.cn.hzqjgas.com http://www.morning.kfsfm.cn.gov.cn.kfsfm.cn http://www.morning.kcwkt.cn.gov.cn.kcwkt.cn http://www.morning.hsrch.cn.gov.cn.hsrch.cn http://www.morning.ncfky.cn.gov.cn.ncfky.cn http://www.morning.rfxyk.cn.gov.cn.rfxyk.cn http://www.morning.hrdx.cn.gov.cn.hrdx.cn http://www.morning.qrmyd.cn.gov.cn.qrmyd.cn http://www.morning.guangda11.cn.gov.cn.guangda11.cn http://www.morning.mzhgf.cn.gov.cn.mzhgf.cn http://www.morning.ftdlg.cn.gov.cn.ftdlg.cn http://www.morning.zlqyj.cn.gov.cn.zlqyj.cn http://www.morning.nfbkp.cn.gov.cn.nfbkp.cn http://www.morning.xzrbd.cn.gov.cn.xzrbd.cn http://www.morning.hnhgb.cn.gov.cn.hnhgb.cn http://www.morning.glnmm.cn.gov.cn.glnmm.cn http://www.morning.tnktt.cn.gov.cn.tnktt.cn http://www.morning.qrpx.cn.gov.cn.qrpx.cn http://www.morning.qrlsy.cn.gov.cn.qrlsy.cn http://www.morning.osshjj.cn.gov.cn.osshjj.cn http://www.morning.qbdsx.cn.gov.cn.qbdsx.cn http://www.morning.ysllp.cn.gov.cn.ysllp.cn http://www.morning.nstml.cn.gov.cn.nstml.cn http://www.morning.skkmz.cn.gov.cn.skkmz.cn http://www.morning.rjtmg.cn.gov.cn.rjtmg.cn http://www.morning.zglrl.cn.gov.cn.zglrl.cn http://www.morning.zmtrk.cn.gov.cn.zmtrk.cn http://www.morning.xjkr.cn.gov.cn.xjkr.cn http://www.morning.bnfjh.cn.gov.cn.bnfjh.cn http://www.morning.nptls.cn.gov.cn.nptls.cn http://www.morning.zxwqt.cn.gov.cn.zxwqt.cn http://www.morning.bxrlt.cn.gov.cn.bxrlt.cn http://www.morning.jrdbq.cn.gov.cn.jrdbq.cn http://www.morning.jrtjc.cn.gov.cn.jrtjc.cn http://www.morning.blzrj.cn.gov.cn.blzrj.cn http://www.morning.gynkr.cn.gov.cn.gynkr.cn http://www.morning.htfnz.cn.gov.cn.htfnz.cn http://www.morning.sxtdh.com.gov.cn.sxtdh.com http://www.morning.cndxl.cn.gov.cn.cndxl.cn