algorithm - 将对象插入到已排序集合中的其他对象之间

标签 algorithm sorting

我有一个已排序(Mongodb)的对象集合:

{"_id": ObjectId(...), "person": "Homer", "order": 1},
{"_id": ObjectId(...), "person": "Marge", "order": 2}

我想在两个对象之间添加、追加或插入另一个对象。我已经尝试过使用这样的 float :

{"_id": ObjectId(...), "person": "Homer", "order": 1},
{"_id": ObjectId(...), "person": "Bart", "order": 1.5},
{"_id": ObjectId(...), "person": "Marge", "order": 2}

Order 值是前一个和下一个对象中的字段 order 的算术平均值。只要数字看起来不像 1.9999999,它就可以工作。然后它会四舍五入到 2 并且集合不会排序。 我可以这样使用整数:

{"_id": ObjectId(...), "person": "Homer", "order": 1},
{"_id": ObjectId(...), "person": "Bart", "order": 2},
{"_id": ObjectId(...), "person": "Marge", "order": 3}

但这意味着需要修改其他对象,我宁愿避免这种情况。

我考虑过使用字符串和词法排序来防止顺序:

{"_id": ObjectId(...), "person": "Homer", "order": aa},
{"_id": ObjectId(...), "person": "Bart", "order": ab},
{"_id": ObjectId(...), "person": "Marge", "order": bb}

但实现起来似乎很难。有没有更简单的方法?

最佳答案

我认为 float 方法最有意义。 假设您一开始将所有位置都设为整数,则需要进行大量交换,直到遇到精度问题。

我建议每当你改变一个项目的“顺序”时,看看它是否离它的邻居之一太近。如果是,请重新分配所有对象的值(因此它们再次都是整数)。

如果您设置 |x-y| 的限制>= 2**(-50),这很好,因为 python 为浮点保留 53 个精度位,在需要重新分配订单之前,至少需要 50 次不幸的交换。

编辑:我刚刚看到你没有具体询问Python。将精度替换为对您的系统有意义的值。

关于algorithm - 将对象插入到已排序集合中的其他对象之间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11690617/

相关文章:

c++ - 插入跳表

python - 冒泡排序已经排序的列表

从全局排序顺序对 N 个不同列表进行排序的算法

c# - 如何对具有特定结构元素的结构列表进行排序?

c - 在C语言中如何区分短按和长按按钮?

algorithm - 克隆检测算法

algorithm - Haskell 递归方案 : Traverse two structures simultaneously

python - 使用 optimize.fmin_l_bfgs_b 的错误收敛

java - Spring Data Mongodb 排序内部数组

javascript - 同位素排序不起作用