【问题标题】:The data structure for the "order" property of an object in a list列表中对象的“顺序”属性的数据结构
【发布时间】:2009-06-25 07:21:45
【问题描述】:

我有一个存储在数据库中并通过 ORM(特别是 Django 的 ORM)访问的有序对象列表。该列表由用户任意排序,我需要一些方法来跟踪它。为此,每个对象都有一个“order”属性,用于指定其相对于其他对象的顺序。

我用于在此订单字段上排序的任何数据结构都必须根据请求重新创建,因此创建成本必须便宜。我会经常使用多个对象之间的比较。插入不能要求我更新数据库中的每一行。

我应该使用什么数据结构?

【问题讨论】:

  • 我不确定这与作为单链表或双链表实现的优先级队列有何不同,其中整数作为“顺序”属性。是否有一些限制使您的情况与众不同?
  • 是否需要将排序顺序存储在数据库中(每个用户)?
  • 是的,每个对象的排序顺序将存储在数据库中(1 个对象 == 数据库中的 1 行)。

标签: language-agnostic design-patterns data-structures


【解决方案1】:

std::set (c++) 实现,对值进行比较(取决于存储的值),例如按值的整数,按字符串排序的字符串等等。有利于订购和访问,但不确定何时需要重新订购,是在插入期间,不断等等。

您没有指定您还有哪些其他约束。如果元素的数量已知并且在内存中保持固定数组是合理的或可能的,那么每个位置将由索引指定。假定元素数量固定。

您没有指定是否要经常执行的操作。 如果您加载一次值然后在不修改的情况下访问它们,您可以使用一种算法进行创建,然后构建索引或转换存储以能够使用快速访问...

【讨论】:

  • 谢谢,stefanB。我在帖子中添加了更多信息。抱歉,这里还是新的 :)
【解决方案2】:

链表(双重)?

【讨论】:

  • 那么比较就不是线性的了。我必须潜在地扫描列表的其余部分以确定 a > b。
  • 对有序链表的插入和删除是线性时间,也就是 O(N)。有 N 次迭代的上限可以找到您要查找的值。
  • 错误——或者更确切地说,它们是线性的。错字。
【解决方案3】:

我认为您无法获得恒定的插入时间(但也许是摊销的恒定时间?)。

我会使用二叉树,然后描述路径的位序列可以用作您的“顺序属性”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 2019-02-11
    • 2016-05-18
    • 2020-09-27
    • 2015-02-19
    相关资源
    最近更新 更多