目標(biāo):在數(shù)組中查找特定值。
我們有一個(gè)對象的數(shù)組。使用線性搜索,我們遍歷數(shù)組中的所有對象,并將每個(gè)對象與我們要查找的對象進(jìn)行比較。如果兩個(gè)對象相等,我們停止搜索并返回當(dāng)前數(shù)組的索引。如果沒有,我們繼續(xù)尋找下一個(gè)對象,直到所有對象都被搜索。
舉個(gè)栗子
假設(shè)我們有一個(gè)數(shù)字?jǐn)?shù)組 [5, 2, 4, 7]
,我們想檢查數(shù)組是否包含數(shù)字 2
。
我們首先比較數(shù)組中的第一個(gè)數(shù)字, 5
,去和 2
比較,它們顯然不一樣,所以我們繼續(xù)下一個(gè)數(shù)組元素。
我們將數(shù)組的第2個(gè)元素 2
與 2
進(jìn)行比較,注意它們是相等的。現(xiàn)在我們就可以停止搜索并返回?cái)?shù)組索引 1
了。
代碼
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) // 返回 1
性能
線性搜索的性能是 O(n) ,它會比較數(shù)組中的每個(gè)元素,所需的時(shí)間與數(shù)組的長度成正比。在最壞的情況下,我們需要查看數(shù)組中的所有元素。
最好的情況是 O(1) ,但這種情況很罕見,我們尋找的元素正巧在數(shù)組的最開頭,會在第一次比較中被找到。你可能會幸運(yùn),但大部分時(shí)間你不會。 平均來說,線性搜索需要查看數(shù)組中一半的對象。
英文鏈接:
https://github.com/raywenderlich/swift-algorithm-club/blob/master/Linear%20Search/README.markdown