11

在很长很长时间(20 多年)没有编程之后,我正试图重新开始。我的第一次真正尝试是拼字游戏/Words With Friends 求解器/作弊器(选择你的定义)。我已经构建了一个非常好的引擎,但它通过蛮力而不是效率或优雅来解决问题。经过大量研究,很明显,这个问题的最佳答案是 DAWG 或 CDWAG。我在那里找到了一些 C 实现并且能够利用它们(对于相同的数据集,搜索时间从 1.5 秒变为 0.005 秒)。

但是,我试图弄清楚如何在纯 Objective-C 中做到这一点。在那,我也在努力使其符合ARC。并且对于 iPhone 来说足够高效。我看了很多,发现了几个数据结构库(即CHDataStructures),但它们大多是 C/Objective-C 混合体,或者它们不符合 ARC。它们非常依赖结构并将对象嵌入到结构中。ARC并不真正关心这一点。

所以 - 我的问题是(对不起,我明白这是否是 tl;博士,如果这似乎完全是一个新问题 - 只是无法理解这个对象的东西)你如何编程经典数据结构(树等)在 Objective-C 中从头开始?我不想依赖 NS[Mutable]{Array,Set,etc}。有没有人有一个简单/基本的树或类似的东西,我可以在创建我的 DAWG 时使用?

4

1 回答 1

3

为什么在你开始走路之前就射中自己的脚?

你说你是

试图弄清楚如何在纯 Objective-C 中做到这一点

然而你

不想依赖 NS[Mutable]{Array,Set,etc}

另外,您想使用 ARC,还是不想使用 ARC?如果你坚持使用 Objective-C,然后使用 ARC,如果你不想使用 Foundation 集合,那么没有 ARC 可能会更好。

我的建议:使用 NS[Mutable]{Array,Set,etc} 并让您的基本算法与 ARC 一起使用。那应该是您的第一个也是唯一的目标,其他一切都是过早的优化。特别是如果您的目标是“重新开始编程”而不是编写最快的拼字游戏分析器和求解器。如果您后来发现需要优化,您有一些可以分析瓶颈的工作代码,如果需要,您仍然可以替换 Foundation 集合。

至于其他不兼容 ARC 的库:如果您遵循ARC 设置的一些规则,您可以很容易地使它们兼容。这是否值得在很大程度上取决于 3rd 方代码库的大小。

特别是,从 void* 到 id 的转换,反之亦然,需要桥接转换,所以你会写:

void* pointer = (__bridge void*)myObjCObject;

同样,如果您将 C 结构中的所有指针标记为__unsafe_unretained您应该能够按原样使用 C 代码。更好的是:如果 C 代码可以构建为静态库,您可以在关闭 ARC 的情况下构建它,并且只需要修复一些头文件。

于 2011-10-24T21:28:05.930 回答