儘管已找到,陣列仍報告'未找到”:令人困惑的搜索困境
P粉546179835
P粉546179835 2023-12-26 18:39:31
0
1
476

這是一個邏輯錯誤的通用問題和答案,我在新程式設計師用各種語言提出的許多問題中都看到過。

問題是在陣列中搜尋與某些輸入條件相符的元素。演算法的偽代碼如下所示:

for each element of Array:
    if element matches criteria:
        do something with element
        maybe break out of loop (if only interested in first match)
    else:
        print "Not found"

即使成功找到匹配元素,此程式碼也會報告「未找到」。

P粉546179835
P粉546179835

全部回覆(1)
P粉080643975

問題是,當您透過數組線性搜尋某些內容時,直到到達數組末尾時您才知道沒有找到它。問題中的程式碼針對每個不匹配的元素報告“未找到”,即使可能存在其他匹配元素。

簡單的修改是使用一個變數來追蹤您是否發現了某些內容,然後在循環結束時檢查該變數。

found = false
for each element of Array:
    if element matches criteria:
        do something with element
        found = true
        maybe break out of loop (if only interested in first match)

if not found:
    print "Not found"

Python 在其 for 迴圈中有一個 else: 區塊。僅當循環運行完成時才執行程式碼,而不是因為使用 break 而結束。這使您可以避免 found 變數(儘管它可能對以後的處理仍然有用):

for element in someIterable:
    if matchesCriteria(element):
        print("Found")
        break
else:
    print("Not found")

某些語言具有內建機制,可以使用這些機制來取代編寫自己的循環。

  • 某些語言具有 anysome 函數,它們接受回呼函數,並傳回一個布林值,指示函數對於陣列的任何元素是否成功。
  • 如果語言具有數組過濾功能,則可以使用檢查條件的函數過濾輸入數組,然後檢查結果是否為空數組。
  • 如果您嘗試精確匹配某個元素,大多數語言都提供 findindex 函數來搜尋匹配元素。

如果您要頻繁搜索,最好將數組轉換為可以更有效搜索的資料結構。大多數語言提供集合和/或哈希表資料結構(後者根據語言有許多名稱,例如關聯數組、映射、字典),這些通常是搜尋的時間為O(1),而掃描數組的時間為O(n)。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!