哈希算法、搜索算法與二分查找算法在 C# 中的實現與應用

在計算機科學中,哈希算法、搜索算法和二分查找算法是三個非常基礎且常用的概念。它們分別在數據存儲、數據查找、以及高效檢索等場景中起著至關重要的作用。在 C# 中,這些算法的實現和使用也十分簡便。本文將詳細講解這三種算法的原理、應用以及 C# 中的實現。


一、哈希算法(Hashing Algorithm)

哈希算法是一種將任意長度的數據映射到固定長度的輸出的算法。其應用非常廣泛,最常見的應用之一就是哈希表(Hash Table)。哈希表利用哈希算法將鍵值對存儲在表中,使得數據查找的時間復雜度趨近于常數級別,即 O(1)。哈希算法的一個關鍵特性是其 哈希沖突(即不同的輸入值可能得到相同的哈希值),而處理哈希沖突是設計高效哈希表的關鍵。

在 C# 中,哈希表的實現通常使用 Dictionary<TKey, TValue>HashSet<T> 類。我們來看看它們的使用。

1.1 哈希表:Dictionary

哈希表(Dictionary)是一種用于存儲鍵值對的數據結構,它能提供高效的查找、插入和刪除操作。Dictionary 類實現了哈希表的功能,支持通過鍵快速訪問對應的值。

using System;
using System.Collections.Generic;class Program
{static void Main(){// 創建哈希表Dictionary<int, string> hashTable = new Dictionary<int, string>();// 插入數據hashTable[1] = "Alice";hashTable[2] = "Bob";hashTable[3] = "Charlie";// 查找數據if (hashTable.ContainsKey(2)){Console.WriteLine($"鍵 2 對應的值是: {hashTable[2]}");}// 刪除數據hashTable.Remove(3);Console.WriteLine("刪除鍵 3 后,哈希表中項數: " + hashTable.Count);}
}

解析:

  • Dictionary<int, string> 是一個泛型哈希表,int 是鍵的類型,string 是值的類型。

  • 通過 [] 運算符插入和訪問數據,使用 ContainsKey 方法檢查鍵是否存在,使用 Remove 刪除數據。

1.2 哈希集合:HashSet

哈希集合(HashSet)是一個無重復元素的集合,適用于去重操作。它提供了對集合元素的高效查找、插入和刪除操作。

using System;
using System.Collections.Generic;class Program
{static void Main(){// 創建哈希集合HashSet<int> hashSet = new HashSet<int>();// 插入元素hashSet.Add(1);hashSet.Add(2);hashSet.Add(3);// 嘗試插入重復元素bool isAdded = hashSet.Add(2);  // 返回 false,因為 2 已經存在Console.WriteLine($"插入 2 是否成功: {isAdded}");// 查找元素if (hashSet.Contains(3)){Console.WriteLine("集合中包含元素 3");}// 刪除元素hashSet.Remove(1);Console.WriteLine("刪除元素 1 后,集合中元素個數: " + hashSet.Count);}
}

解析:

  • HashSet<int> 是一個無序且不重復的集合,提供高效的查找和插入操作。

  • Add 方法插入元素,如果元素已存在則返回 false

  • Contains 方法檢查元素是否存在。


二、搜索算法(Search Algorithms)

搜索算法主要用于查找數據結構中的元素。在實際編程中,常見的搜索算法有 線性搜索二分查找

2.1 線性搜索(Linear Search)

線性搜索是一種簡單的搜索算法,它通過逐個檢查元素,直到找到目標元素或遍歷完所有元素。線性搜索適用于無序或小規模的數據。

using System;class Program
{static int LinearSearch(int[] arr, int target){for (int i = 0; i < arr.Length; i++){if (arr[i] == target){return i;  // 返回目標元素的索引}}return -1;  // 如果沒有找到返回 -1}static void Main(){int[] arr = { 1, 3, 5, 7, 9 };int target = 5;int index = LinearSearch(arr, target);if (index != -1){Console.WriteLine($"元素 {target} 在數組中的索引是: {index}");}else{Console.WriteLine("沒有找到目標元素");}}
}

解析:

  • 線性搜索的時間復雜度為 O(n),適合小型數據集或無序數據集。

  • 它通過遍歷每個元素,找到目標元素后返回其索引。

2.2 二分查找(Binary Search)

二分查找是一種高效的搜索算法,它要求數據已經排序。該算法通過每次將查找區間分為兩半,迅速縮小查找范圍,從而大大提高查找效率。

using System;class Program
{static int BinarySearch(int[] arr, int target){int left = 0, right = arr.Length - 1;while (left <= right){int mid = left + (right - left) / 2;if (arr[mid] == target)return mid;  // 找到目標元素,返回索引else if (arr[mid] < target)left = mid + 1;  // 目標在右側elseright = mid - 1;  // 目標在左側}return -1;  // 沒有找到目標元素}static void Main(){int[] arr = { 1, 3, 5, 7, 9 };int target = 5;int index = BinarySearch(arr, target);if (index != -1){Console.WriteLine($"元素 {target} 在數組中的索引是: {index}");}else{Console.WriteLine("沒有找到目標元素");}}
}

解析:

  • 二分查找的時間復雜度為 O(log n),適用于已排序的數組或集合。

  • 每次將查找區間分為兩部分,減少了需要檢查的元素數量,從而提升了效率。


三、總結

在本文中,我們詳細介紹了哈希算法、搜索算法和二分查找算法,并在 C# 中展示了如何實現這些算法。

  • 哈希算法,通過 DictionaryHashSet 實現了高效的查找、插入和去重操作。

  • 線性搜索,適用于小型或無序的數據集,時間復雜度為 O(n)。

  • 二分查找,是一個高效的搜索算法,要求數據已經排序,時間復雜度為 O(log n)。

理解和掌握這些基礎算法,不僅能幫助我們優化數據存儲和查找操作,還能提升編程能力。希望本文能為你提供一些有價值的參考,幫助你更好地運用這些算法解決實際問題。

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

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

相關文章

AI日報 · 2025年5月05日|雅詩蘭黛與微軟合作成立 AI 創新實驗室,加速美妝產品研發與營銷

1、蘋果與 Anthropic 深化合作&#xff0c;內部測試 AI 驅動的新版 Xcode 據多方報道&#xff0c;蘋果公司正與人工智能初創公司 Anthropic 合作&#xff0c;開發集成 AI 功能的新一代 Xcode 開發平臺。該平臺旨在利用 Anthropic 強大的 Claude Sonnet 模型&#xff0c;為開發…

python celery框架結合django的使用

學習目標&#xff1a; 通過文章了解celery的運行機制以及如何結合django去使用 熟悉celery的運行原理屬性celery在django項目當中的配置如何啟動運行celery框架 學習內容&#xff1a; 熟悉celery的運行原理&#xff0c;簡單來說 Celery 是一個“任務排隊機后臺處理器”。幫你…

滑動窗口leetcode 904

代碼&#xff1a; class Solution { public:int totalFruit(vector<int>& fruits) {int n fruits.size();unordered_map<int,int> window_type_count;int left 0;int ans 0;for(int right 0; right <n;right){while(window_type_count.size() 2 &&…

用可視化學習逆置法

1.逆置法思路 目標&#xff1a;將這個彩色數組向右旋轉3步 &#x1f534;1 → &#x1f7e0;2 → &#x1f7e1;3 → &#x1f7e2;4 → &#x1f535;5 → &#x1f7e3;6 → ?7我們希望得到 &#x1f535;5 → &#x1f7e3;6 → ?7 → &#x1f534;1 → &#x1f7e0;…

Cisco Packet Tracer 選項卡的使用

目錄 設備Config選項卡的使用 Realtime and Simulation模式&#xff08;數據包跟蹤與分析&#xff09; 設備Desktop選項卡的使用 設備Config選項卡的使用 Hostname NVRAM Startup Config----Load 加載 INTERFACE 點擊on Save 如果&#xff0c;不把Running Config保存為Sta…

pyqt寫一個單片機配置界面

已經實現以下功能 1.可以選擇單片機架構 2.選擇完單片機架構后第二個框可以選擇常見單片機型號 3.選擇完常見單片機型號后第三個框可以選擇內部資源如adc等&#xff08;可以選擇多個內部資源&#xff09;4.選擇完內部資源如adc等&#xff08;可以選擇多個內部資源&#xff09;后…

丟失的數字 --- 位運算

目錄 一&#xff1a;題目 二&#xff1a;算法原理 三&#xff1a;代碼實現 一&#xff1a;題目 題目鏈接&#xff1a; 268. 丟失的數字 - 力扣&#xff08;LeetCode&#xff09; 二&#xff1a;算法原理 三&#xff1a;代碼實現 class Solution { public:int missingNumb…

千鋒教育Ansible自動化運維實戰教程從入門到精通

簡介 介紹 Ansible 的基本概念、自動化運維優勢、應用場景及課程目標。 歡迎開啟 Ansible 學習之旅&#xff01; 你好&#xff01;作為一名學習者&#xff0c;你即將通過這個 Ansible 自動化運維實戰 課程&#xff0c;從零開始掌握自動化運維的超能力&#xff01;這個“簡介”…

深入理解 TensorFlow 的模型保存與加載機制(SavedModel vs H5)

深入理解 TensorFlow 的模型保存與加載機制&#xff08;SavedModel vs H5&#xff09; 在使用 TensorFlow 進行模型訓練后&#xff0c;模型的保存與加載是部署、復用和遷移學習的重要環節。TensorFlow 提供了兩種主要的保存格式&#xff1a;SavedModel 和 HDF5 (.h5)。本篇文章…

C++之特殊類設計及類型轉換

目錄 一、設計一個不能被拷貝的類 二、設計一個只能在堆上創建對象的類 三、設計一個只能在棧上創建對象的類 四、設計一個不能被繼承的類 五、設計一個只能創建一個對象的類(單例模式) 六、C語言中的類型轉換 七、C中的三類類型轉換 八、C強制類型轉換 8.1、為什么C需…

制作一款打飛機游戲36:調度編輯器

我們正在創建一個調度編輯器。嗯&#xff0c;這個名字聽起來可能有點奇怪&#xff0c;對吧&#xff1f;但如果你了解射擊游戲中的“調度”&#xff0c;那就是敵人出現的時間表。 你可能已經看到了&#xff0c;我們有一個可以滾動的關卡。現在&#xff0c;我想增加一些交互性&a…

wordperss AI插件:AI圖文+視頻+長尾關鍵詞自動生成,已內置deepseek、kimi全模型,支持簡單一鍵接入更多自定義API

【2.17最新版】Linkreate wordperss AI插件&#xff1a;AI圖文視頻長尾關鍵詞自動生成&#xff0c;已內置deepseek、kimi全模型。 支持自定義接入其它API&#xff0c;包括但不限于騰訊云API和它的deepseek模型 后臺只需要設置對應的API url 、模型 、API key,就可以讓插件調用…

從零開始學Python:開啟編程新世界的大門

在當今數字化時代&#xff0c;Python作為一門簡潔、高效且功能強大的編程語言&#xff0c;受到了越來越多人的喜愛與追捧。無論是數據科學、人工智能、Web開發&#xff0c;還是自動化腳本編寫&#xff0c;Python都展現出了卓越的能力。本文將帶領大家踏上Python學習之旅&#x…

【PostgreSQL數據分析實戰:從數據清洗到可視化全流程】3.2 缺失值檢測與處理(NULL值填充/刪除策略)

&#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 文章大綱 缺失值檢測與處理全攻略&#xff1a;NULL值填充與刪除策略實戰3.2 缺失值檢測與處理3.2.1 缺失值類型與業務影響3.2.1.1 缺失值的三種形態3.2.1.2 業務影響分級 3.2.2 缺失值…

Java求職面試:Spring Boot與微服務的幽默探討

Java求職者面試&#xff1a;技術與幽默的碰撞 場景概述 在某互聯網大廠的面試現場&#xff0c;面試官嚴肅認真&#xff0c;程序員則是一個搞笑的水貨角色。面試者名叫張偉&#xff0c;年齡28歲&#xff0c;碩士學歷&#xff0c;擁有5年的Java開發經驗。以下是面試的詳細過程。…

使用 NGINX 實現 HTTP Basic 認證ngx_http_auth_basic_module 模塊

一、前言 在 Web 應用中&#xff0c;對部分資源進行訪問控制是十分常見的需求。除了基于 IP 限制、JWT 驗證、子請求校驗等方式外&#xff0c;最經典也最簡單的一種方式便是 HTTP Basic Authentication。NGINX 提供的 ngx_http_auth_basic_module 模塊支持基于用戶名和密碼的基…

map和set的設計以及紅黑樹的設計

1.map和set的底層是紅黑樹 2.map和set在STL是容器&#xff0c;在我看來&#xff0c;不過也是封裝了平衡二叉搜索樹紅黑樹的適配器 我們先看紅黑樹的設計&#xff0c;看完后map和set的封裝易如反掌 #pragma once #include<utility> #include<iostream> using name…

Linux運維——Vim技巧二

Vim技巧 一、管理多個文件1.1、用緩沖區列表管理打開的文件1.2、用參數列表將緩沖區分組1.3、將工作區切分成窗口1.4、用標簽頁將窗口分組1.5、用:edit命令打開文件1.6、使用:find打開文件1.7、把文件保存到不存在的目錄中 二、動作命令在文檔中移動2.1、區分實際行與屏幕行2.2…

2025 年 408 真題及答案

2025 年 408 真題 歷年408真題及答案下載直通車 1、以下 C 代碼的時間復雜度是多少&#xff1f;&#xff08;&#xff09; int count 0; for (int i0; i*i<n; i)for (int j0; j<i; j)count;A O(log2n)B O(n)C O(nlogn)D O(n2) 2、對于括號匹配問題&#xff0c;符號棧…

【MuJoCo仿真】開源SO100機械臂導入到仿真環境

主要參考&#xff1a;https://github.com/jpata/gym-so100/tree/integration/gym_so100/assets/trs_so_arm100 參考&#xff1a;&#xff08;八&#xff09;lerobot開源項目擴展so100的仿真操控&#xff08;操作記錄&#xff09;_so100機械臂 仿真-CSDN博客 下載&#xff1a;…