數據結構 -- 順序查找和折半查找

查找的基本概念

基本概念

查找:在數據集合中尋找滿足某種條件的數據元素的過程

查找表(查找結構):用于查找的數據集合稱為查找表,它由同一類型的數據結構元素(或記錄)組成

關鍵字:唯一標識該元素的某個數據項的值,使用基于關鍵字的查找,查找結果應該是唯一的

對查找表的常見操作

①查找符合條件的數據元素

②插入、刪除某個數據元素

只需要進行操作①–靜態查找表–著需要關注查找速度

也要進行操作②–動態查找表–還需要關注插入、刪除操作是否方便實現

查找算法的評價指標

查找長度:查找運算中,需要對比關鍵字次數

平均查找長度(ASL):查找過程中進行關鍵字比較次數的平均值

通常考慮查找成功、查找失敗兩種情況下的ASL

在這里插入圖片描述

順序查找

算法思想

從頭到尾/從尾到頭依次查找

基本實現
typedef struct{ElemType *elem;int TableLen;
}SSTable;//順序查找
int Search_Seq(SSTable ST,ElemType key){int i;for(i = 0;i<ST.TableLen && ST.elem[i] != key;++i);return i==ST.TableLen?-1:i;
}
實現(哨兵)
typedef struct{ElemType *elem;int TableLen;
}SSTable;//順序查找
int Search_Seq(SSTable ST,ElemType key){ST.elem[0] = key;					//查找表中從1號位置開始存放數據,0號位置存放“哨兵”int i;for(i = ST.TableLen;ST.elem[i] != key;--i);return i;							//查找成功,返回元素下標;查找失敗,返回0
}

優點:無需判斷是否越界,執行效率更高(但是并沒有質的提升)

效率分析

查找成功:ASL=(n+1)/2 時間復雜度:O(n)

查找失敗:ASL=n+1 時間復雜度:O(n)

順序查找的優化(對有序表)

以查找表中元素遞增存放為例:

若查找到某個元素大于查找目標,則可判定為查找失敗(后面的元素都大于查找目標)

ASL(失敗) = (1+2+……+n+n)/n+1 = n/2+n/(n+1)

查找算法判定樹分析ASL

在這里插入圖片描述

一個成功節點的查找層數 = 自身所在的層數

一個失敗節點的查找長度 = 其父節點所在的層數

默認情況下,各種成功情況或失敗情況都等概率發生

折半查找(考察頻率高)

算法思想

又稱“二分查找”,僅適用于有序的順序表

每次將查找范圍折半,逐步縮小查找區間,直到找到目標元素或查找區間為空。

前提:數據必須是有序的(通常是升序)。

取中間元素:

  • 計算中間下標 mid = (low + high) // 2

比較中間元素和目標值:

  • target == arr[mid]:查找成功。
  • target < arr[mid]:繼續在左半部分查找。
  • target > arr[mid]:繼續在右半部分查找。

重復步驟 2-3,直到找到目標或范圍為空(low > high)。

算法實現
typedef struct{ElemType *elem;int TableLen;
}SSTable;int Binary_Search(SSTable L,ElemType key){int low = 0,high = L.TableLen-1,mid;while(low<=high){mid = (low+high)/2;			//取中間位置if(L.elem[mid] == key)return mid;				//查找成功返回所在位置else if(L.elem[mid]<key)low = mid+1;			//從后半部分查找elsehigh = mid-1;			//從前半部分查找}return -1;
}
查找效率分析

例:

在這里插入圖片描述

ASL(成功) = (1*1 + 2*2 + 3*4 + 4*4)/11 = 3

ASL(失敗) = (3*4+4*8)/12 = 11/3

查找判定樹的構造

如果當前low和high之間有奇數個元素,則mid分割后,左右兩部分元素個數相等

如果當前low和high之間有偶數個元素,則mid分割后,左半部分比右半部分少一個元素

折半查找的判定樹中,若mid = [(low+high)/2] 則對于任何一個結點,必有:右子樹個數-左子樹個數 = 0或1

在這里插入圖片描述

折半查找的判定樹一定只有最下面一層是不滿的

h = [log2(n+1)]

在這里插入圖片描述

判定樹結點關鍵字:左<中<右,滿足二叉排序樹的定義

失敗節點:n+1(等于成功結點的空鏈域數量)

折半查找的查找效率

樹高h = [log2(n+1)] 查找成功ASL ≤ h 查找失敗ASL ≤ h

時間復雜度O(log2n)

[!WARNING]

折半查找的速度一定比順序查找更快?

? 一般情況下,折半查找比順序查找表現優秀,但不是所有情況下折半查找都更快

若mid = (low+high)/2(向上取整) ?

左子樹結點數-右子樹結點數 = 0或1

在這里插入圖片描述

分塊查找(手算模擬+平均查找長度)

分塊查找的算法思想

eg. 第一個區間:≤10 第二個區間:≤20 ……

“索引表”中保存每個分塊的最大關鍵字和存儲的區間

特點:塊內無序,塊間有序

typedef struct{ElemType maxValue;int low,high;
}Index;//順序表存儲實際元素
ElemType List[100];

算法過程:

①在索引表中確定待查記錄所屬的分塊(可順序、可折半)

②在塊內順序查找

用折半查找查索引

若索引表中不包含目標關鍵字,則折半查找索引表最終停在low>high,要在low所指的分塊中進行查找

low超出索引表的范圍時,查找失敗

查找效率分析(ASL)

在這里插入圖片描述

共有14個元素可能被查找,各自被查找的概率為1/14

若索引表順序查找

7(2)、10(3)、13(3)……

若索引表折半查找(一般不考、計算量大)

30(4)?、27(2)?

查找失敗的情況(更復雜,一般不考)

【可能會考的情況】(順序查找,效率和最優分塊)

在這里插入圖片描述
在這里插入圖片描述

【拓展思考】

若查找表是“動態查找表”,更好的實現方式 – 使用鏈式存儲

(否則在目標關鍵字插入時,需要大量元素的移動)

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

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

相關文章

汽車功能安全--TC3xx MBIST設計要點

英飛凌針對硬件故障的自測&#xff0c;提供了四種機制&#xff1a;PBIST、LBIST、MONBIST和MBIST。 LBIST和MONBIST我們已經聊過了&#xff0c;今天就快速介紹下MBIST。 MBIST&#xff0c;全程Memory Built-in Self Test&#xff0c;用于檢測SRAM數據單元的完整性。 在26262…

openpi 入門教程

系列文章目錄 目錄 系列文章目錄 前言 一、運行要求 二、安裝 三、模型檢查點 3.1 基礎模型 3.2 微調模型 四、運行預訓練模型的推理 五、在自己的數據上微調基礎模型 5.1. 將數據轉換為 LeRobot 數據集 5.3. 啟動策略服務器并運行推理 5.4 更多示例 六、故障排除…

java加強 -Collection集合

集合是一種容器&#xff0c;類似于數組&#xff0c;但集合的大小可變&#xff0c;開發中也非常常用。Collection代表單列集合&#xff0c;每個元素&#xff08;數據&#xff09;只包含1個值。Collection集合分為兩類&#xff0c;List集合與set集合。 特點 List系列集合&#…

深入理解ThingsBoard的Actor模型

1、ThingsBoard系統中定義了哪些Actor ? ThingsBoard Actor 創建機制與作用對照表: Actor 類型 何時創建 由誰創建 是否緩存 作用描述 SystemActor 系統啟動時 DefaultActorService / ActorSystem ? 是 ★ ThingsBoard 平臺服務級別管理器:負責創建所有的Actor AppActor

WPS一旦打開,就會修改默認打開方式,怎么解?

目錄 前言 解決方法 結語 前言 電腦上同時存在WPS和微軟的Office全家桶&#xff0c;但是我更喜歡用Office全家桶。前幾天剛在設置改過來&#xff0c;忘記更改pdf文件打開默認應用。結果沒過幾天&#xff0c;不小心用WPS打開pdf文件時候&#xff0c;給我把默認設置全改回去了…

深度學習中--模型調試與可視化

第一部分&#xff1a;損失函數與準確率的監控&#xff08;Loss / Accuracy Curve&#xff09; 1. 為什么要監控 Loss 與 Accuracy&#xff1f; Loss 是模型優化的依據&#xff0c;但它可能下降了 Accuracy 反而沒變&#xff08;過擬合信號&#xff09; Accuracy 才是評估效果的…

中間件-RocketMQ

RocketMQ 基本架構消息模型消費者消費消息模式順序消息機制延遲消息批量消息事務消息消息重試最佳實踐 基本架構 nameServer: 維護broker列表信息&#xff0c;客戶端連接時只需要連接nameServer。可配置成集群。 broker&#xff1a;broker分為master和slave&#xff0c;master負…

anaconda3如何切換虛擬環境

在 Anaconda3 中切換虛擬環境可以通過 命令行 或 Anaconda Navigator 圖形界面實現。以下是詳細步驟&#xff1a; 方法1&#xff1a;通過命令行切換&#xff08;推薦&#xff09; 1. 查看所有虛擬環境 conda env list # 或 conda info --envs 輸出示例&#xff1a; base …

【vue】axios網絡請求介紹

一、基礎使用 1.引入js文件 2.在methods中的函數里寫 axios.get(路徑) .then((res))>{ console.log(res.data)&#xff1b;//控制臺打印結果數據 this.listArrres.data//定義數組來接收返回來的數據 }&#xff09; 二、參數傳遞 參數傳遞一般在路徑后面使用 params:{ num:2,…

機器學習 --- KNN算法

機器學習 — KNN算法 文章目錄 機器學習 --- KNN算法一&#xff0c;sklearn機器學習概述二&#xff0c;KNN算法---分類2.1樣本距離判斷2.2 KNN算法原理2.3 KNN缺點2.4 API2.5 使用sklearn中鳶尾花數據集實現KNN 一&#xff0c;sklearn機器學習概述 獲取數據、數據處理、特征工…

Spring Boot 中的重試機制

Retryable 注解簡介 Retryable 注解是 Spring Retry 模塊提供的&#xff0c;用于自動重試可能會失敗的方法。在微服務架構和分布式系統中&#xff0c;服務之間的調用可能會因為網絡問題、服務繁忙等原因失敗。使用 Retryable 可以提高應用的穩定性和容錯能力 1。 使用步驟 &…

FPGA生成隨機數的方法

FPGA生成隨機數的方法&#xff0c;目前有以下幾種: 1、震蕩采樣法 實現方式一&#xff1a;通過低頻時鐘作為D觸發器的時鐘輸入端&#xff0c;高頻時鐘作為D觸發器的數據輸入端&#xff0c;使用高頻采樣低頻&#xff0c;利用亞穩態輸出隨機數。 實現方式二&#xff1a;使用三個…

(五)毛子整潔架構(分布式日志/Redis緩存/OutBox Pattern)

文章目錄 項目地址一、結構化日志1.1 使用Serilog1. 安裝所需要的包2. 注冊服務和配置3. 安裝Seq服務 1.2 添加分布式id中間件1. 添加中間件2. 注冊服務3. 修改Application的LoggingBehavior 二、Redis緩存2.1 添加緩存1. 創建接口ICaching接口2. 實現ICaching接口3. 注冊Cachi…

Vue.js 全局導航守衛:深度解析與應用

在 Vue.js 開發中&#xff0c;導航守衛是一項極為重要的功能&#xff0c;它為開發者提供了對路由導航過程進行控制的能力。其中&#xff0c;全局導航守衛更是在整個應用的路由切換過程中發揮著關鍵作用。本文將深入探討全局導航守衛的分類、作用以及參數等方面內容。 一、全局…

使用FastAPI和React以及MongoDB構建全棧Web應用05 FastAPI快速入門

一、FastAPI概述 1.1 什么是FastAPI FastAPI is a modern, high-performance Python web framework designed for building APIs. It’s rapidly gaining popularity due to its ease of use, speed, and powerful features. Built on top of Starlette, FastAPI leverages a…

如何查看打開的 git bash 窗口是否是管理員權限打開

在 git bash 中輸入&#xff1a; net session >nul 2>&1 && (echo Ok) || (echo Failed) 顯示 OK 》是管理員權限&#xff1b; 顯示 Failed 》不是管理員權限。 如何刪除此步生成的垃圾文件&#xff1a; 新建一個 .txt 文件&#xff0c;輸入以下代碼…

得物0509面試手撕題目解答

題目 使用兩個棧&#xff08;一個無序棧和一個空棧&#xff09;將無序棧中的元素轉移到空棧&#xff0c;使其有序&#xff0c;不允許使用其他數據結構。 示例&#xff1a;輸入&#xff1a;[3, 1, 6, 4, 2, 5]&#xff0c;輸出&#xff1a;[6, 5, 4, 3, 2, 1] 思路與代碼 如…

基于 Nexus 在 Dockerfile 配置 yum, conda, pip 倉庫的方法和參考

在 Nexus 配置代理倉庫的方法&#xff0c;可參考 pypi 的配置博客&#xff1a;https://hellogitlab.com/CI/docker/create_your_nexus_2 更多代理格式&#xff0c;參考官方文檔&#xff0c;如 pypi&#xff1a;https://help.sonatype.com/en/pypi-repositories.html 配置 yum…

[6-8] 編碼器接口測速 江協科技學習筆記(7個知識點)

1 2 在STM32微控制器的定時器模塊中&#xff0c;CNT通常指的是定時器的計數器值。以下是CNT是什么以及它的用途&#xff1a; 是什么&#xff1a; ? CNT&#xff1a;代表定時器的當前計數值。在STM32中&#xff0c;定時器從0開始計數&#xff0c;直到達到預設的自動重裝載值&am…

RabbitMQ ③-Spring使用RabbitMQ

Spring使用RabbitMQ 創建 Spring 項目后&#xff0c;引入依賴&#xff1a; <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp --> <dependency><groupId>org.springframework.boot</groupId><artifac…