二分查找 ||蟒蛇 ||資料結構和演算法
二分查找
二分搜尋是一種重複將搜尋空間一分為二的演算法。這種搜尋技術遵循分而治之的策略。每次迭代中搜尋空間總是減少一半。導致時間複雜度為 O(log(n)),其中 n 為元素數。
條件:陣列應該是排序的,但它們也可以應用於單調函數,我們需要找到單調遞增或單調遞減。
當我們需要以對數時間縮小搜尋空間時,它就有效。
我們使用兩個指針,左指針和右指針。取左右的平均值來找出中間元素。
現在,我們根據條件檢查應該將左右指針移到哪裡。
解決一個問題主要需要三個步驟:
- 預處理: 如果輸入未排序,則對輸入進行排序。
- 二分查找:使用兩個指標並找到中間部分來劃分搜尋空間,然後相應地選擇正確的一半。
- 後處理:決定輸出。
二分搜尋演算法的優點 - 對於大數據,二分搜尋比線性搜尋更快,因為它每次將數組切成兩半,而不是逐一檢查每個元素。這使得它更快、更有效率。
限制:二分查找僅適用於已排序的數組,因此對於小型未排序數組效率不高,因為排序需要額外的時間。對於小型記憶體搜索,它的效果也不如線性搜索。
應用: 用於在排序數組中搜尋元素,時間複雜度為 O(log(n)),也可用於尋找數組中的最小或最大元素。
基本二分查找程式碼 -
程式碼
def binarySearch(nums, target): if len(nums) == 0: return -1 left, right = 0, len(nums) - 1 while left <= right: mid = (left + right) // 2 if nums[mid] == target: return mid elif nums[mid] < target: left = mid + 1 else: right = mid - 1 # End Condition: left > right return -1
33。在旋轉排序數組中搜尋
給定可能旋轉後的陣列 nums 和整數目標,如果目標在 nums 中,則傳回目標索引,如果不在 nums 中,則傳回 -1。
您必須編寫一個運行時間複雜度為 O(log n) 的演算法。
範例1:
輸入:nums = [4,5,6,7,0,1,2],目標 = 0
輸出:4
範例2:
輸入:nums = [4,5,6,7,0,1,2],目標 = 3
輸出:-1
範例3:
輸入:nums = [1],目標 = 0
輸出:-1
程式碼
def binarySearch(nums, target): if len(nums) == 0: return -1 left, right = 0, len(nums) - 1 while left <= right: mid = (left + right) // 2 if nums[mid] == target: return mid elif nums[mid] < target: left = mid + 1 else: right = mid - 1 # End Condition: left > right return -1
- 使用左右兩個指針,迭代直到它們重疊。
- 找出中間元素。
- 由於陣列已排序但已旋轉,我們不能簡單地將左側或右側的元素與中間的元素進行比較。
- 首先,透過比較中指標與左指標或右指標來決定左部分或右部分排序。
- 根據這個結論,相應地調整指針。
時間複雜度 - O(log(n)),因為搜尋空間在每次迭代中被分成兩半。
空間複雜度 - O(1)
單調遞增
162。求峰值元素
峰值元素是嚴格大於其鄰居的元素。
給定一個 0 索引的整數數組 nums,找到一個峰值元素,並傳回其索引。如果數組包含多個峰值,則傳回任意峰值的索引。
您可能會想像 nums[-1] = nums[n] = -∞。換句話說,一個元素總是被認為嚴格大於數組外部的鄰居。
您必須編寫一個在 O(log n) 時間內執行的演算法。
範例1:
輸入:nums = [1,2,3,1]
輸出:2
說明:3 是峰值元素,您的函數應傳回索引號 2。
範例2:
輸入:nums = [1,2,1,3,5,6,4]
輸出:5
說明:您的函數可以傳回索引號 1(峰值元素為 2)或索引號 5(峰值元素為 6)。
程式碼
class Solution: def search(self, nums: List[int], target: int) -> int: left = 0 right = len(nums)-1 while left <= right: mid = (left + right)//2 print(f'left is {left},right is {right} and mid is {mid}') if nums[mid]==target: return mid if nums[mid] >= nums[left]: # if nums[mid]< target and target >= nums[left]: if nums[left] <= target < nums[mid]: right = mid -1 else: left = mid +1 else: # if nums[mid] < target and target <= nums[right]: if nums[mid] < target <= nums[right]: left = mid +1 else: right = mid - 1 return -1
- 在此類問題中,我們需要透過比較中間的左側或右側元素來檢查峰值。
- 這有助於確定圖表趨勢是向上還是向下。
- 要找出最大值,請搜尋向上的斜率並探索正確的子空間。
- 要找出最小值,請搜尋左側子空間
時間複雜度 - O(log(n)),因為搜尋空間在每次迭代中被分成兩半。
空間複雜度 - O(1)
以上是二分查找 ||蟒蛇 ||資料結構和演算法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

Python更易學且易用,C 則更強大但複雜。 1.Python語法簡潔,適合初學者,動態類型和自動內存管理使其易用,但可能導致運行時錯誤。 2.C 提供低級控制和高級特性,適合高性能應用,但學習門檻高,需手動管理內存和類型安全。

要在有限的時間內最大化學習Python的效率,可以使用Python的datetime、time和schedule模塊。 1.datetime模塊用於記錄和規劃學習時間。 2.time模塊幫助設置學習和休息時間。 3.schedule模塊自動化安排每週學習任務。

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

Python在自動化、腳本編寫和任務管理中表現出色。 1)自動化:通過標準庫如os、shutil實現文件備份。 2)腳本編寫:使用psutil庫監控系統資源。 3)任務管理:利用schedule庫調度任務。 Python的易用性和豐富庫支持使其在這些領域中成為首選工具。
