gpt4 book ai didi

ruby-on-rails - 如何在 Rails 中重新排序实例

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:46:14 24 4
gpt4 key购买 nike

我想这不是技术意义上的方法,而是更多的算法方法。

我有一个 Photo模型,它有一个 id , created_atimage本身。

我想让用户按照他们喜欢的顺序排列他们的照片。所以我想我可以添加一个属性,它会以某种方式记录顺序,然后按该列重新排序。但是,我该如何以高效的方式构建该专栏呢?

我认为我的选择是:

  1. 一个表示顺序的简单整数。所以 1,2,3,4,5。如果用户选择将照片#5 放在照片#2 之前,我需要使用新的顺序编号重新分配所有照片以匹配新顺序。对于很多照片和拖放,这可能会对数据库进行大量写入,而且速度慢且效率低下

  2. 这样一来,任何第一张照片都会获得更高的编号,因此当用户将照片#5 放在照片#2 之前时,#5 将获得比#2 大但小于#1 的编号,但这也会很快变得困惑..

  3. 只允许“撞到第一位或撞到最后一位”,在最后一位使它比前一个大,在第一个使它比前一个小。鉴于用户不会拥有数百万张照片,因此使用整数可能有效。

  4. 链表 - 这在技术上可行,但仅在我拥有/想要使用所有照片的非常有限的情况下有效。如果我需要照片的子集并希望对其进行自定义订购,这将行不通。我更喜欢一种可以使用 <=> 的方式在 o(1) 中并立即知道如何排序而不是遍历所有它(这将是 o(n^2))

有更好的方法吗?

最佳答案

我在 RoR 中做了完全相同的事情。我认为您选择的方法取决于您最常对模型执行哪种操作。

我试过用数据库实现双向链表。这意味着,您的 Photo 模型还有两个属性,prevnextprev 是上一个Photo 项的idnext 是下一个Photo 的id 项。如果你还不清楚,可以查阅任何有关双链表的数据结构书籍。

对于这种数据结构,插入的复杂度是O(1),查询的复杂度是O(n)

另一种方法是您在第 1 项中提到的方法:一个简单的整数来表示顺序。所以 1,2,3,4,5。 ...。复杂度插入是O(n),查询是O(1)

因此,如果您做的是插入而不是查询,请选择我的方法。否则选择您的第一种方法。

关于ruby-on-rails - 如何在 Rails 中重新排序实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23334115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com