【譯】Swift演算法俱樂部-線性搜尋
本文是對 ofollow,noindex">Swift Algorithm Club 翻譯的一篇文章。
Swift Algorithm Club 是 raywenderlich.com 網站出品的用Swift實現演算法和資料結構的開源專案,目前在GitHub上有18000+:star:️,我初略統計了一下,大概有一百左右個的演算法和資料結構,基本上常見的都包含了,是iOSer學習演算法和資料結構不錯的資源。
:octopus: andyRon/swift-algorithm-club-cn 是我對Swift Algorithm Club,邊學習邊翻譯的專案。歡迎有興趣學習演算法和資料結構,有時間的小夥伴一起參與翻譯,歡迎issue,或者直接提交pull request。
本文的翻譯原文和程式碼可以檢視:octopus: swift-algorithm-club-cn/Linear Search
目標:在陣列中查詢特定值。
我們有一組通用物件。 通過線性搜尋,我們迭代陣列中的所有物件,並將每個物件與我們正在尋找的物件進行比較。 如果兩個物件相等,我們停止並返回當前物件在陣列中的索引。 如果不相等,只要陣列中還有物件,我們就會繼續尋找下一個。
一個例子
假設我們有一個數組 [5,2,4,7]
,我們想檢查陣列是否包含數字 2
。
我們首先將陣列中的第一個數字 5
與我們正在尋找的數字 2
進行比較。 它們顯然不一樣,所以我們繼續比較下一個陣列元素。
我們將陣列中的數字 2
與數字 2
進行比較,注意到它們是相等的。 現在我們可以停止迭代並返回1,這是陣列中數字 2
的索引。
程式碼
這是Swift線性搜尋的簡單實現:
func linearSearch<T: Equatable>(_array: [T],_object: T) -> Int? { for (index, obj) in array.enumerated() where obj == object { return index } return nil }
將此程式碼放在playground裡測試:
let array = [5, 2, 4, 7] linearSearch(array, 2) // This will return 1
效能
線性搜尋效能是 O(n) 。它將我們要查詢的物件與陣列中的每個物件進行比較,因此它所花費的時間與陣列長度成正比。在最壞的情況下,我們需要檢視陣列中的所有元素。
最好的情況是 O(1) ,但這種情況很少見,因為我們要查詢的物件必須位於陣列的開頭才能立即找到。你可能會很幸運,但大部分時間你都不會。平均而言,線性搜尋需要檢視陣列中物件的一半。