作为对学习目标c / oop的帮助,我正在设计一个iOS应用程序来存储和显示周期性体重测量。我有一个单例,它返回一个测量对象共享存储的mutablearray。每次测量至少会有一个日期和体重,我希望能够添加历史测量值。
我想按日期顺序显示测量值。最好的方法是什么?我可以看到选项如下:1)添加测量时 - 每次添加测量后,我都会覆盖addobject对共享存储进行排序,2)检索mutablearray时我对其进行排序,或者3)我检索mutablearray无论它在共享存储中的顺序是什么,然后在显示表/图表时对其进行排序。
可能会比添加新数据更频繁地检索数据,因此选项1将减少共享存储的冗余排序 - 所以这是最好的方法,是吗?
答案 0 :(得分:1)
您可以使用(1)的修改版本。每次插入新对象时,不要对整个数组进行排序,而是使用此处描述的方法:https://stackoverflow.com/a/8180369/1187415将新对象插入到正确位置的数组中。
然后,对于每个插入,只有二进制搜索才能找到新对象的正确索引,并且数组始终处于正确的顺序。
由于您说数据的检索频率高于添加新数据,因此这似乎更有效。
答案 1 :(得分:0)
如果我忘记了你的特殊情况,这个问题就不容易回答了。有两种基本解决方案:
保持数组未排序,当您尝试访问元素并且数组未排序时,请对其进行排序。我们称之为“懒惰排序”。
插入元素时保持数组排序。请注意,这不是关于在末尾追加新元素然后对整个数组进行排序。这是关于找到元素应该在哪里(二进制搜索)并将其放在那里。我们称之为“排序插入”。
这两种技术都是正确和有用的,决定哪一种更好取决于您的使用案例。
示例:
您想在数组中插入数百个元素,然后访问元素,然后再次插入数百个元素,然后进行访问。总之,您将以大块的形式插入值。在这种情况下,延迟排序会更好。
您经常会插入单个元素,并且您将经常访问这些元素。然后排序的插入将有更好的性能。
中间的东西(插入1和插入数十个元素之间)。您可能不关心将使用哪种方法。
(请注意,您也可以使用专门的结构来保持数组排序,而不是基于NSArray
,例如基于平衡树的结构,同时保持子树中元素的数量。)