我有20项数组,其中包含十进制数字。他们没有分类。在每次迭代时,只有几个数组的项目发生变化(约有1-3项20项数组)。在每次迭代之后,我需要具有相同的数组,但是“已排序”。
我不应该修改原始数组,而是需要维护“并行”结构,它代表相同的数组,但是已经排序。允许使用指针。
我确实关心延迟,所以我需要直截了当的解决方案!显然我可以使用双链表来“记住”排序顺序,但我会花K * O(n)(用相当大的K)来更新这个列表,听起来有点贵。我正在寻找更好的双链表。
我会在c#上实现这个问题
答案 0 :(得分:3)
假设您跟踪1-3个已更改的元素,可以非常高效地完成使用合并排序的单步,并在数组上进行额外迭代
changed
和notChanged
1 中。changed
(对于1-3个元素,它应该相当容易和快速)。merge(changed,notChanged)
获取已排序的数组我认为复杂度为O(n)
具有相当好的常数,因为merge()
在一次迭代中完成,收集阶段也是如此。此外,由于我们仍在使用数组,因此这种方法应该具有很高的缓存效率。
(1)请注意notChanged
已排序,因为未更改的元素在它们之间进行排序!
答案 1 :(得分:0)
只需使用两种结构:这是非常简单,强大的,因为您使用现有的良好工作收集,并且实施成本便宜:
使用两个集合:
一个未排序:例如在java ArrayList中,这是一个动态增长阵列
一个分类:使用你想要的任何东西
像往常一样,两个“集合”都指向内容对象。
在多线程的情况下使线程安全:
将两个集合封装在一个类中,您可以在其中同步所有访问, 这样,两个馆藏的阅读和写作都会同步。