在数组中寻找周围的价值元素

时间:2020-09-28 13:19:57

标签: arrays swift for-loop indexing

我有一系列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循环的方法,但是,列表越大,代码效率越低。有没有更智能,更高效的代码?

感谢所有帮助:)

2 个答案:

答案 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