[數據結構]#7 哈希表

哈希表(Hash Table),有時也稱為散列表,是一種數據結構,它提供了一種快速存取數據的方法。哈希表利用一個被稱為哈希函數的機制將鍵映射到表中的一個位置來直接訪問記錄,以此加快查找的速度。哈希表通常支持非常快的插入、刪除和查找操作,平均情況下這些操作的時間復雜度為O(1)。

基本概念

鍵(Key):

用于唯一標識哈希表中每個元素的值。

值(Value):

與鍵關聯的數據或信息。

哈希函數(Hash Function):

用于計算給定鍵的哈希碼,從而確定該鍵值對在哈希表中的存儲位置。

沖突(Collision):

當兩個不同的鍵通過哈希函數得到相同的哈希碼時,這種情況稱為沖突。解決沖突是設計哈希表時必須考慮的問題。

發生沖突時的解決策略

鏈地址法(Chaining):

使用鏈表存儲具有相同哈希值的所有元素。因此,每個桶實際上是一個鏈表,包含所有被哈希到同一個索引的元素。

開放地址法(Open Addressing):

當發生沖突時,尋找下一個空位來存儲這個鍵值對。常見的技術包括線性探測、二次探測和雙重哈希等。


哈希表的操作

插入:

根據鍵計算出哈希值,并將其對應的值存入哈希表中。如果存在沖突,則按照所選的沖突解決策略處理。

查找:

根據鍵計算出哈希值,然后從相應的槽中找到對應的值。若采用鏈地址法,還需遍歷鏈表;若采用開放地址法則可能需要沿著探查序列搜索。

刪除:

首先查找要刪除的鍵,然后移除它。在開放地址法中,刪除后可能還需要重新組織哈希表以保持其正確性。

示例代碼:

//哈希表#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int DATATYPE;
typedef struct
{DATATYPE* head;int tlen;
} HSTABLE;HSTABLE* CreateHSTable(int n)
{HSTABLE* hs = malloc(sizeof(HSTABLE));if(NULL == hs){fprintf(stderr,"CreateHSTable malloc");return NULL;}hs->head = malloc(sizeof(DATATYPE)*n);if(NULL == hs->head){fprintf(stderr,"CreateHSTable malloc");return NULL;}hs->tlen = n;for(int i=0; i<n;i++) //給數組設置初值{hs->head[i] = -1;}return hs;}int HSFun(HSTABLE* hs,DATATYPE* dat)
{return *dat %hs->tlen;
}int HS_Insert(HSTABLE* hs, DATATYPE* dat)
{int idx = HSFun(hs,dat);while(hs->head[idx]!=-1)  //判斷當前位置是否是空閑{printf("沖突 idx:%d num:%d\n",idx, *dat);idx= (idx+1) %hs->tlen;}hs->head[idx] = *dat;return 0;
}int HS_Search(HSTABLE* hs, DATATYPE* dat)
{int idx = HSFun(hs,dat);int old_idx = idx;while(hs->head[idx] != *dat){idx= (idx+1) %hs->tlen;if(old_idx == idx){return -1;}}return idx;return 0;
}int DestroyHS(HSTABLE* hs)
{free(hs->head);free(hs);return 0;
}DATATYPE *GetItemHSTable(HSTABLE* hs,int idx) //5 0-4
{if(idx<0 || idx > hs->tlen-1){return NULL;}return &hs->head[idx];
}int main(int argc, char** argv)
{int array[12]={12,67,56,16,25,37,22,29,15,47,48,34};HSTABLE* hs = CreateHSTable(12);for(int i = 0 ;i<12 ;i++){HS_Insert(hs, &array[i]);}int want_num = 35;int ret = HS_Search(hs, &want_num);if(-1 == ret){printf("cant find %d\n",want_num);}else  {printf("find it , idx:%d num:%d\n",ret,*GetItemHSTable(hs, ret));}// system("pause");return 0;
}

優缺點

優點:

平均時間復雜度為O(1),非常適合用于快速查找。
空間利用率高,適合大規模數據集。

缺點:

在最壞的情況下(如所有元素都被哈希到同一個桶),查找時間復雜度可能會退化至O(n)。
需要額外的空間來處理沖突。
不同類型的哈希函數對于不同類型的數據表現不同,選擇合適的哈希函數至關重要。

應用場景

哈希表廣泛應用于各種領域,比如數據庫系統中的快速查找、編譯器設計中的符號表管理、緩存實現以及算法設計中的集合、圖表示等。由于其實現簡單且效率高,在實際編程中也是常用的數據結構之一。例如,在Python中,字典(dictionary)就是基于哈希表實現的;在Java中,HashMap也是一個典型的哈希表實現。

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

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

相關文章

C++ 23種設計模式-工廠模式

工廠模式是一種創建型的設計模式&#xff0c;他提供了一種創建對象的最佳方式&#xff0c;而無需指定將要創建對象的具體類。包括&#xff1a;簡單工廠模式、工廠方法模式、抽象工廠模式。簡單工廠模式組成成員&#xff1a;抽象產品類、具體產品類 A、B、C等、工廠類工作原理&a…

vue3 el-table 行的某個特定值來決定某些列是否顯示

在 Vue 3 中使用 Element Plus 的 <el-table> 組件時&#xff0c;如果你想要根據行的某個特定值來決定某些列是否顯示&#xff0c;你可以通過自定義列渲染函數&#xff08;render 函數&#xff09;來實現這一需求。下面是一個如何實現該功能的步驟說明和示例代碼。步驟 1…

電商數據采集API與爬蟲技術結合的全網比價方案

一、技術選型與工具準備API優先策略官方API接入&#xff1a;京東、淘寶、拼多多等平臺提供商品詳情API&#xff0c;需注冊開發者賬號獲取API Key。例如&#xff1a;京東API支持實時獲取商品價格、庫存、評價數據。淘寶API通過RESTful接口返回JSON格式的商品信息&#xff0c;需O…

Socket詳解

一.定義Socket&#xff08;套接字&#xff09;是網絡編程的核心&#xff0c;它允許不同主機或同一主機的不同進程之間進行通信&#xff0c;Socket API 提供了一套標準的接口&#xff0c;支持 TCP、UDP、IP 等協議分為以下三個類型&#xff1a;SOCK_STREAM: 用于tcp協議&#xf…

如何實現打印功能

一、AI賦能提供思路基本框架<!-- 隱藏的打印內容&#xff08;默認不顯示&#xff09; --> <div id"print-container" style"display: none;"><h1>退貨單打印內容</h1><table><!-- 打印專用的表格結構 --></table&g…

Android 架構演進:從 MVC 到 MVVM 的設計之道

在 Android 開發初期&#xff0c;很多開發者會把所有邏輯塞進 Activity—— 網絡請求、數據處理、UI 更新全堆在一起&#xff0c;導致代碼超過數千行&#xff0c;改一個按鈕點擊都要翻半天。這種 “面條式代碼” 的根源是缺乏架構設計。隨著應用復雜度提升&#xff0c;MVC、MVP…

使用 gh-pages 將 next.js15 靜態項目部署到 github pages

以下我使用 next.js15 寫的 Todo List 為例,假設我們本地已經存在一個 next.js15 的 Todo List 項目。 說明:解決了項目部署到 github pages 后訪問不到 css、js、字體以及訪問不到 public 目錄下的圖片問題。 第一步 安裝 gh-pages: npm i gh-pages第二步 在 public 目…

rename系統調用及示例

21. rename - 重命名文件或目錄 函數介紹 rename系統調用用于重命名文件或目錄&#xff0c;也可以將文件或目錄移動到另一個位置。如果目標文件已存在&#xff0c;則會被替換。 函數原型 #include <stdio.h>int rename(const char *oldpath, const char *newpath);功能 將…

PHP框架之Laravel框架教程:3. 數據庫操作(簡要)

3. 數據庫操作&#xff08;簡要&#xff09; 配置 數據庫的配置文件在 config/database.php 文件中&#xff0c;你可以在這個文件中定義所有的數據庫連接配置&#xff0c;并指定默認的數據庫連接。這個文件中提供了大部分 Laravel 能夠支持的數據庫配置示例。 mysql > [driv…

項目七.AI大模型部署

環境準備此處使用的是rock linux8.9操作系統k8s集群三個設備&#xff0c;使用centos7.9操作系統設備配置##上傳ollama工具的壓縮包 [rootproject ~]# ll total 1497732 -rw-r--r-- 1 root root 1533674176 Jul 21 11:27 ollama-linux-amd64.tgz [rootproject ~]# tar -C /usr -…

Oracle 19C RU 19.28 升級和安裝

背景介紹 概述 本次升級包括安全漏掃中所有19c數據庫,漏掃預警版本19.3到19.27各個版本,數據庫需要升級至19.28版本滿足安全要求。 原端19C 升級目標端19.28 db_name racdb racdb ORACLE_SID racdb1/2 racdb1/2 ORACLE_HOME GI:/oracle/asm DB:/oracle/db GI:/orac…

嵌入式學習日志————對射式紅外傳感器計次

前言這是第二次學習這部分內容了&#xff0c;第一次是大一上學期&#xff0c;因為大二下忙著其他事一直沒來得及吧STM32學完&#xff0c;所以假期從頭開始再學&#xff0c;比第一次也有了更深的理解&#xff0c;以下內容均是看【STM32入門教程-2023版 細致講解 中文字幕】https…

ONLYOFFICE深度解鎖系列.13-如何復制、重新排序 PDF 頁面:onlyoffice 9.0.3 新功能

在處理合同、講義、研究資料或掃描文檔時&#xff0c;保持頁面順序井然尤為重要。有時文件頁數繁多、排序混亂或缺少邏輯&#xff0c;這不僅影響閱讀體驗&#xff0c;也不利于后續使用或分享。好消息是&#xff0c;借助 ONLYOFFICE PDF 編輯器&#xff0c;您可以輕松拖拽頁面&a…

vue遞歸樹形結構刪除不符合數據 生成一個新數組

首先看一下數據結構&#xff08;我的是路由菜單&#xff09;{"code": 200,"message": "請求成功!","success": true,"data": [{"startDate": null,"endDate": null,"createTime": "2023…

【機器學習之推薦算法】基于K最近鄰的協同過濾推薦與基于回歸模型的協同過濾推薦

基于K最近鄰的協同過濾推薦 基于K最近鄰的協同過濾推薦其實本質上就是MemoryBased CF&#xff0c;只不過在選取近鄰的時候&#xff0c;加上K最近鄰的限制。 這里我們直接根據MemoryBased CF的代碼實現 修改以下地方 class CollaborativeFiltering(object):based Nonedef __ini…

望言OCR視頻字幕提取2025終極評測:免費版VS專業版提全方位對比(含免費下載)

大家好&#xff0c;歡迎來到程序視點&#xff01;我是你們的老朋友.小二&#xff01;一、產品定位&#xff1a;AI時代的視頻字幕處理專家望言OCR作為專業的視頻硬字幕提取工具&#xff0c;在AI視頻處理領域占據重要地位。最新評測顯示&#xff0c;其免費版本依然保持著驚人的97…

Matplotlib(二)- Matplotlib簡單繪圖

文章目錄一、pyplot模塊介紹二、Matplotlib簡單繪圖1. 繪制折線圖1.1 折線圖介紹1.2 plt.plot()函數介紹1.3 繪制簡單折線圖1.3.1 繪制單條折線圖1.3.2 繪制多條折線圖1.4 示例&#xff1a;繪制天氣氣溫折線圖2. 繪制柱形圖2.1 柱形圖介紹2.2 plt.bar()函數介紹2.3 繪制柱形圖2…

【世紀龍科技】數字化技術解鎖新能源汽車電驅動總成裝調與檢修

隨著新能源汽車產業加速升級&#xff0c;電驅動總成裝調與檢修技術已成為職業院校汽車專業教學的核心挑戰。傳統實訓模式面臨設備投入高、更新周期長、高壓操作安全隱患多、教學與產業需求脫節等現實問題&#xff0c;導致學生實踐能力培養滯后于行業發展。如何通過數字化手段突…

springboot基于Java與MySQL庫的健身俱樂部管理系統設計與實現

用戶&#xff1a;注冊&#xff0c;登錄&#xff0c;健身教練&#xff0c;健身課程&#xff0c;健身器材&#xff0c;健身資訊&#xff0c;課程報名管理&#xff0c;教練預約管理&#xff0c;會員充值管理&#xff0c;個人中心管理員&#xff1a;登錄&#xff0c;個人中心&#…

如何修改debian的ip地址

編輯配置文件&#xff1a; sudo nano /etc/network/interfaces修改內容&#xff08;示例將 eth0 設為靜態IP&#xff09;&#xff1a; auto eth0 iface eth0 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 8.8.8.8 8.8.4.4 #…