@Shabnam Siddiqui 的答案是 Swifty,我大部分时间都会使用它,但二进制搜索也值得了解。
O(n) 复杂度中的 Swift 方法 first(where:)
https://developer.apple.com/documentation/swift/array/1848165-first,而二分查找的最坏情况性能为 O(log n),最佳情况性能为 O(1)。
所以假设:
struct Player {
var id : Int
var name : String
}
为:
var players : [Player] = [
Player(id: 0, name: "Bob"),
Player(id: 1, name: "Edd"),
Player(id: 2, name: "Jo"),
Player(id: 3, name: "John")
]
递归解法:
func getPlayername(_ id : Int, _ players : [Player]) -> String?{
guard players.count > 0 else {
print("No players found with id \(id)")
return nil
}
if players.first!.id == id {
return players.first?.name
}else{
return getPlayername(id, Array(players.dropFirst()))
}
}
print(getPlayername(3, players))
解决方案二进制:
func getPlayerBinary(_ id : Int, _ players : [Player]) -> String?{
var startIndex = 0
var max = players.count
while startIndex < max {
let midIndex = startIndex + (max - startIndex) / 2
if players[midIndex].id == id {
return players[midIndex].name
} else if players[midIndex].id < id {
lowerBound = midIndex + 1
} else {
max = midIndex
}
}
print("No players found with id \(id)")
return nil
}
https://www.geeksforgeeks.org/binary-search/