2017-07-15 3 views
1

パフォーマンスが最も重要なアプリケーションを作成しています。 - および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回繰り返さなければならないので、これはずっと悪いことです。私の前提が正しければ、ここで計算するより効率的な方法があれば、私の質問になるでしょうか?

+2

私はO(n)がこの問題のために可能な限り複雑であると思いますので、最初の解決策はおそらくそれが得られるほど良いでしょう。 – Carcigenicate

+0

x座標とy座標は互いに独立していますか?そうであれば、かなり速いO(log n)を達成することができます。そうでなければ私はあなたの質問を正しく理解していれば、O(n)はおそらくあなたの最善の賭けになるでしょう(これはもちろんアプリケーション/ algoの残りの部分を見ることなく) – TNguyen

+0

@ TPN1994:この計算では、すべてのx値とすべてのy値の最小値が2つの新しい位置を作成するだけで済むからです(ここでは必要ないすべての位置の最小値と最大値(x、y)を見つけるのとは対照的です) 。どのようにO(log n)を達成するのですか? –

答えて

2

まず、どちらが悪いかを推測しないでください。それを実行し、それを測定する。 (あなたの2つ以外のオプションもあります。組み込みのソートルーチンを使用して、結果の終わりを見ています)

第2に、この情報へのアクセスが常に可能な限り高速でなければならない場合、要件をサポートするデータ構造を使用します。最初のコレクションの値を一度見つけてから、要素が追加されるたびに更新します。情報を捨てて、同じNの比較を繰り返し実行する代わりに、新しいWorkstationが追加されるたびに4回だけ実行してください。それからあなたはいつでも必要なときに四肢を一定時間読みとります。

+0

私は一般的にコーディングするのが比較的新しく、効率性はこのプロジェクトの最初の要件です。その答えが私を大いに助けました。これを早い段階で解決し、進歩するために測定が必要な時点では解決していませんでした。私は今この方法で実装します:) –

+1

偉大な、私は助けることがうれしいです。また、[heap](https://en.wikipedia.org/wiki/Heap_(data_structure))を見てください。 –

関連する問題