數據結構——Hash Map

1. Hash Map簡介

????????Hash Map是一種基于鍵值對的數據結構,通過散列函數將鍵映射到存儲位置,實現快速的數據查找和存儲。它可以在常數時間內完成查找、插入和刪除操作,因此在需要頻繁進行這些操作時非常高效。

2. Hash Map的定義

????????散列表(Hash table,也叫哈希表)是一種根據鍵(Key)直接訪問內存存儲位置的數據結構。通過計算一個鍵值的函數,將數據映射到表中的一個位置,以加快查找速度。這個映射函數稱為散列函數,存放記錄的數組稱為散列表。

3. 為什么要使用Hash Map?

????????理想的搜索方法是不經過任何比較,一次直接從表中得到要搜索的元素,即查找的時間復雜度為 O(1)。哈希表通過哈希函數將元素的存儲位置與其關鍵碼之間建立一種映射關系,從而實現快速查找。

4. 鍵值對

????????鍵值對是一種常見的數據結構,用于表示兩個相關聯的數據項:一個是“鍵”(Key),另一個是“值”(Value)。鍵用于標識和查找與之關聯的值。鍵值對在許多編程語言中都有特定的表示方法,例如C++的std::pair和Python的字典(dictionary)。

????????python

dictionary = {"name": "Alice", "age": 30}

????????在C++中:

std::pair<std::string, int> person("Alice", 30);

5. Hash Map的基本實現

????????通過一個簡單的數學公式實現Hash Map:

????????假設有數據集合 {1, 7, 6, 4, 5, 9},哈希函數為:hash(key) = key % capacity,其中capacity為10。存儲位置如下:

- 1 -> 1
- 7 -> 7
- 6 -> 6
- 4 -> 4
- 5 -> 5
- 9 -> 9

6. 哈希沖突

????????如果插入元素66,會與元素6沖突,因為它們的哈希地址相同(都是6)。哈希沖突是指不同關鍵字通過相同哈希函數計算出相同哈希地址的現象。為了避免沖突,需要設計合理的哈希函數。

7. 改進哈希函數

????????哈希函數設計原則包括:

????????哈希函數的定義域必須包括需要存儲的全部關鍵碼。

????????哈希函數計算出來的地址能均勻分布在整個空間中。

????????哈希函數應該比較簡單。

????????常用哈希函數設計方法:

????????1. 直接定址法:Hash(Key) = A * Key + B

????????2. 除留余數法:Hash(key) = key % p (p <= m)

????????3. 平方取中法:假設關鍵字為1234,對其平方得到1522756,取中間的3位227作為哈希地址。

????????4. 折疊法:將關鍵字分割成幾部分,將這些部分疊加求和,取后幾位作為哈希地址。

????????5. 隨機數法:選擇一個隨機函數,取關鍵字的隨機函數值為其哈希地址。

8. 解決哈希沖突的方法

????????解決哈希沖突的兩種常見方法是閉散列和開散列。

8.1 閉散列(開放定址法)

????????當發生哈希沖突時,將元素存放到沖突位置的下一個空位置中。

????????線性探測:從沖突位置開始,依次向后探測,直到找到下一個空位置。

????????查找公式:hashi = hash(key) % N + i(i = 0, 1, 2, 3, ...)

????????二次探測:為了避免線性探測中的堆積問題,使用平方探測法。找下一個空位置的方法為:hashi = hash(key) % N + i^2(i = 1, 2, 3, 4 ...)

8.2 開散列(鏈地址法)

????????將具有相同地址的元素歸于同一桶,桶中的元素通過單鏈表鏈接起來。哈希桶的極端情況是所有元素都產生沖突,最終都放入一個桶中,此時效率退化為 O(N)。

????????可以將桶中的鏈表結構改為紅黑樹結構,以提高效率。在JDK1.7中,HashMap由數組和鏈表組成;在JDK1.8中,引入了紅黑樹,當鏈表超過8且數組長度超過64時,鏈表會轉換為紅黑樹,以提高性能。

9. 閉散列實現

????????以下是閉散列法的具體實現代碼:

????????在python中

class ClosedHashMap:def __init__(self, capacity):self.capacity = capacityself.table = [None] * capacitydef hash_function(self, key):return key % self.capacitydef insert(self, key, value):index = self.hash_function(key)while self.table[index] is not None:index = (index + 1) % self.capacityself.table[index] = (key, value)def search(self, key):index = self.hash_function(key)while self.table[index] is not None:if self.table[index][0] == key:return self.table[index][1]index = (index + 1) % self.capacityreturn Nonedef delete(self, key):index = self.hash_function(key)while self.table[index] is not None:if self.table[index][0] == key:self.table[index] = Nonereturn Trueindex = (index + 1) % self.capacityreturn False

10. 開散列實現

????????以下是開散列法的具體實現代碼:

????????在python中

class Node:def __init__(self, key, value):self.key = keyself.value = valueself.next = Noneclass OpenHashMap:def __init__(self, capacity):self.capacity = capacityself.table = [None] * capacitydef hash_function(self, key):return key % self.capacitydef insert(self, key, value):index = self.hash_function(key)if self.table[index] is None:self.table[index] = Node(key, value)else:current = self.table[index]while current.next is not None:current = current.nextcurrent.next = Node(key, value)def search(self, key):index = self.hash_function(key)current = self.table[index]while current is not None:if current.key == key:return current.valuecurrent = current.nextreturn Nonedef delete(self, key):index = self.hash_function(key)current = self.table[index]prev = Nonewhile current is not None:if current.key == key:if prev is None:self.table[index] = current.nextelse:prev.next = current.nextreturn Trueprev = currentcurrent = current.nextreturn False

????????這些實現展示了如何通過不同的方法來解決哈希沖突,確保Hash Map能夠高效地插入和查找元素。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/39007.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39007.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/39007.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計組_程序的機器級代碼表示

2024.06.13&#xff1a;計算機組成原理程序的機器級代碼表示 第15節 程序的機器級代碼表示 5.1 x86的匯編指令格式5.2 常用指令 眼熟最基礎的匯編語法和助記符即可 5.1 x86的匯編指令格式 5.2 常用指令

WinSCP 登錄跳板機

使用 WinSCP 登錄跳板機&#xff08;跳板機是一種中間服務器&#xff0c;用于安全連接到其他服務器&#xff09;需要進行一些配置。這里是一個簡單的步驟指南&#xff1a; 準備工作 下載和安裝 WinSCP&#xff1a;如果你還沒有 WinSCP&#xff0c;可以從 WinSCP 官方網站 下載…

DeepMind的新論文,長上下文的大語言模型能否取代RAG或者SQL這樣的傳統技術呢?

長上下文大型語言模型&#xff08;LCLLMs&#xff09;確實引起了一些關注。這類模型可能使某些任務的解決更加高效。例如理論上可以用來對整本書進行總結。有人認為&#xff0c;LCLLMs不需要像RAG這樣的外部工具&#xff0c;這有助于優化并避免級聯錯誤。但是也有許多人對此持懷…

【PYG】簡單分析 Cora 數據集的文件 cora.cites 和 cora.content

手動下載 Cora 數據集的文件 cora.cites 和 cora.content 后&#xff0c;你可以通過以下步驟將它們加載到 Python 環境中&#xff0c;并使用 PyTorch Geometric 或其他工具進行進一步處理和分析。 數據集文件說明 cora.cites: 包含了論文之間的引用關系。每一行表示一條引用關…

WPF對象樣式

基本樣式設置 Style 設置指定對象的屬性 屬性&#xff1a; TargetType 引用在哪個類型上面&#xff0c;例如Button、Textblock。。 如果在控件對象里面設置Style&#xff0c;則TargetType必須指定當前控件名 只在作用域里面有效果&#xff0c;其他的相同控件沒有影響&…

統一的可觀察性和安全性如何增強你的業務?

作者&#xff1a;來自 Elastic Michael Calizo 利用人工智能、異常檢測和增強攻擊發現功能&#xff0c;在一個平臺上增強組織的可觀察性和安全性能力 當今數字環境中的組織越來越關注服務可用性&#xff0c;并保護其軟件免受惡意篡改和攻擊。傳統的安全和可觀察性工具通常以孤…

VBA打開其他Excel文件

前言 本節會介紹通過VBA實現打開其他excel文件&#xff0c;包括模糊匹配文件名稱、循環同時打開多個文件&#xff0c;并獲取工作表及工作簿進行數據操作后&#xff0c;對打開的文件進行保存并關閉操作。 一、打開固定文件名稱的文件 場景說明&#xff1a; 1.新建一個宏文件VBA…

通過Python將視頻添加圖片

from PIL import Image from moviepy.editor import *from configs.settings import PROJECT_PATHdef movie_add_image(video_config, type, video_path, out_path):# 加載視頻文件video VideoFileClip(video_path)all_time 0for config in video_config:image config.get(t…

【NFS】【部署】NFS文件系統Server端部署,及客戶端掛載

服務器準備 主機名IPk8s04192.168.199.24k8s05192.168.199.25 配置husts文件 vi /etc/hosts #追加 192.168.199.24 k8s04 192.168.199.25 k8s05Server端部署 yum install -y nfs-utils創建NFS存儲目錄 mkdir /data配置NFS服務 vi /etc/exports #添加 /data 192.168.…

【React】上傳文章封面基礎實現

<Form.Item label"封面"><Form.Item name"type"><Radio.Group onChange{onTypeChange}><Radio value{1}>單圖</Radio><Radio value{3}>三圖</Radio><Radio value{0}>無圖</Radio></Radio.Group&…

react 自定義 年-月-日 組件,單獨選擇年、月、日,并且產生聯動

自定義 年-月-日 組件 code import { useState } from react function Year_Month_Date() {const [yearList, setYearList] useState([])const [monthList, setMonthList] useState([])const [dateList, setDateList] useState([])const [currentYear, setCurrentYear] u…

javaweb(四)——過濾器與監聽器

文章目錄 過濾器Filter基本概念濾波器的分類: 時域和頻域表示濾波器類型1. 低通濾波器(Low-Pass Filter)2. 高通濾波器(High-Pass Filter)3. 帶通濾波器(Band-Pass Filter)4. 帶阻濾波器(Band-Stop Filter) 濾波器參數1. 通帶頻率(Passband Frequency)2. 截止頻率(Cutoff Frequ…

【Kotlin】Kotlin 基礎語法指南

人不走空 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌賦&#xff1a;斯是陋室&#xff0c;惟吾德馨 目錄 &#x1f308;個人主頁&#xff1a;人不走空 &#x1f496;系列專欄&#xff1a;算法專題 ?詩詞歌…

dell g15機器awcc刪除后無法重新安裝

那是因為注冊表并沒有刪除干凈&#xff0c;需要手動刪除&#xff0c;但是普通小白又沒有時間進行手動刪除&#xff0c; 這個個時候就需要微軟的刪除工具的幫忙了. 微軟軟件刪除工具&#xff1a;修復阻止程序安裝或刪除的問題 - Microsoft 支持

Android的activity廣播無法接收,提示process gone or crashing原因有可能是那些?

當Android的Activity無法接收廣播&#xff0c;并且收到“process gone or crashing”的提示時&#xff0c;可能的原因有多種。以下是一些常見的原因和排查步驟&#xff1a; Activity生命周期問題&#xff1a; 如果Activity在廣播發送之前就已經被銷毀&#xff08;例如&#xf…

vue3 elementplus Springboot 課程購買系統案例源碼

系統演示 項目獲取地址 Springboot vue3 elementplus 課程購買系統案例源碼 附帶系統演示&#xff0c;環境搭建教程,開發工具 技術棧:SpringBoot Vue3 ElementPlus MybatisPlus 開發工具:idea 后端構建工具:Maven 前端構建工具:vite 運行環境:Windows Jdk版本:1.8 Nod…

《昇思25天學習打卡營第04天|數據集Dataset》

數據集 環境準備 # 實驗環境已經預裝了mindspore2.2.14&#xff0c;如需更換mindspore版本&#xff0c;可更改下面mindspore的版本號 !pip uninstall mindspore -y !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore2.2.14 import numpy as np from mindsp…

基于Tools體驗NLP編程的魅力

大模型能理解自然語言&#xff0c;從而能解決問題&#xff0c;但是就像人類大腦一樣&#xff0c;大腦只能發送指令&#xff0c;實際行動得靠四肢&#xff0c;所以LangChain4j提供的Tools機制就是大模型的四肢。 大模型的不足 大模型在解決問題時&#xff0c;是基于互聯網上很…

Tomcat部署與優化

Tomcat部署與優化 Tomcat簡述 server&#xff1a; 服務器&#xff0c;Tomcat運行的進程實例&#xff0c;一個Server中可以有多個service&#xff0c;但通常就一個 service&#xff1a;服務&#xff0c;用來組織Engine&#xff08;引擎&#xff09;和Connector&#xff08;連接…

gdb及其使用

gdb調試一&#xff1a; 首先進入gdb&#xff0c;確定好進程&#xff0c;輸入進程號 確定要調試哪個文件&#xff0c;然后輸入&#xff1a;&#xff08;b為打斷點&#xff09; (gdb) b serialization_protobuffer.h:write<ros::serialization::OStream>(ros::serializat…