パフォーマンスが最も重要なアプリケーションを作成しています。 - およびy座標。これは、ワークステーションの関連する部分と位置です:オブジェクトのセットの2つのプロパティの最小値と最大値を取得する最も効率的な方法は何ですか?
struct Workstation {
let position: Position
}
struct Position {
let x, y: Int
func distance(to otherPosition: Position) -> Int {
return abs(self.x - otherPosition.x) + abs(self.y - otherPosition.y)
}
}
この特定のケースでの目標は、すべてのワークステーションを囲む長方形の対角線の長さの半分を得ることですが、私は後でいくつかの他の計算をしなければなりません(すべてのワークステーションの中心座標を取得するように)
私は2つの可能なソリューション(注:layout.workstations
はタイプSet<Workstation>
である):を思い付いた私の理解がある
ソリューション1
private func getSurroundingRectangeScore(for layout: FactoryLayout) -> Double {
var minX = Int.max
var maxX = Int.min
var minY = Int.max
var maxY = Int.min
for workstation in layout.workstations {
let pos = workstation.position
if pos.x < minX { minX = pos.x }
if pos.x > maxX { maxX = pos.x }
if pos.y < minY { minY = pos.y }
if pos.y > maxY { maxY = pos.y }
}
let minPosition = Position(x: minX, y: minY)
let maxPosition = Position(x: maxX, y: maxY)
return Double(minPosition.distance(to: maxPosition))/2
}
ソリューション2
private func getSurroundingRectangeScore(for layout: FactoryLayout) -> Double {
let xValues = layout.workstations.map { $0.position.x }
let yValues = layout.workstations.map { $0.position.y }
guard let minX = xValues.min(), let maxX = xValues.max(), let minY = yValues.min(), let maxY = yValues.max() else {
fatalError("Minima or Maxima could not be determined!")
}
let minPosition = Position(x: minX, y: minY)
let maxPosition = Position(x: maxX, y: maxY)
return Double(minPosition.distance(to: maxPosition))/2
}
その解決策1がワークステーションを反復する必要な座標変数をすべて1回のスワップで一杯にします。ソリューション2は読みやすくなりましたが、ワークステーションの設定を2回繰り返し、結果の配列を4回繰り返さなければならないので、これはずっと悪いことです。私の前提が正しければ、ここで計算するより効率的な方法があれば、私の質問になるでしょうか?
私はO(n)がこの問題のために可能な限り複雑であると思いますので、最初の解決策はおそらくそれが得られるほど良いでしょう。 – Carcigenicate
x座標とy座標は互いに独立していますか?そうであれば、かなり速いO(log n)を達成することができます。そうでなければ私はあなたの質問を正しく理解していれば、O(n)はおそらくあなたの最善の賭けになるでしょう(これはもちろんアプリケーション/ algoの残りの部分を見ることなく) – TNguyen
@ TPN1994:この計算では、すべてのx値とすべてのy値の最小値が2つの新しい位置を作成するだけで済むからです(ここでは必要ないすべての位置の最小値と最大値(x、y)を見つけるのとは対照的です) 。どのようにO(log n)を達成するのですか? –