小知识,大挑战!本文正在参与“ 程序员必备小知识 ”创作活动
大家好,我是melo,一名大二上软件工程在读生,经历了一年的摸滚,现在已经在工作室里边准备开发后台项目啦。
不过这篇文章呢,还是想跟大家聊一聊数据结构与算法,学校也是大二上才开设了数据结构这门课,希望可以一边学习数据结构一边积累后台项目开发经验。
不知不觉,我们已经接触了两三个数据结构了:链表、栈和队列,但有没有发现,前边的几个数据结构在查找性能方面其实并不是很好?为了进一步改进查找的性能,我们又要学习另一个全新的数据结构–哈希表!
思路
- 数组+链表来实现
Java8,当哈希冲突达到一定程度后,每一个位置从链表转成红黑树
数组
- 一个指针数组,里边存放着元素的地址
链表
- 我们设计出来的哈希函数,难免会出现冲突(即A和B都找到了H.rcd[i]这个位置),链地址法解决的思路是,让他们存在于这个位置上的一条同义词链表上(所谓同义词就是指他们的哈希地址一样)
跟开放地址法比起来,当发生哈希冲突时,他不是去改变哈希地址的值,而是”将错就错”,让他们共存在同一个哈希地址上的链表上的不同位置。
插入新元素
先调用哈希函数找到val要所在的key
- 若key有值,则遍历数组[key]上的同义词链表,验证是否已存在该val(哈希表要求不能重复)
- 若存在,则return UNSUCCESS; //插入失败
- 若不存在,则让该val指向原来的表头,同时成为新表头
- 若存在,则return UNSUCCESS; //插入失败
- 若key没值,则直接让数组[key]=val就好了
当然,上边都是伪代码,具体的实现还有很多细节需要注意
- 而且上边的查找我们还可以单独封装成一个函数
头文件HashTable.h
1 | c复制代码typedef long KeyType; |
头文件CHashTable.h
1 | c复制代码#include "Common.h" |
源文件CHashTable.cpp
1 | c复制代码#include "CHashTable.h" |
关于此处野指针的问题,具体可以参考 迷途指针
Test文件
1 | c复制代码#include "ChashTable.h" |
删除运行效果
构建哈希表题目
其实他本身帮我们初始化好了,H.size也给出来了
\
1 | c复制代码#include "allinclude.h" //DO NOT edit this line |
写在最后
- 其实关于哈希表的实现还有很多种方式,而且不同语言的底层也不一样,等到以后深入Java集合源码的时候,我们还可以再来聊一聊!
作者:『Melo_』
本文版权归作者和掘金共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
本文转载自: 掘金