偶尔我需要处理用户可以手动排序的元素列表。
在大多数情况下,我尝试使用一个有序敏感的容器模型,但这并不总是可能的,因此我会添加一个位置字段到我的数据中。这个位置字段是双精度类型,因此我总是可以计算两个数字之间的位置。然而,这并不理想,因为我担心会出现边缘情况,无法保证足够的数值精度来继续在两个数字之间插入。
我对于维护我的位置数值的最佳方法存在疑虑。第一种想法是遍历所有行,在每次插入后给它们一个圆整的数字,例如:
在将一行放置在2和3之间后:
1 2 2.5 3 4 5
位置编号更新后:
1 2 3 4 5 6
当然,如果我有大量记录,可能会变得很重。这不是特指内存,而是要将所有新值存回磁盘/数据库中。我通常使用某种ORM和移动软件。更新所有代码将使每个对象从磁盘中读取并设置为脏数据,导致重新验证所有相关的数据模型验证规则。
我也可以等待精度不足以计算两个位置之间的数字。但是用户体验会很差,因为相同的操作将不再需要相同的时间。
我认为,在这些情况下,有一种标准算法可以定期且一致地更新位置编号,或仅更新其中一些位置编号。理想情况下,它应该是O(log n),在最坏和最好的情况下没有大的时间差异。
老实说,我也认为任何必须由用户/排序的东西都不会像其最坏情况那样变得非常大,成为真正的问题。极端情况似乎也非常少见,即使我试图通过推动边界数字来寻找解决方案。然而,我仍然相信存在解决此问题的标准已知解决方案,但我不知道它是什么,我想了解一下。