【发布时间】:2017-06-08 22:44:20
【问题描述】:
我写了两个函数来比较数组。现在我正在努力如何比较这些方法并找出最合适的方法。
我想知道如何评估我编写的每个函数。
我知道数组的所有元素都是相同的。
通过评估,我询问的是性能(时间和复杂性)以及 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 {
let state = zip(x, y).enumerated().filter() {
$1.0 == $1.1
}.count == x.count
return state
}
对数组进行排序并进行比较时的第二种方法。
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
}
【问题讨论】:
-
至于时间,创建一个大小约为 10^6 的数组,并比较两个函数之间的时间。在各种阵列上尝试并找到平均值。
-
第二个函数先对数组进行排序,然后再按元素进行比较,而第一个函数不会。所以他们不一样。 – 在这两个函数中,
enumerated()的使用似乎没有必要。 -
如果你让 Wallet Equatable 那么你可以简单地将数组与
==进行比较,不需要额外的代码。 -
@MartinR 你的建议是对的。您能否将建议作为答案发布,因为它是合理的改进。
标签: arrays swift algorithm compare