【问题标题】:efficient storage and retrieval of large set of objects in dictionaries/arrays高效存储和检索字典/数组中的大量对象
【发布时间】:2015-05-26 17:25:03
【问题描述】:

我正在从存储在设备上的用户完整照片集(可能数以千计)创建数据源。

对于每个资产,我需要:

  • 网址
  • 纬度
  • 经度
  • 时间戳

当视图加载时,我将枚举所有资产并为每个资产存储这 4 条数据。我想知道安排所有这些数据的选项之间是否存在显着差异。例如:

  1. 创建 1 个数组,数组中的每个对象都包含一个包含 4 个键值对的字典。

对比

  1. 创建 1 个数组,仅包含 URL 字符串。创建 3 个额外的字典,1 个将每个 URL 字符串映射到纬度,1 个将每个 URL 字符串映射到经度,1 个将每个 URL 字符串映射到时间戳。

对比

  1. 与 #1 相同,但不是将字典添加到数组中,而是添加从 NSObject 子类化并包含 4 个属性的自定义类的实例。

创建或读取这些集合所需的时间是否存在显着差异(假设有数千个对象)?谢谢。

【问题讨论】:

  • "时间是否有显着差异" 两者都试试。使用仪器。找出。不要过早优化; 事实上优化。
  • 选择正确的数据结构取决于您的需要。您将对这些信息执行哪些操作?我同意@matt 的评论,选择最简单的变体 1 并测量。
  • 也许您应该创建一个具有 3 个属性 url、时间戳、位置的 CustomObject 并将此对象存储在一个数组中。(如果您不想将经度和纬度存储为一个点,则为 4 个)或者您指定仅从相册加载特定图像的搜索逻辑
  • 尽可能写出最简单最清晰的代码。如果存在性能问题,请测量并纠正。引用:Kent Beck:“做最简单的事情,可能会奏效”,C. A. R. Hoare:“过早的优化是编程中万恶之源。”
  • 我可以尝试两种方法并进行测量,但我希望了解为什么一种方法可能会先验地更可取。但是,仍然感谢您指出常识。

标签: ios


【解决方案1】:

有很多方法可以做到这一点,但最简单的可以节省您的时间并且开销非常低的方法是创建一个包含您要创建的四个属性的类并将它们放入字典中。制作自己的对象来保存这些信息,而不是将几个数组或字典绑定在一起,这将在未来提供更大的灵活性。

当您枚举照片时,将字典中的对象设置为以时间戳为键(或您想要的任何唯一属性)。您可以对O(n*(log n)) 中的键进行排序,并在O(1) 时间访问条目。然后,您将获得所有图像的排序列表,它快速、可扩展,并且您将来可以轻松添加更多属性。

【讨论】:

  • 谢谢。这是我考虑过的另一个选项,我认为它与#1 非常相似。我编辑了我的问题以反映这一点。我确实想知道创建这样一个简单对象的实例是否会比创建 NSMutableDictionary 的实例产生更多的开销。你把它们放在字典里是什么意思?您不只是将这 4 条数据中的每一条都设为公共财产吗?
  • 所有四个属性都将是公开的,但是通过使用字典,如果您有密钥,则可以持续访问。由于NSDictionary 使用allKeys 数组,因此您还具有使用NSArray 的相同时间优势。实际上,除非您计划处理超过 100 万张照片,否则您不会注意到一个选项相对于另一个选项在时间复杂度上的显着优势。我提倡NSDictionary 的编程优势。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-29
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多