保持数组排序 - 设置,获取或更晚?

时间:2013-03-21 13:21:26

标签: objective-c arrays oop nsmutablearray sorting

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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

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

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

    示例:

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

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

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

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