代碼隨想錄算法訓練營Day6 | 哈希表 Part 1

一、今日學習目標

掌握哈希表的核心理論(哈希函數、哈希碰撞及解決方法),理解數組、set、map 三種哈希結構的適用場景,并通過「兩個數組的交集」「快樂數」「兩數之和」三道題目,實戰掌握哈希表在快速查找、去重、鍵值映射等場景的應用。

二、核心理論知識

1、哈希表的數學本質

理論知識

哈希表是一種通過「關鍵碼直接訪問數據」的數據結構,其核心是哈希函數—— 將關鍵碼(如數值、字符串)映射為哈希表的索引,實現 O (1) 級別的快速訪問。從數學角度看,哈希函數可表示為:
index=hashFunction(key) mod tableSize

2、哈希碰撞與解決方法

當不同關鍵碼映射到同一索引時,產生哈希碰撞,常見解決方法:

  • 拉鏈法:在碰撞索引處構建鏈表,存儲所有沖突元素(如 Java 的 HashMap)。需合理設置tableSize,避免鏈表過長影響效率。
  • 線性探測法:當碰撞發生時,依次檢查下一個索引(index+1, index+2...),要求tableSize > dataSize(數據量),確保有足夠空位。

3、三種常見的哈希結構對比

結構底層實現使用場景
數組連續內存關鍵碼范圍小且連續
set紅黑樹、哈希表需去重且無需存儲額外信息
map紅黑樹、哈希表需存儲鍵值對

三、實戰解題

1、有效的字母異位詞

題目描述

LeetCode 242 有效的字母異位詞

代碼實現

文章講解

Python代碼
class Solution(object):def isAnagram(self, s, t):""":type s: str:type t: str:rtype: bool"""record = [0]*26for i in s:record[ord(i)-ord('a')] += 1for i in t:record[ord(i)-ord('a')] -= 1for i in range(26):if record[i] != 0:return  Falsereturn True
調試過程

通過調試發現,看似簡單的計數邏輯,需重點關注輸入合法性(長度、字符范圍)和效率優化(提前終止),這也是哈希表類問題的通用調試要點 —— 既要保證邏輯正確,也要兼顧邊界場景和性能。

2、兩個數組的交集

題目描述

LeetCode 349 兩個數組的交集

代碼實現

文章講解

Python代碼
class Solution(object):def intersection(self, nums1, nums2):""":type nums1: List[int]:type nums2: List[int]:rtype: List[int]"""table = {}for num in nums1:table[num] = table.get(num, 0)+1res = set()for num in nums2:if num in table:res.add(num)del table[num]return list(res)
調試過程

最初嘗試用列表存儲結果,未考慮去重,導致輸出包含重復元素(如示例中 nums2 的兩個 4)。改用 set 存儲結果后,自動去重問題解決。

3、快樂數

題目描述

LeetCode 202 快樂數

代碼實現

文章講解

Python代碼
class Solution(object):def isHappy(self, n):""":type n: int:rtype: bool"""seen = []while n != 1:n = sum(int(i)**2 for i in str(n))if n in seen:return Falseseen.append(n)return True
調試過程

最初忽略了「無限循環」的本質,未用 set 記錄中間結果,導致程序陷入死循環。加入 set 后,當檢測到重復的 n 時,可直接判斷為非快樂數。

4、兩數之和

題目描述

LeetCode 1 兩數之和

代碼實現

文章講解

Python代碼
class Solution(object):def twoSum(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""records = dict()for index, value in enumerate(nums):if target - value in records:return [records[target - value], index]records[value] = indexreturn []
調試過程

通過調試發現,該解法的關鍵在于哈希表存儲元素與索引的映射,并利用遍歷順序確保重復元素的索引正確性。需注意的邊界條件包括:

  1. 重復元素:哈希表覆蓋索引的行為因遍歷順序而不影響結果;

  2. 無解情況:需確保代碼返回空列表而非報錯;

  3. 特殊數值:負數、零等需驗證哈希表查詢邏輯。

四、易錯點總結

題目易錯點

解決方法

兩個數組的交集結果未去重;用數組導致空間浪費用 set 存儲結果;數值范圍不確定時優先用 set
快樂數未檢測循環導致死循環;求和時漏處理個位用 set 記錄中間結果;用 divmod 統一處理各位
兩數之和用 set 無法存儲下標;忽略元素重復情況用 map 存儲鍵值對;依賴遍歷順序避免重復使用

五、擴展思考

1.** 哈希函數設計?:好的哈希函數應盡量減少碰撞,可結合數論中的「素數取模」(如 HashMap 的容量為 2?,減少碰撞概率)。
2.
?時間復雜度對比 **:

  • 數組:查詢 O (1),但空間復雜度 O (M)(M 為最大可能值);

  • unordered_set/map:查詢 O (1)(平均),空間 O (n),適合大數據量;

  • set/map(紅黑樹):查詢 O (logn),但有序,適合需排序的場景。

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

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

相關文章

5.13.樹、森林與二叉樹的轉換

當使用"孩子兄弟表示法"存儲樹或森林時,最終會呈現出與二叉樹類似的形態,所以樹、森林與二叉樹之間的轉換本質上就是畫出采用孩子兄弟表示法存儲的樹和森林。一."樹->二叉樹"的轉換:1.例一:以上述圖片左邊…

Spring 核心流程

Spring 核心流程前言一、AbstractApplicationContext#refresh 方法解析1.1 前置1.2 refresh 方法1.2.1 prepareRefresh1.2.2 obtainFreshBeanFactory1.2.3 prepareBeanFactory1.2.4 postProcessBeanFactory1.2.5 invokeBeanFactoryPostProcessors1.2.6 registerBeanPostProcess…

RS485轉Profinet網關與JRT激光測距傳感器在S7-1200 PLC系統中的技術解析與應用

RS485轉Profinet網關與JRT激光測距傳感器在S7-1200 PLC系統中的技術解析與應用技術核心:協議轉換與數據橋梁在工業自動化系統中,RS485轉Profinet網關承擔著協議翻譯官的角色。以XD-MDPN100型號為例,其本質是將RS485設備的串口數據封裝為Profi…

《C++ string 完全指南:string的模擬實現》

string的模擬實現 文章目錄string的模擬實現一、淺拷貝和深拷貝1.淺拷貝2.深拷貝3.寫時拷貝二、定義string的成員變量三、string的接口實現1.string的默認成員函數(1)構造函數實現(2)析構函數實現(3)拷貝構…

造成服務器內存不足的原因有什么

服務器在日常的運行過程中,會存儲大量關于企業重要的數據信息,偶爾會出現內存飆升空間不足的情況,服務器內存作為服務器數據處理和存儲的主要空間,異常占用會導致服務器性能降低,影響到企業業務的響應速度,…

JVM、Dalvik、ART垃圾回收機制

一、JVM垃圾回收機制(桌面/服務器端)1. 核心算法:分代收集新生代回收(Minor GC)觸發條件:Eden區滿時觸發算法:復制算法(Eden → Survivor區)過程:存活對象在S…

數學專業轉型數據分析競爭力發展報告

一、核心優勢拆解(1)數學能力與數據分析對應關系數學課程數據分析應用場景比較優勢說明概率論假設檢驗設計能準確判斷統計顯著性閾值實變函數數據質量評估異常值檢測的嚴格性更高線性代數特征工程構建矩陣運算優化模型訓練效率(2)…

JAVA進階--MySQL

一.MySQL架構連接層:處理客戶端連接服務,認證授權相關的操作服務層:最核心的一層(核心服務功能),處理sql,包括sql優化,函數調用....存儲引擎層:存儲引擎是真正負責來操作數據的(mysql中數據的存儲和提取), mysql中有不同存儲引擎,…

【架構】Docker簡單認知構建

作為一個之前從來沒有接觸過Docker的倒霉蛋,想了解學習一下Docker 搜了CSDN和RUNOOB,得到的描述如下: Docker 是一個開源的應用容器引擎,基于 Go 語言 并遵從 Apache2.0 協議開源。 Docker 可以讓開發者打包他們的應用以及依賴包…

C++ std::list概念與使用案例

C std::list 概念詳解 std::list 是 C 標準模板庫(STL)中的一個雙向鏈表容器。與 vector 和 array 不同,它不保證元素在內存中連續存儲,而是通過指針將各個元素連接起來。 核心特性 雙向鏈表結構: 每個元素包含指向前驅…

從0到1學Pandas(六):Pandas 與數據庫交互

目錄一、數據庫基礎操作1.1 連接數據庫1.2 執行 SQL 查詢1.3 創建與修改表結構二、數據導入導出2.1 從數據庫讀取數據2.2 將數據寫入數據庫2.3 大數據量處理三、數據庫事務處理3.1 事務概念與實現3.2 批量數據更新3.3 錯誤處理與回滾四、數據庫性能優化4.1 查詢性能優化4.2 連接…

GitHub 趨勢日報 (2025年07月26日)

📊 由 TrendForge 系統生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日報中的項目描述已自動翻譯為中文 📈 今日獲星趨勢圖 今日獲星趨勢圖602Qwen3-Coder573neko527hrms275BillionMail153Win11Debloat115hyperswitch57data…

機器人仿真(2)Ubuntu24.04下RTX5090配置IsaacSim與IsaacLab

目錄 一、前言二、電腦配置三、配置步驟3.1 創建Conda環境3.2 安裝PyTorch3.3 安裝Isaac Sim3.4 安裝Isaac Lab 四、總結 一、前言 博主自從去年開始就一直在關注Isaac Lab和Isaac Sim,但是一直以來由于手頭設備只有4060,甚至沒有達到最低配置16GB顯存要…

DaVinci Resolve 19.0(達芬奇)軟件安裝包下載及詳細安裝教程|附帶安裝文件

[軟件名稱]:ArcGIS [軟件大小]:2.99 GB [系統要求]:支持Win7及更高版本 [下載通道]: 迅雷網盤 [下載鏈接]:高速下載地址 https://pan.xunlei.com/s/VOW9nw-JV99A_7f_5hhpgqO2A1?pwdbufh# ??:先用手機下載迅雷網盤保存到手機中&#xff0c…

Java學習第八十一部分——Shiro

目錄 📫 一、前言提要簡介 🛡? 二、核心功能介紹 ?? 三、核心架構組件 ? 四、與Java的關系 ?? 五、與Spring Security對比 🧩 六、典型應用場景 💎 七、總結歸納概述 📫 一、前言提要簡介 Apache Shiro 是…

虛擬機ubuntu20.04共享安裝文件夾

ubuntu20.04共享安裝文件夾 4.5 共享安裝文件夾 將Windows存放安裝文件的文件夾共享給虛擬機,如下圖操作:如果是在ubuntu20.04中,還需要以下的操作: sudo mkdir /mnt/hgfs 此命令無效 sudo echo ‘vmhgfs-fuse /mnt/hgfs fu…

如何查看電腦后門IP和流量?

你是否也有以下經歷?深夜,你的電腦風扇突然狂轉,屏幕卻一片寂靜;每月流量莫名超標,賬單高得離譜;鼠標偶爾不聽使喚…這些可能不是電腦“鬧脾氣”,如何一探究竟? 想象一下&#xff1a…

分類預測 | MATLAB基于四種先進的優化策略改進蜣螂優化算法(IDBO)的SVM多分類預測

分類預測 | MATLAB基于四種先進的優化策略改進蜣螂優化算法(IDBO)的SVM多分類預測 目錄分類預測 | MATLAB基于四種先進的優化策略改進蜣螂優化算法(IDBO)的SVM多分類預測分類效果基本介紹多策略量子自適應螺旋搜索算法研究摘要1. 引言1.1 研究背景1.2 研究意義1.3 研究目標2. 文…

Android 修改系統時間源碼閱讀

鏈接:XRefAndroid - Support Android 16.0 & OpenHarmony 5.0 (AndroidXRef/AospXRef) 這里看的Android 10的代碼,選中Android 10,勾選所有工程,搜索DateTimeSettings?: 看到showTimePicker應該是顯示一個設置時…

關于自定義域和 GitHub Pages(Windows)

GitHub Pages 支持使用自定義域,或將站點 URL 的根目錄從默認值(例如 )更改為您擁有的任何域,比如octocat.github.io。 誰可以使用此功能? GitHub Pages 在公共存儲庫中提供 GitHub Free 和 GitHub Free for organizations,在公共和私有存儲庫中提供 GitHub Pro、GitHub …