DSA數據結構與算法 6

查找技術(Searching Techniques)


查找簡介

在計算機科學中,“查找”指的是在某個集合或序列中尋找特定元素的過程。這個過程可以是成功的,也可以是失敗的:

  • 若目標元素存在于集合中,我們稱之為“查找成功”,并返回它在集合中的位置;
  • 若元素不存在,則稱為“查找失敗”。

查找是數據處理中的基本操作之一,幾乎出現在所有軟件系統的核心邏輯中。比如搜索聯系人、檢索圖書、匹配登錄密碼等,背后都離不開查找算法。

而不同的查找算法之間最大的差異,通常體現在“查找的效率”上。這個效率,很大程度上依賴于數據本身的“排列方式”——是否已排序。因此,我們在選擇查找方法時,必須考慮數據的特征。


本章將介紹兩種最基礎的查找技術:

1. 線性查找(Linear Search)

又名“順序查找”,是最直觀的查找方式。算法從第一個元素開始,依次與目標值進行比較,直到找到為止,或遍歷完所有元素。

這種方法的優勢是實現簡單,不要求數據有序;缺點是效率較低,特別是在數據量大的時候。

一個類比:想象你正在翻找一個裝滿撲克牌的盒子,想找一張紅桃 7。如果這些牌是雜亂無章地放著的,你只能一張張翻閱,直到找到為止——這就是線性查找的過程。

def linear_search(arr, target):steps = []  # 每一步的狀態for i in range(len(arr)):status = {'array': arr.copy(),'index': i,'found': arr[i] == target}steps.append(status)if arr[i] == target:break  # 找到目標值就提前退出return steps

請添加圖片描述

二分查找(Binary Search)

二分查找是一種高效的查找方法,但它有一個前提條件:待查找的列表必須是有序的。也就是說,在使用二分查找之前,我們要確保數據已經按照升序或降序排列好,否則該算法將無法正常工作。


? 二分查找的核心思想:分而治之(Divide and Conquer)

具體過程如下:

  1. 將數組從中間分成兩部分;
  2. 將目標值與中間元素進行比較:
    • 如果相等,則查找成功,返回該位置;
    • 如果目標值小于中間元素,說明目標在左半部分;
    • 如果目標值大于中間元素,說明目標在右半部分;
  3. 僅在可能存在目標值的一半繼續查找;
  4. 重復上述步驟,直到找到目標或范圍為空為止。

這種方法的效率極高:每次查找操作都將問題規模減半,時間復雜度為 O ( log ? 2 n ) O(\log_2 n) O(log2?n),遠優于線性查找的 O ( n ) O(n) O(n),尤其在數據量較大時優勢更加明顯。


def binary_search(arr, target):steps = []low = 0high = len(arr) - 1while low <= high:mid = (low + high) // 2step = {'array': arr.copy(),'low': low,'high': high,'mid': mid,'found': arr[mid] == target}steps.append(step)if arr[mid] == target:breakelif arr[mid] < target:low = mid + 1else:high = mid - 1return steps

請添加圖片描述


插值查找(Interpolation Search)

  • 適用條件: 數據必須是有序且分布均勻
  • 核心思想: 預測目標值可能出現的位置,而不是死板地取中間值

m i d = l o w + ( t a r g e t ? a r r [ l o w ] ) ? ( h i g h ? l o w ) a r r [ h i g h ] ? a r r [ l o w ] mid = low + \frac{(target - arr[low]) \cdot (high - low)}{arr[high] - arr[low]} mid=low+arr[high]?arr[low](target?arr[low])?(high?low)?

  • 時間復雜度:
    • 最好: O ( log ? log ? n ) O(\log \log n) O(loglogn)
    • 最壞: O ( n ) O(n) O(n)(分布極度不均)

請添加圖片描述


跳躍查找(Jump Search)

  • 適用條件: 有序數組
  • 核心思想: 以固定步長(如 n \sqrt{n} n ?)跳躍前進,找到目標所在區間后回退線性查找
  • 時間復雜度: O ( n ) O(\sqrt{n}) O(n ?)

請添加圖片描述


哈希查找(Hash Search)

  • 適用條件: 查找速度要求極高,數據量大,結構可以犧牲順序
  • 核心思想: 使用哈希函數將關鍵字映射到數組中的某個索引位置
  • 優勢: 插入和查找時間復雜度通常為 O ( 1 ) O(1) O(1)
  • 挑戰: 哈希沖突(如鏈地址法、開放定址法)

請添加圖片描述


二叉搜索樹(Binary Search Tree, BST)

  • 結構性質: 左子樹 < 根 < 右子樹
  • 時間復雜度:
    • 平均: O ( log ? n ) O(\log n) O(logn)
    • 最壞: O ( n ) O(n) O(n)(退化成鏈表)

請添加圖片描述


平衡二叉搜索樹(AVL 樹、紅黑樹等)

  • 特性: 自動保持“樹的高度”平衡,防止性能退化
  • 優勢: 所有操作最壞時間復雜度為 O ( log ? n ) O(\log n) O(logn)
  • 適用: 高頻插入+查找操作,如操作系統調度、緩存結構

請添加圖片描述


B 樹 / B+ 樹

  • 用途: 用于數據庫、文件系統等對磁盤IO優化要求極高的場景
  • 特點:
    • 多路搜索,不是二叉結構
    • 每個節點包含多個關鍵字
  • 優勢: 能減少磁盤訪問次數,支持批量范圍查找

請添加圖片描述


深度優先搜索(DFS)與廣度優先搜索(BFS)

  • 應用場景: 圖結構查找、路徑規劃、社交網絡分析等
  • 特點:
    • DFS:適合探索所有路徑(回溯)
    • BFS:適合找最短路徑或分層結構

指數查找(Exponential Search)

  • 應用場景: 無法直接知道數據規模,如“無限數組”
  • 過程:
    1. 快速擴大查找范圍(1, 2, 4, 8…)
    2. 找到目標值所在的范圍后使用二分查找
  • 時間復雜度: O ( log ? i ) O(\log i) O(logi),其中 i i i 為目標位置

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

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

相關文章

FastAPI:現代高性能Python Web框架的技術解析與實踐指南

一、FastAPI的誕生背景與技術定位 在數字化轉型的浪潮中,API(應用程序接口)作為連接服務與數據的核心樞紐,其性能與開發效率直接影響業務迭代速度。傳統Python框架如Django和Flask雖功能豐富,但在高并發場景下面臨性能瓶頸,且缺乏對異步編程的原生支持。FastAPI應運而生…

VuePress 使用教程:從入門到精通

VuePress 使用教程&#xff1a;從入門到精通 VuePress 是一個以 Vue 驅動的靜態網站生成器&#xff0c;它為技術文檔和技術博客的編寫提供了優雅而高效的解決方案。無論你是個人開發者、團隊負責人還是開源項目維護者&#xff0c;VuePress 都能幫助你輕松地創建和管理你的文檔…

1.Vue自動化工具安裝(Vue-cli)

目錄 1.node.js 安裝&#xff1a; 2 npm 安裝 3 安裝Vue-cli 4總結&#xff1a; 一般情況下&#xff0c;單文件組件&#xff0c;我們運行在 自動化工具vue-CLI中&#xff0c;可以幫我們編譯單文件組件。所以我們在學習時一般需要在系統中先搭建vue-CLI工具 下面就是一些我…

IP數據報

IP數據報組成 IP數據報&#xff08;IP Datagram&#xff09;是網絡中傳輸數據的基本單位。 IP數據報頭部 版本&#xff08;Version&#xff09; 4bit 告訴我們使用的是哪種IP協議。IPv4版本是“4”&#xff0c;IPv6版本是“6”。 頭部長度&#xff08;IHL&#xff0c;Intern…

Leetcode 2158. 每天繪制新區域的數量【Plus題】

1.題目基本信息 1.1.題目描述 有一幅細長的畫&#xff0c;可以用數軸來表示。 給你一個長度為 n 、下標從 0 開始的二維整數數組 paint &#xff0c;其中 paint[i] [starti, endi] 表示在第 i 天你需要繪制 starti 和 endi 之間的區域。 多次繪制同一區域會導致不均勻&…

Git Flow

Git Flow深度解析&#xff1a;企業級分支管理實戰指南 前言 在持續交付時代&#xff0c;分支策略決定團隊協作效率。Git Flow作為經典的分支管理模型&#xff0c;被Apache、Spring等知名項目采用。2023年JetBrains開發者調查報告顯示&#xff0c;Git Flow仍是中大型項目最常用…

[Swift]pod install成功后運行項目報錯問題error: Sandbox: bash(84760) deny(1)

操作&#xff1a; platform :ios, 14.0target ZKMKAPP do# Comment the next line if you dont want to use dynamic frameworksuse_frameworks!# Pods for ZKMKAPPpod Moyaend pod install成功后運行報錯 報錯&#xff1a; error: Sandbox: bash(84760) deny(1) file-writ…

[管理與領導-129]:向上管理-組織架構、股權架構、業務架構、流程架構,看每個人在組織中的位置和重要性

目錄 一、股權架構&#xff1a;反映所有權與控制權 二、組織架構&#xff1a;定義角色與匯報關系 三、業務架構&#xff1a;定義業務單元與價值鏈 四、流程架構&#xff1a;規范業務運作與協作 五、綜合分析&#xff1a;個人在組織中的綜合影響力 六、案例&#xff1a;某…

小紅書爬蟲,小紅書api,小紅書數據挖掘

背景&#xff1a; 小紅書&#xff08;Xiaohongshu&#xff09;是一款結合社交、購物和內容分享的移動應用&#xff0c;近年來在中國以及全球范圍內擁有大量的用戶群體。小紅書上的內容包括用戶的消費體驗、生活方式、旅行分享、時尚搭配等。通過這些內容&#xff0c;用戶可以了…

玩轉Docker | 使用Docker部署tududi任務管理工具

玩轉Docker | 使用Docker部署tududi任務管理工具 前言一、tududi介紹Tududi簡介核心功能特點二、系統要求環境要求環境檢查Docker版本檢查檢查操作系統版本三、部署tududi服務下載鏡像創建容器創建容器檢查容器狀態檢查服務端口安全設置四、訪問tududi服務訪問tududi首頁登錄tu…

大屏設計與匯報:政務服務可視化實踐

大屏設計與匯報:政務服務可視化實踐 引言 在政務服務數字化轉型浪潮中,大屏設計成為展現業務能力與數據價值的關鍵手段。本文圍繞政務大屏設計,從設計要點、業務邏輯到匯報技巧展開深入探討,為相關從業者提供全面參考。 一、大屏設計核心要點 (一)多維度考量 設計大…

字節(抖音)golang后端

Golang知道哪些并發模式&#xff0c;你覺得哪個更好&#xff0c;為什么 在使用channel的時候有哪些需要考慮和注意的地方 進程和線程的區別 線程里有哪些字段 TCP和UDP的區別&#xff0c;各自的優劣勢 TCP 更適合需要可靠性、順序和連接管理的場景&#xff0c;如文件傳輸和網頁…

Python語法系列博客 · 第6期[特殊字符] 文件讀寫與文本處理基礎

上一期小練習解答&#xff08;第5期回顧&#xff09; ? 練習1&#xff1a;字符串反轉模塊 string_tools.py # string_tools.py def reverse_string(s):return s[::-1]調用&#xff1a; import string_tools print(string_tools.reverse_string("Hello")) # 輸出…

Unity運行時查看日志插件 (IngameDebugConsole)

Unity運行時查看日志插件 (IngameDebugConsole) 文章目錄 Unity運行時查看日志插件 (IngameDebugConsole)一、介紹二、使用步驟1.導入插件2.開始使用 結束 一、介紹 In-game Debug Console插件可以在打包發布以后&#xff0c;程序運行時方便的看到控制臺信息&#xff0c;在一些…

spark-SQL核心編程課后總結

通用加載與保存方式 加載數據&#xff1a;Spark-SQL的 spark.read.load 是通用加載方法&#xff0c;借助 format 指定數據格式&#xff0c;如 csv 、 jdbc 、 json 等&#xff1b; load 用于指定數據路徑&#xff1b; option 在 jdbc 格式時傳入數據庫連接參數。此外&#xff0…

蔡浩宇的AIGC游戲革命:從《原神》到《Whispers》的技術跨越

目錄 引言&#xff1a;游戲行業的AI革命前夜 一、《Whispers》的技術突破與市場挑戰 1.1 多模態AI技術的集成應用 1.2 與傳統游戲的差異化體驗 1.3 面臨的商業化難題 二、從《原神》到《Whispers》的技術演進 2.1 《原神》成功的時代因素分析 2.2 蔡浩宇的技術路線轉變 …

Spring Boot中定時任務Cron表達式的終極指南

Spring Boot中定時任務Cron表達式的終極指南 一、Cron表達式基礎二、Spring Boot中定時任務的實現三、Cron表達式高級用法四、調試與驗證技巧五、常見問題與解決方案六、最佳實踐總結 定時任務是后端開發中實現周期性業務邏輯的核心技術之一。在Spring Boot生態中&#xff0c;結…

國產SMT貼片機自主技術突破解析

內容概要 隨著電子信息產業對精密制造需求的持續升級&#xff0c;國產SMT貼片機的技術突破已成為裝備自主化進程的關鍵節點。本文聚焦設備研發的三大核心領域&#xff1a;高動態運動控制系統通過線性電機與數字信號處理技術的融合&#xff0c;將重復定位精度提升至5μm級別&am…

uni-app 安卓10以上上傳原圖解決方案

在Android 10及以上版本中&#xff0c;由于系統對文件訪問的限制&#xff0c;使用chooseImage并勾選原圖上傳后&#xff0c;返回的是圖片的外部存儲路徑&#xff0c;如&#xff1a;file:///storage/emulated/0/DCIM/Camera/。這種外部存儲路徑&#xff0c;無法直接轉換成所需要…

迭代器模式:統一不同數據結構的遍歷方式

迭代器模式&#xff1a;統一不同數據結構的遍歷方式 一、模式核心&#xff1a;分離數據遍歷與數據表示 在開發中&#xff0c;我們經常需要遍歷不同的數據結構&#xff0c;如數組、鏈表、樹等。若在客戶端代碼中直接編寫遍歷邏輯&#xff0c;不僅會導致代碼冗余&#xff0c;而…