0

私は Objective-C/Cocoa で作業しており、 object type を持っていますTile。それぞれに、4 つの異なる整数値として表すことができる署名があります。これらの値のいくつかを文字列として出力し、値を-es で区切って出力すると、次の例のようになります。

signature: 4-4-3-3
signature: 4-3-3-3
signature: 0-0-0-1
signature: 0-0-1-1
signature: 0-0-1-0
signature: 1-1-1-2
signature: 1-1-2-2
signature: 1-1-2-1
signature: 3-3-3-1
signature: 3-3-1-1
signature: 3-3-1-3
signature: 4-4-4-3
signature: 4-4-3-3

現在、各値を として保存していますunsigned short。負の値になることはなく、最大値が 15 程度を超えることはほとんどありません。ゼロは有効な値です。「ゼロ」値はありません。

私は呼び出すことができるようにしたい:

[myTile signature]値を取得します。

[myTile matches:otherTile]BOOL署名が一致するかどうかを示すを返します。

Tileこの「署名」を保存し、それを他のインスタンスの署名と比較する最も効率的な方法は何ですか? 文字列の比較が遅くなるようです...

4

1 に答える 1

3

まず、これらのタスクに一般的に使用されるメソッド名を使用します:descriptionisEqual*:.

あなたの質問に関しては、最善の方法はより簡単だと思います:

- (BOOL)isEqualToTile:(Tile)tile
{
    return self.value1 == tile.value1 &&
           self.value2 == tile.value2 &&
           self.value3 == tile.value3 &&
           self.value4 == tile.value4;
}

別の可能性は、実装することhashです。

編集:私があなただったら、パフォーマンスについてあまり心配しません。

  • 8回の比較は速いからです。私は本当に速いことを意味します。ちょっとしたベンチマークをまとめると、各比較1.5E-8sの実行に ~ かかることがわかります。これはあまり話になりませんが、私の計算が正しければ、これらの比較を 100 ミリ秒で 10,000,000 回行うことができると言っておきましょう。
  • ある日、ソフトウェアが遅いことに気付いた場合は、この遅さの原因を調査する時が来るからです (そして、それがこの方法に起因するとは思えません)
  • それを実装するのに 12 秒かかったからです。機能する関数を考えるには、おそらくもう少し時間がかかるでしょうhash。考えすぎないでください。2 番目のポイントを参照してください。
  • この機能を最適化するのに 1 日必要な場合 (今それを行っている場合は、私の 2 番目のポイントをもう一度読んでください)、Cocoa には、ソフトウェアがこのような愚かで反復的なタスクを並列処理するための便利なツールがいくつかあります。頭を悩ませずに、(増え続ける数の) コアの 1 つだけで高速化します。
于 2013-06-05T20:29:11.787 に答える