Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 根据范围序列测试序列中的每个数字最有效的方法是什么?_Arrays_Swift - Fatal编程技术网

Arrays 根据范围序列测试序列中的每个数字最有效的方法是什么?

Arrays 根据范围序列测试序列中的每个数字最有效的方法是什么?,arrays,swift,Arrays,Swift,我有两个数组。第一个序列是双打列表。第二个是范围列表。序列和数组的长度始终相同。测试第一个数组中的每个元素是否在第二个数组中相同索引的范围内的最有效方法是什么 有没有一种有效的方法可以通过某种矩阵库来实现这一点 我试图实现的目标的一小部分: let A: [Double] = [1, 2, 3, 4, 5] let B: [Range] = [0..2, 1..3, 2..4, 5..6, 7..8] // TODO: Test each item in A against the range

我有两个数组。第一个序列是双打列表。第二个是范围列表。序列和数组的长度始终相同。测试第一个数组中的每个元素是否在第二个数组中相同索引的范围内的最有效方法是什么

有没有一种有效的方法可以通过某种矩阵库来实现这一点

我试图实现的目标的一小部分:

let A: [Double] = [1, 2, 3, 4, 5]
let B: [Range] = [0..2, 1..3, 2..4, 5..6, 7..8]

// TODO: Test each item in A against the range in B at the same index
// e.g. (0..2).contains(1) && (1..3).contains(2) && ... so on

如果所有项目都匹配,我希望以True结束,否则以false结束。我需要在循环中执行此测试,以便找到进行此比较的最有效方法。

您可以执行以下操作:

let doubles: [Double] = [1.0, 2.0, 4.7, 2.5, 1.1]
let ranges: [ClosedRange<Double>] = [0...2, 1...2, 1...5, -1...3, 1...2]

let result = zip(doubles, ranges).allSatisfy { $1.contains($0) }
let Double:[Double]=[1.0,2.0,4.7,2.5,1.1]
let ranges:[ClosedRange]=[0…2,1…2,1…5,-1…3,1…2]
让result=zip(双精度,范围).allsummit{$1.contains($0)}

result
是一个bool,如果给定的双精度在给定的范围内,则它应该是
true
,否则,它应该是
false
。请记住,如果两个数组的计数不同,则结果将是
false

我可能会这样做:

func all(_ values: [Double], in ranges: [Range<Double>]) -> Bool {
    zip(values, ranges).allSatisfy { $1 ~= $0 }
}
func all(u值:[Double],范围:[Range])->Bool{
zip(值,范围).allconfiet{$1~=$0}
}
因此

let值:[Double]=[1,4,3]
let ranges:[范围]=[

0..那么,你想确保A中的第一个双精度值在B中的第一个范围内,第二个双精度值在第二个范围内,依此类推?@HalR-是的。没错,可能有比使用矩阵库计算答案更快的方法,但你需要重新组织数据以优化矩阵运算。这将可能会使程序的其他部分变得更复杂(或需要以不同的格式复制信息)。这里的“最有效”真的很重要吗,还是说“相当快”(以下是答案)?使其绝对最有效还取决于出现问题的可能性。如果可能出现故障,矩阵的计算往往会超出必要范围。(这是程序中如此重要的一部分,值得将一个非常快的单行操作转换为需要重新组织数据结构的复杂代码页吗?)当然,使用一些simd的混合解决方案可能仍然非常有用,但它们不是此问题的通用解决方案;它们将是您问题的自定义解决方案。在这些频率下,您确实需要考虑内存局部性、内存缓存和复制等问题。您需要一个完整问题的良好、诚实的基准我的第一个目标当然是重新设计以减少所需的频率,或者允许更多的局部搜索。只做更少的工作总是一个巨大的胜利。)你认为
lazy
在这里很重要吗?我想
allsuccess
应该懒散地迭代而不是急切地迭代。事实上,
lazy
是不需要的。删除。翻转它!
let values: [Double] = [1,4,3]
let ranges: [Range<Double>] = [
    0..<3,
    1..<5,
    2..<6
]

let result = all(values, in: ranges)
func all<T, U: RangeExpression>(_ values: [T], in ranges: [U]) -> Bool where U.Bound == T {
    zip(ranges, values).allSatisfy(~=)
}