Arrays 我如何定义哪个函数比较数组和自定义模型更有效

Arrays 我如何定义哪个函数比较数组和自定义模型更有效,arrays,swift,algorithm,compare,Arrays,Swift,Algorithm,Compare,我编写了两个函数来比较数组。现在我正在努力比较这些方法,找出最合适的方法 我想知道如何评估我编写的每个函数 通过equal,我知道数组的所有元素都是相同的 通过评估,我询问了Swift功能的性能、时间、复杂性和使用情况 阵列中使用的我的结构: struct Wallet { var fund = 0 var name = "" public static func ==(lhs: Wallet, rhs: Wallet) -> Bool{ retu

我编写了两个函数来比较数组。现在我正在努力比较这些方法,找出最合适的方法

我想知道如何评估我编写的每个函数

通过equal,我知道数组的所有元素都是相同的

通过评估,我询问了Swift功能的性能、时间、复杂性和使用情况

阵列中使用的我的结构:

struct Wallet {
    var fund = 0
    var name = ""

    public static func ==(lhs: Wallet, rhs: Wallet) -> Bool{
        return lhs.fund == rhs.fund && lhs.name == rhs.name
    }

    public static func !=(lhs: Wallet, rhs: Wallet) -> Bool{
        return lhs.fund != rhs.fund || lhs.name != rhs.name
    }
} 
使用zip的第一种方法:

第二种方法是对数组排序并进行比较

func compare(x: Array<Wallet>, y: Array<Wallet>) -> Bool {

    if x.count != y.count {
        return false
    }

    let xSorted = x.sorted{$0.fund > $1.fund}
    let ySorted = y.sorted{$0.fund > $1.fund}

    for (pos, xItem) in xSorted.enumerated() {
        let yItem = ySorted[pos]
        if xItem != yItem {
            return false
        }
    }

    return true
}

这两种解决方案都不是最优的:

调用enumerated是不必要的,因为索引位置是 未在封口中使用。 两种解决方案都不会短路:它们比较所有阵列元素 即使找到了另一对。 包含短路,因此这将是一个更好的解决方案:

func compare(x: Array<Wallet>, y: Array<Wallet>) -> Bool {
    return x.count == y.count &&
        !zip(x, y).contains { $0 != $1 }
}
现在,您可以使用现有的

func ==<Element>(lhs: Array<Element>, rhs: Array<Element>) -> Bool
 where Element : Equatable

运算符。

至于时间,创建一个大数组~10^6,并比较两个函数之间的计时。第二个函数先对数组进行排序,然后再按元素进行比较,而第一个函数没有这样做。因此,它们并不相同在这两个函数中,似乎都不需要使用enumerated。如果您使Wallet相等,那么您只需将数组与==,无需额外的代码进行比较即可。@MartinR您的建议是正确的。你能把建议作为答案贴出来吗?因为这是合理的改进。很抱歉,我在这里打字。但我真的需要专家的回答。请你检查一下这个问题好吗?我将删除此评论后,它。再一次抱歉
func compare(x: Array<Wallet>, y: Array<Wallet>) -> Bool {
    return x.elementsEqual(y, by: ==)
}
struct Wallet: Equatable {
    var fund = 0
    var name = ""

    public static func ==(lhs: Wallet, rhs: Wallet) -> Bool{
        return lhs.fund == rhs.fund && lhs.name == rhs.name
    }
}
func ==<Element>(lhs: Array<Element>, rhs: Array<Element>) -> Bool
 where Element : Equatable