2

作为学习目标 c/oop 的辅助工具,我正在设计一个 iOS 应用程序来存储和显示定期体重测量值。我有一个单例,它返回测量对象共享存储的可变数组。每次测量都至少有一个日期和体重,我希望能够添加历史测量。

我想按日期顺序显示测量值。最好的方法是什么?据我所见,选项如下:1)添加测量时 - 每次添加测量后,我都会覆盖 addobject 以对共享存储进行排序,2)在检索 mutablearray 时对它进行排序,或者 3)我检索可变数组以它碰巧在共享存储中的任何顺序,然后在显示表格/图表时对其进行排序。

与添加新数据相比,检索数据的频率可能更高,因此选项 1 将减少共享存储的冗余排序 - 所以这是最好的方法,是吗?

4

2 回答 2

2

您可以使用 (1) 的修改版本。您无需在每次插入新对象时对完整数组进行排序,而是使用此处描述的方法:https ://stackoverflow.com/a/8180369/1187415将新对象插入到数组中的正确位置。

然后对于每个插入,您只有一个二进制搜索来找到新对象的正确索引,并且数组始终处于正确的顺序。

由于您说数据的检索频率高于添加新数据的频率,因此这似乎更有效。

于 2013-03-21T13:35:44.140 回答
1

如果我忘记了你的特殊情况,这个问题就不那么容易回答了。有两个基本的解决方案:

  1. 保持数组未排序,当您尝试访问元素并且数组未排序时,请对其进行排序。我们称之为“惰性排序”。

  2. 插入元素时保持数组排序。请注意,这不是在末尾添加新元素然后对整个数组进行排序。这是关于找到元素应该在哪里(二进制搜索)并将其放置在那里。我们称之为“排序插入”。

这两种技术都是正确且有用的,决定哪一种更好取决于您的用例。

例子:

  1. 您想在数组中插入数百个元素,然后访问这些元素,然后再次插入数百个元素,然后访问。总之,您将以大块的形式插入值。在这种情况下,惰性排序会更好。

  2. 您经常会插入单个元素,并且会经常访问这些元素。然后排序插入将具有更好的性能。

  3. 中间的东西(在插入 1 和插入数十个元素之间)。您可能不在乎将使用哪种方法。

(请注意,您还可以使用专门的结构来保持数组排序,而不是基于NSArray,例如基于平衡树的结构,同时保持子树中的元素数量)。

于 2013-03-21T13:49:26.327 回答