代码之家  ›  专栏  ›  技术社区  ›  Jordi Gallen Renau

Swift 4.2改进算法中的“O”代价

  •  2
  • Jordi Gallen Renau  · 技术社区  · 7 年前

    我正在尝试用Swft 4.2做一个小的算法,并且尽可能地降低成本“O”

    我的问题是给代码,我将传递给你。如果你有任何方法来提高计算成本。

    你要做的是:

    • 假设是[2,3,4,5]
    • 我们必须把所有的元素相乘 2x4x5,2x3x5,2x3x4]=[60,40,30,24]

    我的代码如下:

    import UIKit
    
    
    
    class ViewController: UIViewController {
    
    
    
    var arrayInts: [Int] = [2,3,4,5]
    
    var arrayMultiplication: [Int] = []
    
    
    
    override func viewDidLoad() {
    
        super.viewDidLoad()
    
        arrayMultiplication = arrayMultiplication(array: &arrayInts)
    
        print("\(arrayMultiplication)")
    
    }
    
    
    
    func arrayMultiplication(array: inout [Int])-> [Int]{
    
        var arrayMult:[Int] = []
    
        for i in 0...array.count - 1 {
    
            let remove = array.remove(at: i)
    
            let mult = array.reduce (1, {$0 * $1})
    
            arrayMult.append(mult)
    
            array.insert(remove, at: i)
    
        }
    
        return arrayMult
    
    }
    }
    

    其思想是降低这个算法的“O”。

    改进算法中的O代价

    1 回复  |  直到 7 年前
        1
  •  1
  •   Rakesha Shastri    7 年前

    这里有一个可能的解决办法。

    var array = [2,3,4,5]
    
    if let indexOf0 = array.firstIndex(of: 0) {
        array.remove(at: indexOf0)
        let product = array.reduce(1, *)
        var result = Array(repeating: 0, count: array.count + 1)
        result[indexOf0] = product
        print(result)
    } else {
        let product = array.reduce(1, *)
        let result = array.map( {product/$0} )
        print(result)
    }
    
    • 如果没有,则计算乘积并遍历数组一次,同时将乘积与迭代的元素相除并存储结果。

    感谢@Hamish指出这个疏忽。