Arrays 查找距离目标最近的x个数组元素数

Arrays 查找距离目标最近的x个数组元素数,arrays,swift,Arrays,Swift,我有一个可能包含1000+个元素的数组,我有一个动态目标数,我想得到与目标数最接近的x个元素数。 例如: let targetNumber = 1000.0 let matches = 5 let array = [1000,2000,3000,4000,5000,6000,7000,8000,9000,10000,11000,12000,13000,14000,15000,16000,17000] 如果x是5,我需要对结果进行如下过滤:[10002000300040006000] 如果目标

我有一个可能包含1000+个元素的数组,我有一个动态目标数,我想得到与目标数最接近的x个元素数。 例如:

let targetNumber = 1000.0
let matches = 5

let array = [1000,2000,3000,4000,5000,6000,7000,8000,9000,10000,11000,12000,13000,14000,15000,16000,17000]
如果x是5,我需要对结果进行如下过滤:
[10002000300040006000]

如果目标数字是10000,我需要基本上颠倒结果,
[100009008000700060005000]

数组可以排序,也可以不排序。使用Swift实现这一结果的最佳和最有效的方法是什么?

试试这个

let closestToTarget = array.filter { array.index(of: $0)! <= array.index(of: targetNumber)! && array.index(of: targetNumber)! - array.index(of: $0)! <= 5 }.reversed() as [Int]

让closestToTarget=array.filter{array.index(of:$0)!让我们定义一些测试数据。让我们有一个函数:

func getClosest(count: Int, from values: [Int], to targetNumber: Int) -> [Int]
我们将测试以下各项:

let array = [1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000, 11000, 12000, 13000, 14000, 15000, 16000, 17000]
print(getClosest(count: 5, from: array, to: 1000))
print(getClosest(count: 5, from: array, to: 10000))
一个简单的实现是按到目标编号的距离对数组进行排序,并获取第一个X值:

func getClosest(count: Int, from values: [Int], to targetNumber: Int) -> [Int] {
    let getDistance: (Int) -> Int = {
        return abs(targetNumber - $0)
    }

    return Array(
        values
        .sorted { getDistance($0) < getDistance($1) }
        .prefix(count)
    )
}
这基本上只会对内部数组进行排序,但请注意优先级队列的接口是什么样子的

然后我们可以通过以下方式实现我们的功能:

func getClosest(count: Int, from values: [Int], to targetNumber: Int) -> [Int] {
    let getDistance: (Int) -> Int = {
        return abs(targetNumber - $0)
    }

    var queue = PriorityQueue<Int, Int>()

    for value in values {
        queue.insert(element: value, priority: -getDistance(value))
        if queue.count > count {
            _ = queue.pop()
        }
    }

    return queue.getElements()
}
func getClosest(计数:Int,从值:[Int],到目标编号:Int)->[Int]{
让getDistance:(Int)->Int={
返回abs(目标编号-$0)
}
var queue=PriorityQueue()
价值中的价值{
插入(元素:值,优先级:-getDistance(值))
如果queue.count>count{
_=queue.pop()
}
}
返回队列。getElements()
}
现在,对于优先级队列的简单实现,这根本无助于降低复杂性,但如果我们更好地实现优先级队列,它就会工作

优先级队列通常使用或更具体地说是使用来实现的


一旦理解了算法,实现它们并不复杂,但已经有一些实现。例如,请参阅。

最好的性能是使用堆数据结构,但您可以按距离对它们进行排序。请参阅并使用距离作为优先级。@Sulthan,谢谢,我来看看。这并不是我想要的如果目标数字是1000,就像上面的例子一样,它只会返回1000。但是谢谢!我只写第二个条件的答案,因为第一个条件不清楚。例如,如果目标数字是2000,怎么办?是否也要反转结果?无论如何,如果目标数小于x,只需为目标添加另一个条件并修改我的答案以得到您需要的。简明,为我指出了我想要的确切结果。谢谢。
func getClosest(count: Int, from values: [Int], to targetNumber: Int) -> [Int] {
    let getDistance: (Int) -> Int = {
        return abs(targetNumber - $0)
    }

    var queue = PriorityQueue<Int, Int>()

    for value in values {
        queue.insert(element: value, priority: -getDistance(value))
        if queue.count > count {
            _ = queue.pop()
        }
    }

    return queue.getElements()
}