散列表:WORD文档中如何检测单词的拼写错误
散列表用的是数组支持按照下标随机访问数据的特性,所以散列其实是数组的一种扩展,由数组演化而来。
散列表(哈希表 Hash Table):由散列函数(哈希函数)和数组构成,底层存储数据的是数组。
散列函数(键转化为散列值即数组下标)的设计:
- 散列值是非负整数;
- if key1 = key2, then hash(key1) == hash(key2);
- if key1 != key2, then hash(key1) != hash(key2).
散列冲突:即使著名的MD5、SHA、CRC等哈希算法也无法完全避免散列冲突。
常用散列冲突解决办法,分为两类:
- 开放寻址法
- 线性探测(Linear Probing):步长为1的顺序遍历数组,寻找空闲空间(为了不破坏原来的散列算法,被删除的元素的空闲空间标记为deleted,然后继续往下寻找非deleted空闲空间)
- 二次线性探测(Quadratic Probing):步长位($n^2$),线性遍历数组,寻找空闲空间
- 二重散列(Double Hashing):键值依次输入散列函数组,直到找到空闲空间
尽可能保证散列表中空闲元素的比例,空闲越少越容易冲突
装载因子:散列表的装载因子 = 填入表中的元素个数 / 散列表的长度
- 链表法:在散列表中,每个散列值对应一个桶(bucket)或者槽(slot)散列值,每个桶或者槽对应一条链表。
WORD文档中单词拼写的检测:常用的英文单词20w个左右,假设每个单词的平均长度为10,平均一个单词占用10个byte的内存空间,那20w个单词占用2MB内存空间,即使扩大10倍,也只是20MB内存空间,以目前计算机设备的内存空间,是完全可以hold住的。将单词作为键,查找哈希表,如果返回值大于0,则存在,否则判断为拼写错误。
思考:
- 10w条URL访问记录,如何按照访问次数排序;
- 两个字符串数组,每个数组存放10w个字符串,如何寻找两个数组中相同的字符串。
思考1:将url作为key,次数作为value,同时记录最大次数max,时间复杂度O(n);只要最大次数不是特别大的值,例如,极端情况超过10w,可以采用桶排序O(n),否则采用快排,时间复杂度O(nlog n);
思考2:将一个数组存放进hash表,字符串作为key,value为出现次数;遍历另外一个数组的字符串作为key值去查找,如果有返回正值,则相同,否则,没有。时间复杂度O(n);
原文地址:https://www.cnblogs.com/petewell/p/11601667.html
时间: 2024-10-02 18:18:50