使用線性探測法實現雜湊表的Go語言程式


雜湊表是一種高效的資料結構,用於儲存鍵值對,使其成為各種應用程式必不可少的工具。線性探測是一種衝突解決技術,有助於處理兩個鍵對映到雜湊表中同一索引的情況。在本文中,我們將探討使用陣列和對映在 Go 語言中實現帶線性探測的雜湊表,深入瞭解其工作原理和實際應用。在以下示例中,我們將使用雜湊機制和衝突解決策略執行插入和檢索操作。

解釋

在以下示例中,鍵 [10, 25, 40, 31, 70] 插入到其雜湊索引處。每當發生衝突時,線性探測會將元素放置在下一個空閒索引中。

Index:   0    1    2    3    4    5    6    7
Key:    [10] [25] [ ]  [40] [ ]  [31] [ ]  [70]

演算法

  • 初始化雜湊表 - 建立一個新的結構體型別 HashTable,其中包含一個名為 table 的型別為 Entry 的切片。此切片將儲存雜湊表中的鍵值對。

  • 建立雜湊函式 - 實現一個雜湊函式,該函式以鍵作為輸入並返回一個表示雜湊值的整數。雜湊函式應將鍵均勻地分佈在雜湊表中,以最大程度地減少衝突。

  • 插入操作 - 將鍵值對插入到第一個可用的空槽中。

  • 查詢操作 - 使用雜湊函式計算雜湊值。

  • 刪除操作 - 使用雜湊函式計算雜湊值。

  • 調整雜湊表大小 - 監控負載因子(元素數量與槽數量的比率)以避免過度衝突。

語法

type HashTable struct{ table []Entry }

語法使用自定義結構體型別實現了帶線性探測的雜湊表。我們定義了一個名為 HashTable 的結構體,表示雜湊表,並聲明瞭一個名為 table 的切片來儲存雜湊表中的條目。

type HashTable map[int]Entry

語法使用 Go 語言中內建的 map 型別實現了帶線性探測的雜湊表。我們定義了一個名為 HashTable 的自定義型別,它本質上是一個具有整數鍵和 Entry 值的 map。Entry 結構體表示鍵值對。

insert(key int, value interface{}) 

語法 insert 用於向資料結構中新增新的鍵值對,其中 key 是一個表示值的唯一識別符號的整數,value 是與該鍵關聯的要儲存的資料。

示例 1

在本例中,我們將使用 Go 語言實現帶線性探測的雜湊表。我們將定義一個結構體 HashTableLinear,其中包含兩個陣列 keys 和 values 來儲存鍵值對。我們將提供從雜湊表插入和檢索元素的方法。

package main

import (
	"fmt"
)

const hashTableSize = 10

type HashTableLinear struct {
	keys   [hashTableSize]int
	values [hashTableSize]interface{}
	size   int
}

func hashFunction(key int) int {
	return key % hashTableSize
}

func (ht *HashTableLinear) insert(key int, value interface{}) {
	index := hashFunction(key)

	for ht.keys[index] != 0 {
		index = (index + 1) % hashTableSize
	}

	ht.keys[index] = key
	ht.values[index] = value
	ht.size++
}

func (ht *HashTableLinear) get(key int) interface{} {
	index := hashFunction(key)

	for ht.keys[index] != key {
		index = (index + 1) % hashTableSize
	}

	return ht.values[index]
}

func main() {
	ht := HashTableLinear{}

	ht.insert(101, "Alice")
	ht.insert(205, "Bob")
	ht.insert(306, "John")
	ht.insert(401, "Sarah")
	ht.insert(502, "Michael")

	fmt.Println("Name for key 205:", ht.get(205))
	fmt.Println("Name for key 401:", ht.get(401))
	fmt.Println("Name for key 306:", ht.get(306))
}

輸出

Name for key 205: Bob
Name for key 401: Sarah
Name for key 306: John

示例 2

在本例中,我們將使用 Go 語言中的 map 實現帶線性探測的雜湊表。線性探測是一種衝突解決技術,如果在插入過程中發生衝突,演算法會順序搜尋雜湊表中的下一個可用槽,直到找到一個空槽。我們將使用 Go 語言中的 map 資料結構來模擬雜湊表。

package main

import (
	"fmt"
)

func main() {
	hashTable := make(map[int]string)

	hashTable[1] = "One"
	hashTable[2] = "Two"
	hashTable[3] = "Three"
	hashTable[4] = "Four"

	fmt.Println("Value for key 1:", hashTable[1])
	fmt.Println("Value for key 3:", hashTable[3])

	if value, exists := hashTable[2]; exists {
		fmt.Println("Key 2 exists with value:", value)
	} else {
		fmt.Println("Key 2 does not exist in the hash table.")
	}

	delete(hashTable, 4)

	if _, exists := hashTable[4]; exists {
		fmt.Println("Key 4 still exists in the hash table.")
	} else {
		fmt.Println("Key 4 is successfully removed from the hash table.")
	}
}

輸出

Value for key 1: One
Value for key 3: Three
Key 2 exists with value: Two
Key 4 is successfully removed from the hash table.

現實生活中的實現

學生資訊系統

考慮一個學校或大學的學生資訊系統,該系統需要有效地管理學生記錄。帶線性探測的雜湊表可以幫助快速儲存和檢索學生資訊。

線上購物車

假設您正在構建一個電子商務網站,並且購物車是其中一個關鍵元件。使用者在瀏覽和購物時會將產品新增到他們的購物車中。為了有效地管理購物車中的商品,帶線性探測的雜湊表可能是一個不錯的解決方案。

結論

雜湊表以其有效儲存和檢索鍵值對的能力而受到推崇,是無數應用程式的基石。在本文中,我們研究瞭如何編寫一個程式來說明使用兩種方法在 Go 語言中實現帶線性探測的雜湊表:一種使用陣列,另一種使用 map。第一種方法使用陣列儲存鍵值對,並使用線性探測技術處理衝突。第二種方法利用 Go 語言的內建 map 資料結構,該結構在內部使用帶線性探測的雜湊表。這些實現提供了有效儲存和檢索鍵值對的方法,使雜湊表成為各種應用程式必不可少的資料結構。

更新於: 2023年9月5日

428 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.