Python 陣列元素搜尋程式


在 Python 中,主要使用兩種搜尋演算法。第一種是線性搜尋,第二種是二分搜尋。

這兩種技術主要用於從給定陣列或列表中搜索元素。在搜尋元素時,任何演算法都可以遵循兩種方法。一種是遞迴方法,另一種是迭代方法。讓我們討論這兩種演算法的兩種方法,並解決類似的問題。

線性搜尋

線性搜尋技術也稱為順序搜尋。“順序搜尋”的名稱含義完全符合該搜尋演算法所遵循的過程。這是一種用於在 Python 的陣列或列表中查詢元素的方法或技術。

它被認為是所有其他搜尋演算法中最簡單、最容易的一種。但是,該演算法的唯一缺點是效率不高。這就是不經常使用線性搜尋的主要原因。

演算法

  • 步驟 1 − 它只是透過將所需元素與給定陣列中的每個元素進行比較,按順序搜尋元素。

  • 步驟 2 − 如果找到所需元素,則會向用戶顯示元素的索引或位置。

  • 步驟 3 − 如果陣列中不存在該元素,則會通知使用者未找到該元素。透過這種方式,演算法得到處理。

通常,線性搜尋演算法對於大小小於或等於 100 的小型陣列或小型列表比較合適且高效,因為它會檢查並與每個元素進行比較。

  • 如果所需元素位於陣列的最後位置,則會消耗更多時間。

  • 線性搜尋演算法的最佳情況時間複雜度為“O(1)”。在這種情況下,元素將位於陣列的第一個位置,即索引為“0”。

  • 線性搜尋演算法的平均情況時間複雜度為“O(n)”。在這種情況下,元素將位於陣列的中間位置,即索引為“(n – 1) / 2”或“((n – 1) / 2) + 1”。

  • 線性搜尋演算法的最壞情況時間複雜度為“O(n)”。在這種情況下,元素將位於陣列的最後位置,即索引為“n-1”。

示例

在下面的示例中,我們將學習使用線性搜尋在陣列中搜索元素的過程。

def iterative_linear( arr, n, key_element):
   for x in range(n):
      if(arr[x] == key_element):
         return x
   return -1
arr = [2, 3, 5, 7, 9, 1, 4, 6, 8, 10]
max_size = len(arr)
key = 8
result = iterative_linear(arr, max_size - 1, key)
if result != -1:
   print ("The element", key," is found at the index " ,(result), "and in the ", (result+1), "position")
else:
   print ("The element %d is not present in the given array" %(key))

輸出

上述程式的輸出如下所示:

The element 8  is found at the index  8 and in the  9 position

示例(遞迴)

在下面的示例中,我們將學習使用遞迴方法的線性搜尋在陣列中搜索元素的過程。

def recursive_linear( arr, first_index, last_index, key_element):
   if last_index < first_index:
      return -1
   if arr[first_index] == key_element:
      return first_index
   if arr[last_index] == key_element:
      return last_index  
   return recursive_linear(arr, first_index + 1, last_index - 1, key_element)

arr = [2, 3, 5, 7, 9, 1, 4, 6, 8, 10]
max_size = len(arr)
key = 8
result = recursive_linear(arr, 0, max_size - 1, key)
if result != -1:
   print ("The element", key," is found at the index " ,(result), "and in the ", (result+1), "position")
else:
   print ("The element %d is not present in the given array" %(key))

輸出

上述程式的輸出如下所示:

The element 8  is found at the index  8 and in the  9 position

二分搜尋

二分搜尋演算法與線性搜尋演算法完全不同。它遵循完全不同的程式來從陣列中搜索元素。它通常只考慮排序後的陣列。

如果陣列在某些情況下未排序,則會對陣列進行排序,然後開始二分搜尋演算法的過程。一旦二分搜尋演算法考慮了陣列,它就會先對其進行排序,然後將演算法應用於陣列。

演算法

  • 步驟 1 − 排序陣列是首先執行的步驟。

  • 步驟 2 − 排序陣列後,陣列被視為兩半。一半是從第一個元素到排序陣列的中間元素,另一半是從中間元素後的元素到排序陣列的最後一個元素。

  • 步驟 3 − 將關鍵字元素(要搜尋的元素稱為關鍵字元素)與排序陣列的中間元素進行比較。

  • 步驟 4 − 如果關鍵字元素小於或等於排序陣列的中間元素,則忽略後半部分的元素,因為關鍵字元素小於中間元素。因此,該元素肯定位於第一個元素和中間元素之間。

  • 步驟 6 − 如果關鍵字元素大於中間元素,則忽略排序陣列的前半部分,並考慮從中間元素到最後一個元素的元素。

  • 步驟 7 − 從這些元素中,再次將關鍵字元素與減半陣列的中間元素進行比較,並重復相同的過程。如果關鍵字元素大於減半陣列的中間元素,則忽略前半部分。

  • 步驟 8 − 如果關鍵字元素小於或等於減半陣列的中間元素,則忽略減半陣列的後半部分。透過這種方式,相應地搜尋陣列的任一半中的元素。

因此,與線性搜尋相比,複雜度減少了一半或超過一半,因為在第一步本身就會刪除或不考慮一半的元素。二分搜尋的最佳情況時間複雜度為“O(1)”。二分搜尋的最壞情況時間複雜度為“O(logn)”。這就是二分搜尋演算法的工作原理。讓我們考慮一個例子,並應用二分搜尋演算法來找出陣列中存在的元素中的關鍵字元素。

示例

在這個例子中,我們將學習使用遞迴方法的二分搜尋在陣列中搜索元素的過程。

def recursive_binary(arr, first, last, key_element):
   if first <= last:
      mid = (first + last) // 2 
   if arr[mid] == key_element:
      return mid
   elif arr[mid] > key_element:
      return recursive_binary(arr, first, mid - 1, key_element)
   elif arr[mid] < key_element:  
      return recursive_binary(arr, mid + 1, last, key_element)  
   else:  
      return -1 

arr = [20, 40, 60, 80, 100] 
key = 80 
max_size = len(arr)
result = recursive_binary(arr, 0, max_size - 1, key)  
if result != -1:  
   print("The element", key, "is present at index", (result), "in the position", (result + 1)) 
else:  
   print("The element is not present in the array") 

輸出

上述程式的輸出如下所示:

The element 80  is found at the index 3 and in the position 4

示例

在這個例子中,我們將學習使用迭代方法的二分搜尋在陣列中搜索元素的過程。

def iterative_binary(arr, last, key_element):
   first = 0
   mid = 0
   while first <= last: 

      mid = (first + last) // 2 
      if arr[mid] < key_element:
         first = mid + 1 

      elif arr[mid] > key_element: 
         last = mid - 1 

      else: 
         return mid 

   return -1 

arr = [20, 40, 60, 80, 100] 
key = 80 
max_size = len(arr)

result = iterative_binary(arr, max_size - 1, key)  

if result != -1:  
   print("The element", key, "is present at index", (result), "in the position", (result + 1)) 
else:  
   print("The element is not present in the array")

輸出

上述程式的輸出如下所示:

The element 80  is found at the index 3 and in the position 4

這就是二分搜尋演算法的工作原理。根據起主要作用的時間複雜度概念,我們肯定可以說二分搜尋演算法比線性搜尋演算法更有效。透過這種方式,可以使用這種型別的演算法搜尋陣列的元素。雖然解決問題的過程不同,但結果不會波動。這是使用多種演算法來檢查輸出一致性的一種優勢。

更新於:2023年5月8日

6000+ 次瀏覽

啟動您的職業生涯

完成課程獲得認證

開始
廣告