课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
算法的学习是程序员在学习软件编程开发技术的时候需要重点掌握的一个编程知识,而今天我们就通过案例分析来了解一下,哈希算法的应用与优化方法。
哈希也叫散列,是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值,也叫摘要。比如把一篇文章的内容通过散列生成64位的摘要,该过程不可逆。
这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定的输入值,但如果输出的位数足够,散列成相同输出的概率非常非常小。
字符串的比较有时会成为消耗较大的操作,虽然strcmp或者memcpy的实现用到了很多加速和优化技巧,但本质上它还是逐个比较的方式。
字符串比较的一个改进方案就是哈希,比较哈希值(通常是一个int64的整数)而非比较内容能快很多,但需要为字符串提前计算好哈希值,且需要额外的空间保存哈希值,另外,在哈希值相等的时候,还需要比较字符串,但因为冲突的概率极低,所以后续的字符串比较不会很多次。
这样不一定总是更高效,但它提供了另一个思路,你需要测试你的程序,再决定要不要这样做。
另一个哈希的用法是哈希表,哈希表的实现是提前开辟一些桶,通过哈希找到元素所在的桶(编号),如果冲突,再拉链解决冲突。
为了减少冲突经常需要开辟更多的桶,但更多的桶需要更大的存储空间,特别是元素数量不确定的时候,桶的数量选择变得两难,随着装载的元素变多,冲突加剧,在扩容的时候,将需要对已存在的元素重新哈希,这是很费的点。
哈希表的冲突极端情况下会退化成链表,当初设想的快速查找变得不再可行,HashMap是普通哈希表的改进版,结合哈希和二叉平衡搜索树。
另一个常用来做查找的结构是红黑树,它能确保坏情况下,有logN的时间复杂度,但红黑树的查找过程需要沿着链走,不同结点内存通常不连续,CACHE命中性经常很差,红黑树的中序遍历结果是有序的,这是哈希表不具备的,另外,红黑树不存在哈希表那般预估容量难的问题。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请在707945861群中学习了解。