哈希表——C語言

哈希表(Hash Table)是一種高效的數據結構,能夠在平均情況下實現常數時間的查找、插入和刪除操作。

????????哈希表的核心是哈希函數,哈希函數是一個將輸入數據(通常稱為“鍵”或“key”)轉換為固定長度的整數的函數。這個整數通常用作哈希表(Hash Table)中的索引,用于快速查找數據。本質上就是根據輸入的值確定值的位置。

例如,輸入除以10取余是位置編號:

int HashPosFind(int num) {return num % 10;
}

如果有重復的情況呢,那么要在其他位置存儲,有不同的方法,這里采取的是鏈表法。

如圖所示,如果序號為1的地址處已經有值存在,那么我們就把新的數連接到鏈表上。

首先我們可以寫出類似于這樣的函數:

#define NUM 10
#define Nan -32767
typedef struct Seqlist {struct Seqlist* next;int val;
}Seqlist;typedef struct HashList {int num;Seqlist** list;
}HashList;
HashList* HashInit() {HashList* H = (HashList*)malloc(sizeof(HashList));H->num = 0;H->list = (Seqlist**)malloc(sizeof(Seqlist*) *NUM);for (int i = 0; i < NUM; i++) {H->list[i] = (Seqlist*)malloc(sizeof(Seqlist));H->list[i]->next = NULL;}for (int i = 0; i < NUM; i++) {H->list[i]->val = Nan;}return H;
}

1.首先定義NUM表示一共有十個位置定義鏈表,定義Nan表示沒有數的時候的數值。
2.然后定義哈希表的結構,用二級指針的方法模擬二維數組,準確的說是二維鏈表。
3.接著為哈希表開辟空間,先為10個鏈表指針開辟二級指針(指針數組),接著在為每個序列號指針開辟空間并且初始化為Nan表示此時哈希表為空。

????????接著就是哈希表插入操作,這里要考慮兩種情況,第一是當取得地址序列號之后,此時的鏈表存儲的是Nan,那我們要先把鏈表的Nan賦值為插入的數據,然后新創建一個節點存儲Nan表示鏈表的結尾。
????????第二種情況的是第一個數值不是Nan,這時要一直找到鏈表的尾,然后同樣執行上一步的操作:先賦值為插入的數值,然后更新鏈表的尾。

代碼如下:

void HashPush(int val,HashList* H) {int pos = HashPosFind(val);if (H->list[pos]->val == Nan) {H->list[pos]->val = val;Seqlist* new_node = (Seqlist*)malloc(sizeof(Seqlist));new_node->val = Nan;new_node->next = NULL;H->list[pos]->next = new_node;}else {printf("重新插入中\n");int num = 1;Seqlist* cur = H->list[pos];while (cur->val != Nan) {cur = cur->next;}Seqlist* new_node = (Seqlist*)malloc(sizeof(Seqlist));new_node->val = Nan;new_node->next = NULL;cur->next = new_node;cur->val = val;}
}

????????首先是第一種情況,因為是Nan所以說明此時的鏈表為空,所以直接存儲,然后開辟一個新的節點存儲Nan表示鏈表的結尾。

????????第二種情況說明已經有值存在,這時先找到鏈表的尾(找到節點值為Nan的節點),然后執行和第一步一樣的操作:先存儲值,然后新開辟一個節點存儲Nan。

????????最后是打印函數:思路比較簡單,一直打印到Nan為止。

void HashPrint(HashList* H) {for (int i = 0; i < NUM; i++) {printf("%d: ",i);Seqlist* cur = H->list[i];while (cur->val != Nan) {printf("%d ", cur->val);cur = cur->next;}printf("\n");}
}

這就是文章的全部的內容了,希望對你有所幫助,如有錯誤歡迎指出。

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

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

相關文章

Efficient Contrastive Learning for Fast and Accurate Inference on Graphs

發表于:ICML24 推薦指數: #paper/??? 創新點一顆星,證明三顆星(證明的不錯,值得借鑒,但是思路只能說還行吧) 如圖, 本文采取的創新點就是MLP用原始節點,GCN用鄰居節點的對比學習.這樣,可以加快運算速度 L E C L ? 1 ∣ V ∣ ∑ v ∈ V 1 ∣ N ( v ) ∣ ∑ u ∈ N ( v )…

一篇文章Scala語言入門

Scala是一種現代編程語言&#xff0c;它結合了面向對象編程和函數式編程的特性&#xff0c;使得編寫簡潔、可擴展和高效的代碼成為可能。 1. 什么是Scala&#xff1f; Scala&#xff08;Scalable Language&#xff09;是一種面向對象和函數式編程語言。它運行在JVM&#xff0…

k8s 部署 springboot 項目內存持續增長問題分析解決

寫在前面 工作中遇到&#xff0c;請教公司前輩解決&#xff0c;簡單整理記憶博文內容涉及一次 GC 問題的分析以及解決理解不足小伙伴幫忙指正 &#x1f603;,生活加油 99%的焦慮都來自于虛度時間和沒有好好做事&#xff0c;所以唯一的解決辦法就是行動起來&#xff0c;認真做完…

語音識別FBank特征提取學習筆記

語音識別就是把一段語音信號轉換成對應的文本信息&#xff0c;這一過程包括四個大的模塊&#xff0c;分別是&#xff1a;特征提取、聲學模型、語言模型、字典與解碼。 本篇就來梳理一下特征提取模塊的實現思路和方法。 常用的語音特征有&#xff1a; 梅爾頻率倒譜系數&#x…

學生管理系統(通過順序表,獲取連續堆區空間實現)

將學生的信息&#xff0c;以順序表的方式存儲&#xff08;堆區&#xff09;&#xff0c;并且實現封裝函數 &#xff1a; 1】順序表的創建&#xff0c; 2】判滿、 3】判空、 4】往順序表里增加學生信息、 5】遍歷學生信息 6】任意位置插入學生信息 7】任意位置刪除學生信…

0301STM32GPIO外設輸出

STM32GPIO外設輸出 STM32內部的GPIO外設GPIO簡介基本結構GPIO位結構輸入部分&#xff1a;輸出部分&#xff1a; GPIO八種工作模式浮空/上拉/下拉輸入模擬輸入開漏/推挽輸出復用開漏/推挽輸出 手冊寄存器描述GPIO功能描述外設的GPIO配置GPIO寄存器描述端口輸入數據寄存器端口輸出…

QT入門筆記-自定義控件封裝 30

具體代碼如下: QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. #DEFINES QT_DISABLE_DEPRECATED_BEFORE0x060000 …

并查集(還有反集也在)

一.定義 定義&#xff1a; 并查集是一種樹型的數據結構&#xff0c;用于處理一些不相交集合的合并及查詢問題&#xff08;即所謂的并、查&#xff09;。比如說&#xff0c;我們可以用并查集來判斷一個森林中有幾棵樹、某個節點是否屬于某棵樹等。 主要構成&#xff1a; 并查集…

PHP-實例-文件上傳

1 需求 2 basename 在 PHP 中&#xff0c;basename() 函數用于返回路徑中的文件名部分。如果路徑中包含了文件擴展名&#xff0c;則該函數也會返回它。如果路徑的結尾有斜杠&#xff08;/&#xff09;或反斜杠&#xff08;\&#xff09;&#xff0c;則 basename() 函數會返回空…

Android計算器界面的設計——表格布局TableLayout實操

目錄 任務目標任務分析任務實施 任務目標 使用TextView、Button等實現一個計算器界面&#xff0c;界面如圖1所示。 圖1 計算器界面效果圖 任務分析 界面整體使用表格布局&#xff0c;第一行使用一個TextView控件&#xff0c;橫跨4列&#xff0c;中間4行4列&#xff0c;最后一…

Laravel HTTP客戶端:網絡請求的瑞士軍刀

標題&#xff1a;Laravel HTTP客戶端&#xff1a;網絡請求的瑞士軍刀 Laravel的HTTP客戶端是一個功能強大的工具&#xff0c;它提供了一種簡潔、直觀的方式來發送HTTP請求。無論是與外部API集成&#xff0c;還是進行網絡數據抓取&#xff0c;Laravel的HTTP客戶端都能滿足你的需…

小紅書選品中心商家采集 小紅書商家電話采集軟件

可采集名稱銷量評分聯系方式等 需要有1000粉絲以上已實名認證過的小紅書達人才可以使用 以下是一個示例程序&#xff0c;可以用于批量獲取小紅書選品中心商家的信息&#xff1a; import requestsdef get_merchants(page_num):url f"https://www.xiaohongshu.com/selec…

git 添加本地分支, clean

//以develop為源創建本地分支fromdevelop git checkout -b fromdevelop git add . git commit -m "local" git checkout -b local/dev //切換到遠程分支. git checkout dev git clean_git clean -f -d-CSDN博客 git clean -f -d #刪除當前目錄下沒有被track…

RAC spfile 坑 +data INSTANCE_NUMBER thread x is mounted by another instance

RAC相關三個參數 thread reset 就可以默認 instance_number 需要單獨設置 sid‘SIDX’ cluster_database boolean TRUE SQL> alter system reset instance_number sid* scopespfile; alter system reset instance_number sid* scopespfile …

解析Torch中`Transformer`

解析torch官方代碼腳本文件&#xff1a;transformer.py。版本&#xff1a;1.9.1cu111。 首先查看《Torch中多頭注意力MultiheadAttention的中文注釋》解析&#xff1b; 最后查看下方transformer解析。 話不多說&#xff0c;看代碼吧&#xff01; import copy from typing imp…

Vue的學習之class與style綁定

<!DOCTYPE html> <html><head><meta charset"utf-8"><title>Vue的學習</title><script src"vue.js" type"text/javascript" charset"utf-8"></script></head><body><…

如何在std::map中查找元素

在std::map中查找元素可以通過幾種不同的方式完成&#xff0c;但最常用的方法是使用find成員函數。std::map是一個基于鍵值對的關聯容器&#xff0c;其中每個元素都是一個鍵值對。鍵是唯一的&#xff0c;并且用于排序和快速查找。 使用find成員函數 find成員函數接受一個鍵作…

io流 多線程

目錄 一、io流 1.什么是io流 2.流的方向 i.輸入流 ii.輸出流 3.操作文件的類型 i.字節流 1.拷貝 ii.字符流 ?3.字符流輸出流出數據 4.字節流和字符流的使用場景 5.練習 6.緩沖流 1.字節緩沖流拷貝文件 2.字符緩沖流特有的方法 1.方法 2.總結 7.轉換流基本用法…

第2集《修習止觀坐禪法要》

請打開補充講表第一面&#xff0c;附表一、念佛攝心方便法。 我們前面講到修止&#xff0c;就是善取所緣境的相貌&#xff0c;然后心于所緣&#xff0c;專一安住&#xff1b;心于所緣&#xff0c;相續安住&#xff1b;達到心一境性的目的。 站在修學凈土的角度&#xff0c;他…

FastAPI+SQLAlchemy數據庫連接

FastAPISQLAlchemy數據庫連接 目錄 FastAPISQLAlchemy數據庫連接配置數據庫連接創建表模型創建alembic遷移文件安裝初始化編輯env.py編輯alembic.ini遷移數據庫 視圖函數查詢 配置數據庫連接 # db.py from sqlalchemy import create_engine from sqlalchemy.orm import sessio…