<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
我們可以先實現一個比較簡單的雜湊表,使用java中解決雜湊衝突的方法,即雜湊桶(開雜湊)方式實現,其中注意:
相關程式碼如下
public class HashBucket { static class Node {//使用內部類方式定義節點 public int key; public int val; public Node next; public Node(int key, int val) { this.key = key; this.val = val; } } private Node[] array; public int usedSize; public HashBucket() { this.array = new Node[10]; this.usedSize = 0; } public void put(int key,int val) {//存放資料 //1、確定下標 int index = key % this.array.length; //2、遍歷這個下標的連結串列 Node cur = array[index]; while (cur != null) { //更新val if(cur.key == key) { cur.val = val; return; } cur = cur.next; } //3、cur == null 當前陣列下標的連結串列中沒有key Node node = new Node(key,val); node.next = array[index]; array[index] = node; this.usedSize++; //4、判斷當前有沒有超過負載因子 if(loadFactor() >= 0.75) {//負載因子我們認為0.75 //擴容 resize(); } } public int get(int key) {//取出資料 //以什麼方式儲存的 那就以什麼方式取 int index = key % this.array.length; Node cur = array[index]; while (cur != null) { if(cur.key == key) { return cur.val; } cur = cur.next; } return -1; } public double loadFactor() {//計算負載因子 return this.usedSize*1.0 / this.array.length; } public void resize() {//擴容函數 //自己建立新的2倍陣列 Node[] newArray = new Node[2*this.array.length]; //遍歷原來的雜湊桶 //最外層迴圈 控制陣列下標 for (int i = 0; i < this.array.length; i++) { Node cur = array[i]; Node curNext = null; while (cur != null) { //記錄cur.next curNext = cur.next; //在新的陣列裡面的下標 int index = cur.key % newArray.length; //進行頭插法 cur.next = newArray[index]; newArray[index] = cur; cur = curNext; } } this.array = newArray; }
上面我們實現的雜湊表中的鍵值對只能存放整型資料,但若是比較複雜的型別,例如字串,物件等等,此時就需要用到泛型了。其中注意:
hashCode
方法hashcode
和equals方法相關程式碼如下
class Person { public String id; public Person(String id) { this.id = id; } @Override public String toString() { return "Person{" + "id='" + id + ''' + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return Objects.equals(id, person.id); } @Override public int hashCode() { return Objects.hash(id); } } public class HashBuck2<K,V> { static class Node<K,V> { public K key; public V val; public Node<K,V> next; public Node(K key,V val) { this.key = key; this.val = val; } } public Node<K,V>[] array = (Node<K, V>[]) new Node[10]; public int usedSize; public void put(K key,V val) { //通過hashcode方法定位陣列的下標 int hash = key.hashCode(); int index = hash % this.array.length; Node<K,V> cur = array[index]; while (cur != null) { //equals 起的作用是遍歷當前陣列下標的key是否相同 if(cur.key.equals(key)) { cur.val = val; } cur = cur.next; } Node<K,V> node = new Node<>(key,val); node.next = array[index]; array[index] = node; this.usedSize++; } public V get(K key) { int hash = key.hashCode(); int index = hash % this.array.length; Node<K,V> cur= array[index]; while (cur != null) { if(cur.key.equals(key)) { return cur.val; } cur = cur.next; } return null; }
到此這篇關於Java 資料結構雜湊演演算法之雜湊桶方式解決雜湊衝突的文章就介紹到這了,更多相關Java 雜湊衝突內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45