我有一系列CGFloat。我还有一个任意值 a ,可以是任何CGFloat。我的问题是,如何有效地找到 a 介于哪个两个索引之间。附带说明一下, a 永远不会低于或大于数组的最小值或最大值,因此无需担心。
举个简单的例子,我可能有:
let array: [CGFloat] = [4, 7, 10, 22, 23, 25, 67]
// a can be any random number, this initialization is for the example
let a = 14
// some algorithm that calculates indexes
// code returns index 2 and 3 (or it returns items 10, 22)
我开发了一种涉及for循环的方法,但是,列表越大,代码效率越低。有没有更智能,更高效的代码?
感谢所有帮助:)
答案 0 :(得分:2)
您正在寻找的被称为中二进制搜索。这种方法Example #2的例子很多。请注意,如果传递的值小于第一个值,它将返回起始索引,而大于最后一个值的值将返回最后索引。
extension Collection where Element: Comparable, Index == Int {
func binarySearch(_ element: Element) -> Index {
var low = 0
var high = count - 1
while low < high {
let mid = low + ((high - low + 1) / 2)
let current = self[mid]
if current == element {
return mid
} else if current < element {
low = mid
} else {
high = mid - 1
}
}
return low
}
}
let array: [CGFloat] = [4, 7, 10, 22, 23, 25, 67]
let a = 14
let indexA = array.binarySearch(CGFloat(a)) // 2
let indexB = indexA + 1 // 3
答案 1 :(得分:0)
如果始终对数组进行排序,请使用:
mymetric.py