算法-查找算法

下面是使用 Java 實現的四種查找算法

  1. 線性查找(Linear Search)
  2. 二分查找(Binary Search)
  3. 插值查找(Interpolation Search)
  4. 斐波那契查找(Fibonacci Search)

? 1. 線性查找(Linear Search)

說明:

從數組的第一個元素開始,逐個比較,直到找到目標值或遍歷完整個數組。

Java 實現:

public class LinearSearch {public static int linearSearch(int[] arr, int target) {for (int i = 0; i < arr.length; i++) {if (arr[i] == target) {return i; // 返回索引}}return -1; // 未找到}public static void main(String[] args) {int[] arr = {4, 2, 7, 1, 9, 3};int target = 7;System.out.println("Index of " + target + ": " + linearSearch(arr, target)); // 輸出 2}
}

? 2. 二分查找(Binary Search)

說明:

適用于有序數組。每次將查找區間縮小一半,效率高,時間復雜度為 O(log n)

Java 實現:

public class BinarySearch {public static int binarySearch(int[] arr, int target) {int left = 0;int 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;} else {right = mid - 1;}}return -1;}public static void main(String[] args) {int[] arr = {1, 3, 5, 7, 9, 11};int target = 7;System.out.println("Index of " + target + ": " + binarySearch(arr, target)); // 輸出 3}
}

? 3. 插值查找(Interpolation Search)

說明:

是對二分查找的優化,適用于數據分布均勻的有序數組。通過插值公式計算中間點,平均性能優于二分查找。

Java 實現:

public class InterpolationSearch {public static int interpolationSearch(int[] arr, int target) {int left = 0;int right = arr.length - 1;while (left <= right && target >= arr[left] && target <= arr[right]) {int pos = left + ((target - arr[left]) * (right - left)) / (arr[right] - arr[left]);if (arr[pos] == target) {return pos;} else if (arr[pos] < target) {left = pos + 1;} else {right = pos - 1;}}return -1;}public static void main(String[] args) {int[] arr = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};int target = 60;System.out.println("Index of " + target + ": " + interpolationSearch(arr, target)); // 輸出 5}
}

? 4. 斐波那契查找(Fibonacci Search)

說明:

基于斐波那契數列對數組進行分割,也是一種適用于有序數組的查找算法,平均性能與二分查找相當,但減少除法運算,在某些硬件環境下效率更高。

Java 實現:

public class FibonacciSearch {public static int fibonacciSearch(int[] arr, int target) {int n = arr.length;int[] fib = new int[20];fib[0] = 0;fib[1] = 1;int i = 1;while (fib[i] < n) {fib[++i] = fib[i - 1] + fib[i - 2];}int offset = 0;while (fib[i] > 1) {int k = Math.min(offset + fib[i - 2], n - 1);if (arr[k] < target) {offset = k;fib[i] = fib[i - 1];fib[i - 1] = fib[i - 2];i--;} else if (arr[k] > target) {fib[i] = fib[i - 2];fib[i - 1] = fib[i - 1] - fib[i - 2];i--;} else {return k;}}if (fib[i - 1] == 1 && arr[offset + 1] == target) {return offset + 1;}return -1;}public static void main(String[] args) {int[] arr = {1, 3, 5, 7, 9, 11, 13, 15};int target = 9;System.out.println("Index of " + target + ": " + fibonacciSearch(arr, target)); // 輸出 4}
}

? 查找算法對比表

查找算法數據要求時間復雜度空間復雜度特點
線性查找無序數組O(n)O(1)簡單,適合小數據量
二分查找有序數組O(log n)O(1)高效,常用
插值查找有序數組(分布均勻)O(log log n) ~ O(n)O(1)數據均勻時性能更好
斐波那契查找有序數組O(log n)O(1)避免除法,適合特定環境

? 總結

  • 線性查找:最簡單,但效率低,適合小數據或無序數組。
  • 二分查找:最常用,適用于有序數組,效率高。
  • 插值查找:適用于數據分布均勻的場景,性能優于二分查找。
  • 斐波那契查找:減少除法操作,適合某些硬件環境,實現稍復雜。

在實際開發中,根據數據是否有序、數據分布、性能需求等選擇合適的查找算法。

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

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

相關文章

二刷 黑馬點評 附近商戶

附近商戶-GEO數據結構的基本用法 GEO就是Geolocation的簡寫形式&#xff0c;代表地理坐標 Redis在3.2版本中加入了對GEO的支持&#xff0c;允許存儲地理坐標信息&#xff0c;幫助我們根據經緯度來檢索數據。常見的命令有&#xff1a;GEOADD&#xff1a;添加一個地理空間信息&am…

【vue-3】深入理解 Vue 3 中的 v-if 指令:條件渲染的藝術

在 Vue.js 的世界中&#xff0c;條件渲染是構建動態界面的核心概念之一。作為 Vue 3 中最常用的指令之一&#xff0c;v-if 提供了強大的能力來控制元素的顯示與隱藏。本文將深入探討 v-if 的工作原理、最佳實踐以及它在 Vue 3 中的新特性。 1. 什么是 v-if&#xff1f; v-if 是…

【實時Linux實戰系列】實時系統中的內存策略

在實時系統中&#xff0c;內存管理是確保系統性能和穩定性的重要組成部分。實時系統通常需要快速響應和低延遲&#xff0c;因此高效的內存管理策略對于實現這些目標至關重要。實時 Linux 提供了多種內存管理機制&#xff0c;如使用大型頁面&#xff08;Huge Pages&#xff09;和…

【C語言進階】題目練習(2)

目錄 題目6:看代碼說結果 分析&#xff1a; 答案&#xff1a;255 題目7&#xff1a;猜名次 分析&#xff1a; 題目8&#xff1a;猜兇手 分析&#xff1a; 代碼&#xff1a; 題目9&#xff1a;打印楊輝三角 思路: 代碼: 題目10&#xff1a;關于指針的選擇題 答案&a…

思科NAT綜合實驗

1 實驗拓撲圖2實驗目的(1)鞏固前面實驗的配置(2)掌握四種NAT的配置(3)明白四種NAT的區別3實驗步驟3.1配置邊界路由器和外網路由器的端口IP三個步驟&#xff1a;進入端口 打開端口 配置IP地址和子網掩碼interface f0/0 no shutdown ip address 192.168.201.2 255.255.255.03.2配…

VMC850立式加工中心Y軸傳動機械結構設計cad【7張】三維圖+設計說明書

摘 要 數控機床作為現代工業生產的重要設備&#xff0c;對國民經濟的發展有著重要的作用&#xff0c;立式加工中心作為數控加工技術的核心&#xff0c;通過對其研究&#xff0c;可以深入了解數控技術未來的發展方向。本文主要完成了VMC850立式加工中心Y軸的機械傳動結構設計&am…

mpiigaze的安裝過程一

mpiigaze鏈接 mpiigaze應該不是作者本人寫的&#xff0c;而是社區工作者的杰作&#xff0c;對原論文Appearance-Based Gaze Estimation in the Wild的代碼進行的一些復現 1.創建conda環境 2.問題 Building wheels for collected packages: dlibBuilding wheel for dlib (py…

如何將華為文件傳輸到電腦

在數字管理領域&#xff0c;將華為設備上的文件傳輸到電腦是高頻需求。無論為了備份、緩解手機存儲壓力&#xff0c;還是跨平臺訪問&#xff0c;把華為手機連接電腦已成為許多用戶的剛需。下面介紹 5 種高效方法&#xff0c;可滿足不同場景與偏好&#xff0c;助你輕松完成文件遷…

LP-MSPM0G3507學習--05中斷及管腳中斷

關鍵函數&#xff1a; NVIC_EnableIRQ(IRQn_Type IRQn)&#xff1a;使能中斷 例5-1&#xff1a;單按鍵中斷方式實現led燈的亮滅 在上一講LP-MSPM0G3507學習--04GPIO控制中實現了通過按鍵控制led燈的亮滅&#xff0c;可以看出程序效率不高&#xff0c;下面采用中斷的方式實現…

mac系統安裝、啟動Jenkins,創建pytest接口自動化任務

先安裝Homebrew&#xff1a;mac系統安裝brew-CSDN博客 1、安裝Jenkins # 可以安裝長期支持版本 brew install jenkins-lts# 或者最新版本&#xff08;我安了這個&#xff09; brew install jenkins 可查看Jenkins安裝位置&#xff1a; # 最新版本 brew --prefix jenkins 2、…

設置第三方窗口置頂(SetWindowPos方法,vb.net)

起源在日常辦公、游戲時&#xff0c;我們經常需要一些窗口處于置頂狀態&#xff0c;而這些窗口往往是網頁端&#xff08;瀏覽器&#xff09;、辦公軟件&#xff08;wps、office等&#xff09;&#xff0c;這些需要置頂的窗口往往自身沒有明顯的置頂開關&#xff0c;因此&#x…

Docker-下載和安裝

一、Linux版 1.安裝docker &#xff08;1&#xff09;更新軟件包索引 sudo apt update &#xff08;2&#xff09;安裝必要的依賴 sudo apt install apt-transport-https ca-certificates curl software-properties-common &#xff08;3&#xff09;添加 Docker 官方 GP…

電腦DLL錯誤修復dll微軟運行庫工具修復dll缺失找不到dll等問題,dll免費修復工具

解決DLL文件缺失問題&#xff1a;我的使用體驗與建議 在使用電腦的過程中&#xff0c;我們常常會遇到軟件或系統報錯&#xff0c;例如“無法找到指定模塊”或“缺少某.dll文件”等提示。DLL&#xff08;動態鏈接庫&#xff09;是Windows系統中不可或缺的組件&#xff0c;為應用…

HTTPS的工作原理及DNS的工作過程

HTTPSHTTP協議安全上存在以下三個風險&#xff1a;完整性 可用性 保密性竊聽風險&#xff0c;比如通信鏈路上可以獲取通信內容&#xff0c;用戶號容易沒。篡改風險&#xff0c;比如強制植入垃圾廣告&#xff0c;視覺污染&#xff0c;用戶眼容易瞎。冒充風險&#xff0c;比如冒充…

VisualXML全新升級 | 新增BusLoad計算

VisualXML是一個功能強大的網絡總線設計工具&#xff0c;專注于簡化汽車電子系統中復雜的網絡數據設計操作。該軟件支持多種主流總線網絡格式的數據編輯&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能夠基于Excel表格的方式生成和轉換多種數據庫文件。由此…

李天意考研數學精講課學習筆記(課堂版)

視頻鏈接&#xff1a;【考研數學精講課李天意】基礎強化真題&#xff0c;概念精講與解題技巧&#xff08;適用數學一/二/三&#xff09;_嗶哩嗶哩_bilibili 講義&#xff1a;夸克網盤分享 高數6 不定積分

閑庭信步使用圖像驗證平臺加速FPGA的開發:第二十三課——圖像直方圖和灰度圖像疊加的FPGA實現

&#xff08;本系列只需要modelsim即可完成數字圖像的處理&#xff0c;每個工程都搭建了全自動化的仿真環境&#xff0c;只需要雙擊top_tb.bat文件就可以完成整個的仿真&#xff0c;大大降低了初學者的門檻&#xff01;&#xff01;&#xff01;&#xff01;如需要該系列的工程…

C++并發編程-14. 利用柵欄實現同步

前文我們通過原子操作實戰實現了無鎖隊列&#xff0c;今天完善一下無鎖的原子操作剩余的知識&#xff0c;包括Relaese和Acquire內存序在什么情況下是存在危險的&#xff0c;以及我們可以利用柵欄機制實現同步等等。 線程可見順序 我們提到過除了memory_order_seq_cst順序&#…

如何選擇旅游科技行業云ERP?Oracle NetSuite助力匯智國際數智化升級

2025年4月21日&#xff0c;匯智國際旅游發展有限公司&#xff08;以下簡稱匯智國際&#xff09;攜手 Oracle NetSuite與Hitpoint Cloud &#xff0c;共同參與了匯智國際 Oracle NetSuite 云ERP 項目啟動會。 本次會議標志著匯智國際在數字化轉型道路上邁出了堅實而關鍵的一步&…

深度學習零基礎入門(3)-圖像與神經網絡

好久不見~我又回來了 這一節我們來講一講圖像在計算機中的本質&#xff0c;以及全連接神經網絡的缺陷&#xff0c;進而引出卷積神經網絡一、圖像在計算機中的本質 不知道你有沒有學過數據結構&#xff0c;在講這一部分的時候對數組進行了擴展&#xff0c;講到了廣義表和壓縮矩陣…