數據結構-哈希表(散列表)

1.基本概念

哈希表(散列表):提高數據的查找效率

哈希存儲:將要存儲的數據的關鍵字和存儲位置之間,建立起對應的關系,
這個關系稱之為哈希函數。存儲數據時,通過對應的哈希函數可以將數據映射到指定的存儲位置;查找時,仍可通過該函數找到數據的存儲位置。

哈希沖突/哈希矛盾:?

key1 != key2

f(key1) == f(key2)

處理哈希沖突的方法:

1)開放地址法:

思想:當發生哈希沖突時,通過探測序列在哈希表中尋找下一個可用的空槽位,直到找到合適的位置插入元素。所有元素都存儲在哈希表本身中(無額外數據結構)。

2)鏈地址法

思想:將哈希表的每個槽位作為鏈表頭節點,沖突的元素直接插入對應槽位的鏈表中。哈希表本身只存儲鏈表的引用。

2.基本操作

(1)哈希函數

int hash_function(char key)
{if (key >= 'a' && key <= 'z'){return key-'a';}else if (key >= 'A' && key <= 'Z'){return key-'A';}else{return HASH_TABLE_MAX_SIZE-1;}
}

(2)創建一個哈希表

  HSNode_t *hash_table[HASH_TABLE_MAX_SIZE] = {NULL};

(3)插入(有序)

int insert_hash_table(HSNode_t **hash_table, Data_type_t data)
{int addr = hash_function(data.name[0]);//申請結點保存數據//頭插//hash_table[addr];   //---->pheadHSNode_t *pnode = malloc(sizeof(HSNode_t));if (NULL == pnode){printf("malloc error\n");return -1;}pnode->data = data;pnode->pnext = NULL;if (NULL == hash_table[addr]){hash_table[addr] = pnode;}else{if (strcmp(pnode->data.name, hash_table[addr]->data.name) <= 0){pnode->pnext = hash_table[addr];hash_table[addr] = pnode;}else{HSNode_t *p = hash_table[addr];while (p->pnext != NULL && (p->pnext->data.name, pnode->data.name) < 0){p = p->pnext;}pnode->pnext = p->pnext;p->pnext = pnode;}}return 0;
}

(4)遍歷

void hash_for_each(HSNode_t **hash_table)
{for (int i = 0; i < HASH_TABLE_MAX_SIZE; ++i){HSNode_t *ptmp = hash_table[i];while (ptmp){printf("%s : %s\n", ptmp->data.name, ptmp->data.tel);ptmp = ptmp->pnext;}printf("\n");}
}

(5)查找

HSNode_t *find_hash_table(HSNode_t **hash_table, char *name)
{int addr = hash_function(name[0]);HSNode_t *ptmp = hash_table[addr];while (ptmp){if (0 == strncmp(ptmp->data.name, name, strlen(name))){return ptmp;}ptmp = ptmp->pnext;}return NULL;
}

(6)銷毀

void destroy_hash_table(HSNode_t **hash_table)
{for (int i = 0;i < HASH_TABLE_MAX_SIZE; i++){HSNode_t *pdel = hash_table[i];while (hash_table[i] != NULL){hash_table[i] = pdel->pnext;free(pdel);pdel = hash_table[i];}}
}

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

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

相關文章

如何在Vue中使用拓撲圖功能

前言 該組件基于 Vue.js 和 AntV G6 構建項目特色功能 1. 豐富的節點圖標支持 本拓撲圖系統的最大特色是支持使用自定義圖片作為節點圖標 2. 智能的力導向布局 系統采用力導向布局算法&#xff0c;能夠自動優化節點位置&#xff0c;避免重疊&#xff0c;形成美觀的網絡拓撲結構…

基于dynamic的Druid 與 HikariCP 連接池集成配置區別

你提供的內容是關于 ??dynamic-datasource-spring-boot-starter?? 的詳細介紹&#xff0c;這是一個非常實用的 ??Spring Boot 多數據源動態切換組件??&#xff0c;適用于需要在單個應用中連接多個數據庫并靈活切換數據源的場景。下面我為你梳理一下該組件的核心信息與使…

算法訓練之棧

???~~~~~~歡迎光臨知星小度博客空間~~~~~~??? ???零星地變得優秀~也能拼湊出星河~??? ???我們一起努力成為更好的自己~??? ???如果這一篇博客對你有幫助~別忘了點贊分享哦~??? ???如果有什么問題可以評論區留言或者私信我哦~??? ??????個人…

OpenAI 最新開源模型 gpt-oss (Windows + Ollama/ubuntu)本地部署詳細教程

OpenAI 最近發布了其首個開源的開放權重模型gpt-oss&#xff0c;這在AI圈引起了巨大的轟動。對于廣大開發者和AI愛好者來說&#xff0c;這意味著我們終于可以在自己的機器上&#xff0c;完全本地化地運行和探索這款強大的模型了。 本教程將一步一步指導你如何在Windows系統上&…

在X86架構Linux中創建虛擬根目錄并下載指定架構(如aarch64)的軟件包(含依賴)

在X86架構Linux中創建虛擬根目錄并下載指定架構(如aarch64)的軟件包(含依賴) 在Linux系統中&#xff0c;有時候我們需要在特定的環境或架構下安裝軟件包&#xff0c;而不影響主系統。一種常見的方法是創建一個虛擬的根目錄&#xff0c;并在此環境中操作。本文將介紹如何通過創建…

scratch筆記和練習-第9課:一起來繪畫

位圖也稱為點陣圖&#xff0c;它是由許許多多的點組成的&#xff0c;這些點被稱為像素。位圖圖像可以表現豐富的多彩變化 并產生逼真的效果&#xff0c;很容易在不同軟件之間交換使用&#xff0c; 但它在保存圖像時需要記錄每一個像素的色彩信息&#xff0c;所以占用的存儲空間…

[linux] Linux:一條指令更新DDNS

Linux&#xff1a;一條指令更新DDNS 在動態IP環境下&#xff0c;如何確保我們的域名始終指向正確的公網IP地址&#xff1f;動態DNS&#xff08;DDNS&#xff09;服務為我們提供了完美的解決方案。今天&#xff0c;我將分享一個簡潔高效的Linux命令行指令&#xff0c;用于自動更…

[激光原理與應用-182]:測量儀器 - 光束型 - 光束質量分析儀

光束質量分析儀是用于精確評估激光光束特性的核心設備&#xff0c;通過測量光束的強度分布、相位分布、發散角等參數&#xff0c;為激光系統的優化、加工工藝控制及科研實驗提供關鍵數據支持。以下是光束質量分析儀的詳細解析&#xff1a;一、核心功能 - 光束強度分布分析測量內…

Linux 限制 root 登錄 IP 地址的方法

Linux 限制 root 登錄 IP 地址的方法Linux 限制 root 登錄 IP 地址的方法方法一&#xff1a;修改 SSH 配置文件方法二&#xff1a;使用 hosts.allow 和 hosts.deny 文件方法三&#xff1a;使用防火墻規則方法四&#xff1a;使用 access.conf 文件注意事項Linux 限制 root 登錄 …

Word中怎樣插入特殊符號

使用 “插入” 菜單&#xff1a;插入常用符號&#xff1a;將光標置于要插入符號的位置&#xff0c;點擊 “插入” 選項卡&#xff0c;在 “符號” 組中點擊 “符號” 按鈕&#xff0c;會彈出一個符號庫&#xff0c;里面包含了常見的標點符號、特殊字符等&#xff0c;找到所需符…

Linux 內核發包流程與路由控制實戰

Linux 內核發包流程與路由控制實戰 在網絡調優、性能優化、SDN、NFV、容器網絡等場景下&#xff0c;理解 Linux 內核發包路徑和路由控制機制是必修課。 本文將從內核網絡棧的原理入手&#xff0c;再結合 iproute2 命令和 策略路由給出實戰案例。一、Linux 內核發包流程&#xf…

點播服務器

早期的時候&#xff0c;用 live555 作為 rtsp 點播服務器&#xff1b;現在比較常用的 流媒體服務器比較多&#xff1b;這里比較簡單的&#xff0c;可以用 ZLMediakit&#xff1b;可以支持 ffmeg 退流 到ZLMediakit&#xff0c;然后別的客戶端從 ZLMediakit 服務器拉流&#xff…

分享超圖提供的、很不錯的WebGIS學習資源

最近在學習了解Supermap iclient&#xff0c;發現官方提供的幫助文檔、GIS學堂真的不錯&#xff0c;解釋了很多的內容。 官方modern-web-gis-in-action文檔的網址如下&#xff1a;https://iclient.supermap.io/web/books/modern-web-gis-in-action/&#xff0c;在其中介紹了現代…

通信算法之298: verilog語法generate和for介紹

在 Verilog 中&#xff0c;generate和for是實現參數化設計和模塊實例化復用的重要工具&#xff0c;尤其在需要根據參數動態生成邏輯時非常有用。以下是它們的使用方法和區別&#xff1a;1. for循環&#xff08;過程塊內&#xff09;for循環主要用于過程塊&#xff08;always/in…

laravel在cli模式下輸出格式漂亮一些

在 Laravel 的 CLI 模式下&#xff0c;可以通過以下方式讓命令行輸出更加美觀和專業&#xff1a; 1. 使用 Artisan 輸出助手方法 Laravel 提供了多種輸出樣式方法&#xff1a; public function handle() {// 基礎樣式$this->info(成功信息 - 綠色); // 綠色$this->err…

大數據管理與應用學什么?就業前景怎么樣?

前言在數字經濟蓬勃發展的今天&#xff0c;大數據已經成為推動社會進步的核心生產要素。大數據管理與應用作為新興交叉學科&#xff0c;正受到越來越多學生和企業的關注。本文將全面剖析該專業的課程體系、核心技能要求&#xff0c;詳細介紹CDA數據分析師認證的備考策略&#x…

mac筆記本如何重新設置ssh key

要在Mac上重新生成SSH密鑰并將其添加到平臺&#xff0c;可以按照以下步驟操作&#xff1a; 打開終端 在Mac上&#xff0c;你可以通過Spotlight搜索&#xff08;按Command Space&#xff09;輸入Terminal來打開終端或者直接搜索終端檢查現有SSH密鑰 首先&#xff0c;檢查是否已…

Godot ------ 通過鼠標對節點進行操作

Godot ------ 通過鼠標對節點進行操作 引言 正文 引言 對于一個游戲,通過鼠標對游戲對象進行操作是非常普遍的行為,本文我們將以 Control 節點進行舉例,說明如何通過鼠標對 Control 節點進行移動操作。 正文 首先,我們創建一個 Contorl 節點,并將它的 Layout->Trans…

k8s 網絡插件 flannel calico

一、k8s 網絡概述 Kubernetes網絡是指在Kubernetes集群中不同組件之間進行通信和交互的網絡架構&#xff0c;每個容器都有自己的IP地址&#xff0c;這些容器組成了Pod&#xff0c;Pod是Kubernetes調度的最小單元。 Pod是Kubernetes中最小的部署單元&#xff0c;每個Pod都有一個…

易美教育榮膺“騰訊年度影響力國際教育品牌”雙獎加冕,見證中國國際教育力量的崛起

【騰訊新聞&#xff0c;北京訊】在剛剛圓滿落幕的“回響中國”騰訊新聞教育頻道年度論壇上&#xff0c;國際教育領域迎來了高光時刻&#xff1a;以美國華爾街為總部、深耕國際教育十余年的易美教育&#xff08;Easymay&#xff09;&#xff0c;憑借其持續創新的教育模式、國際化…