【问题标题】:Fast way to find min in an Array in Swift在 Swift 的数组中找到最小值的快速方法
【发布时间】:2015-03-26 09:23:29
【问题描述】:
let numbers = [1, 6, 3, 9, 4, 6]

let min = minElement(numbers) // 1
let position = find(array, min)!

有没有更好的方法来查找数组中次要元素的位置?循环搜索,这种情况下最快。

min = Int.max
for (index,value) in enumerate(array){
    if value < min{
        min = value
        position = index
    }
}

【问题讨论】:

  • “更好的方式”在什么意义上?找到最小值必须遍历所有元素,因此我认为没有什么比显式循环更快的了。
  • minElement 循环获取最小元素,find 循环获取最小元素的位置。我正在寻找一个循环。
  • 我的意思是你的第二个解决方案for (index,value) in enumerate(array) ... 对数组进行单次传递。我认为这是最快的方法。
  • 好,我知道这是更好的方法。谢谢。
  • 其实答案取决于数组有多大以及数字是如何分布的。如果可能在数组中“早期”找到最小值(例如,如果您在 0 .. 9 范围内有 10000 个数字),那么您的第一个解决方案(minElement + find)可能会更快。

标签: arrays swift


【解决方案1】:

如果你喜欢“功能性”的方式:

let array = [6, 3, 1, 9, 4, 6]

let (position, min) = reduce(enumerate(array), (-1, Int.max)) {
    $0.1 < $1.1 ? $0 : $1
}

position // -> 2
min // -> 1

但我不知道它比for循环快:)

【讨论】:

    【解决方案2】:

    我认为您应该坚持将原始代码放在最顶部。它非常易于阅读和理解(对于未来的维护非常重要),并且您可以让编译器使用内置优化。

    let min = minElement(numbers)
    let position = find(array, min)!
    

    就像 Chris Lattner 在今年的一次 WWDC 演讲中分享的那样,目标应该是可读性和可理解性,而不是简洁或冗长。在决定走哪条路时,我喜欢问自己的一个问题是:

    如果我在一两年后阅读这段代码,我会立即掌握它是什么 在做什么?

    没有什么比看着自己的代码说“嗯???”更令人沮丧的事情了

    【讨论】:

    • 完全同意。这是我的首选解决方案。
    猜你喜欢
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多