NSDictionary,NSArray,NSSet和效率

我有一个文本文件,大约有200,000行。 每一行表示一个具有多个属性的对象。 我只通过对象的一个​​属性(唯一ID)进行搜索。 如果我正在查找的唯一ID与当前对象的唯一ID相同,我将读取对象值的其余部分。

现在,每次搜索对象时,我只是逐行读取整个文本文件,为每行创建一个对象,并查看它是否是我正在查找的对象 - 这基本上是最低效的方法搜索。 我想将所有这些对象读入内存中,以便稍后可以更高效地搜索它们。

问题是,执行这种搜索最有效的方法是什么? 是一个200,000条目的NSArray做这个的好方法(我怀疑它)? 如何NSSet? 使用NSSet,是否可以只搜索对象的一个​​属性?

谢谢你的帮助!

- Ry


@yngvedh是正确的,因为NSDictionary具有O(1)查找时间(正如对于映射结构所预期的那样)。 但是,在进行一些测试之后,您可以看到NSSet也具有O(1)查找时间。 以下是我提出的基本测试:http://pastie.org/933070

基本上,我创建了1,000,000个字符串,然后花费多少时间从字典和集合中检索100,000个随机字符串。 当我运行这个几次时,这个集合实际上似乎更快了......

dict lookup: 0.174897
set lookup: 0.166058
---------------------
dict lookup: 0.171486
set lookup: 0.165325
---------------------
dict lookup: 0.170934
set lookup: 0.164638
---------------------
dict lookup: 0.172619
set lookup: 0.172966

在你的具体情况下,我不确定这些都是你想要的。 你说你想要记忆中的所有这些物体,但是你真的需要它们吗?还是只需要其中的几个? 如果是后者,那么我可能会读取文件并创建一个对象ID到文件偏移映射(即记住每个对象ID在文件中的位置)。 然后,您可以查找您想要的文件并使用文件偏移量跳转到文件中的正确位置,解析该行并继续。 这是NSFileHandle的工作。


使用NSDictionary从ID映射到对象。 即:使用ID作为键和对象作为值。 NSDictionary是唯一支持高效密钥查找的集合类。 (或者按键查找)

字典是与其他集合类别不同的​​集合。 它是一个关联集合(将ID映射到您的案例中的对象),而其他集合只是多个对象的容器。 NSSet包含无序的唯一对象,NSArray包含有序的对象(可能包含重复对象)。

更新:

要在读取条目时避免重新分配,请使用dictionaryWithCapacity:方法。 如果您在阅读它们之前知道(近似)数量的条目,则可以使用它来预先分配足够大的字典。


200,000个对象听起来像您可能遇到内存限制,具体取决于对象的大小和目标环境。 您可能要考虑的另一件事是将数据转换为SQLite数据库,然后索引要查找的列。 这将提供效率和资源消耗之间的良好折中,因为您不必将全套内容加载到内存中。

链接地址: http://www.djcxy.com/p/85155.html

上一篇: NSDictionary, NSArray, NSSet and efficiency

下一篇: NSArray can't shuffle