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函数。不要想太多。见我的第二点。
  • 因为,如果您需要一天时间来优化此功能(如果您现在正在做,请重新阅读我的第二点),Cocoa 有几个方便的工具可以让您的软件并行执行如此愚蠢和重复的任务。无需挠头即可仅在您的一个(数量不断增加的)内核上使其更快。
于 2013-06-05T20:29:11.787 回答