gpt4 book ai didi

arrays - 创建更小的均匀分布数组

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:07:20 25 4
gpt4 key购买 nike

我正在尝试从一个较大的数组创建一个较小的数组。

我需要数组中的项目均匀分布以匹配更大的数组。

例如,较大的数组包含 420 个项目。较小的数组包含 375。

我能够使用以下代码在合理的误差范围内获得我正在寻找的结果:

var smallArray = []
let smallArraySize = 375
//largeArray contains 420 items
let difference = largeArray.count - smallArraySize
let step = ceil(largeArray.count / smallArraySize)

for (index, item) in largeArray.enumerated {
if index % Int(step) != 0 {
smallArray.append(item)
}
}

这会产生一个包含 373 个项目的 smallArray。这达到了我的要求。

但是,如果大数组包含更多项,例如 1020,则此方法不再有效。

具体来说,当difference 大于smallArraySize 时,这似乎是一个问题。

对更大的数字使用相同的代码会导致 step 为 1,因此新数组为空。

最佳答案

如果将每个索引从较小的数组映射到较大数组的合适索引,则可以创建一个具有“几乎均匀分布”元素的子数组:

extension Array {
func subArray(withSize n: Int) -> [Element] {
precondition(n >= 0 && n <= count)
return (0..<n).map { self[($0 * count + count/2)/n] }
}
}

例子:

let array = [0, 1, 2, 3, 4, 5, 6, 7]

print(array.subArray(withSize: 1)) // [4]
print(array.subArray(withSize: 2)) // [2, 6]
print(array.subArray(withSize: 3)) // [1, 4, 6]
print(array.subArray(withSize: 4)) // [1, 3, 5, 7]
print(array.subArray(withSize: 5)) // [0, 2, 4, 5, 7]
print(array.subArray(withSize: 6)) // [0, 2, 3, 4, 6, 7]
print(array.subArray(withSize: 7)) // [0, 1, 2, 4, 5, 6, 7]
print(array.subArray(withSize: 8)) // [0, 1, 2, 3, 4, 5, 6, 7]

下图大致显示了如何从八个元素中挑选出三个元素:

┌──┬──┬──┬──┬──┬──┬──┬──┐│ 0│ 1│ 2│ 3│ 4│ 5│ 6│ 7│└──┴──┴──┴──┴──┴──┴──┴──┘    ⬆      ⬆      ⬆︎   ┌───────┬───────┬───────┐│   0   │   1   │   2   │└───────┴───────┴───────┘

关于arrays - 创建更小的均匀分布数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55144229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com