2

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

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

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

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

顺序值是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}

但似乎很难实施。有没有更简单的方法呢?

4

1 回答 1

2

我认为浮动方法最有意义。假设您从所有位置开始都是整数,在遇到精度问题之前需要进行大量交换。

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

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

编辑:我刚刚看到您没有专门询问 Python。用对您的系统有意义的任何东西替换精度。

于 2012-07-27T15:34:31.020 回答