微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Swift 中以前提条件获取子序列的有效方法

如何解决在 Swift 中以前提条件获取子序列的有效方法

我有一个有序的数字序列,比如说

0,1,2,3,5,6,11,12,15,20

给定一个数字 N,我怎样才能得到一个从最后一个小于 N 的数字开始的序列?例如,如果 N = 7,我想回来

6,20

请注意,这个序列会变得非常大,并且会附加新的数字。

drop(while:) 似乎是一个不错的候选对象,但在上面的示例中,它也会删除 6,因此我无法使用它。

解决方法

对于巨大的排序数组,最有效的方法是二分查找。它将数组切成两半,直到找到索引。

extension RandomAccessCollection where Element : Comparable {
    func lastIndex(before value: Element) -> Index {
        var slice : SubSequence = self[...]

        while !slice.isEmpty {
            let middle = slice.index(slice.startIndex,offsetBy: slice.count / 2)
            if value < slice[middle] {
                slice = slice[..<middle]
            } else {
                slice = slice[index(after: middle)...]
            }
        }
        return slice.startIndex == self.startIndex ? startIndex : index(before: slice.startIndex)
    }
}

let array = [0,1,2,3,5,6,11,12,15,20]
let index = array.lastIndex(before: 7)
print(array[index...])

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。