Ruby on rails 如何在Rails中重新排序实例
我想,这不是技术意义上的“如何”,而是一种算法方法 我有一个Ruby on rails 如何在Rails中重新排序实例,ruby-on-rails,ruby,algorithm,sorting,Ruby On Rails,Ruby,Algorithm,Sorting,我想,这不是技术意义上的“如何”,而是一种算法方法 我有一个照片模型,它有一个id,创建于和图像本身 我想允许用户以他们喜欢的任何顺序来订购他们的照片。所以我想我可以添加一个属性,以某种方式记录顺序,然后按该列对其重新排序。但我如何以高效的方式构建该专栏呢 在我看来,我的选择是: 表示顺序的简单整数。所以1,2,3,4,5。如果用户选择将照片#5放在照片#2之前,我需要使用新的顺序编号重新分配所有照片,以匹配新的顺序。对于许多照片和拖放操作,这可能会对数据库进行大量写入,并且速度慢且效率低 使第
照片
模型,它有一个id
,创建于
和图像本身
我想允许用户以他们喜欢的任何顺序来订购他们的照片。所以我想我可以添加一个属性,以某种方式记录顺序,然后按该列对其重新排序。但我如何以高效的方式构建该专栏呢
在我看来,我的选择是:
表示顺序的简单整数。所以1,2,3,4,5。如果用户选择将照片#5放在照片#2之前,我需要使用新的顺序编号重新分配所有照片,以匹配新的顺序。对于许多照片和拖放操作,这可能会对数据库进行大量写入,并且速度慢且效率低
使第一张照片的数字更大,因此当用户将照片#5放在照片#2之前时,照片#5的数字会比照片#2大但比照片#1小,但这也会很快变得混乱
只允许“碰撞到第一个位置或碰撞到最后一个位置”,在最后一个位置使其比上一个位置大,在第一个位置使其比上一个位置小。鉴于用户不会有数百万张照片,使用整数可能会奏效
链接列表-这在技术上是可行的,但仅在我拥有/想要使用所有照片的非常有限的情况下。如果我需要照片的一个子集,并希望它定制订购,这将不会工作。我更喜欢在o(1)中使用
,并立即知道如何排序,而不是遍历所有排序(即o(n^2))
有更好的方法吗?我在RoR中也做过同样的事情。我认为您选择的方法取决于您最常对模型执行的操作类型
我尝试使用数据库实现一个双链接列表。也就是说,您的Photo
模型还有两个属性,prev
和next
prev
是上一个Photo
项目的id,next
是下一个Photo
项目的id。如果您仍然不清楚,请查阅任何有关双链接列表的数据结构书籍
对于此数据结构,插入的复杂性为O(1)
,查询的复杂性为O(n)
另一种方法是您在第1项中提到的:表示顺序的简单整数。所以1,2,3,4,5代码>。复杂性插入是O(n)
,查询是O(1)
因此,如果插入的内容多于查询,请选择我的方法。否则,请选择第一种方法。我认为有两种方法可以做到这一点。两种基本数据结构是数组和链接列表。两者之间的主要区别在于数组中的项由其索引位置引用,其中作为LinkedList中的项由其前面和后面的内容引用
因此,您可以拥有一个位置(或您提到的数字),该位置与页面或屏幕上的is位置相关,并且您可以将该数字存储在模型中,并在用户移动图像时对其进行更改。为了有效地执行此操作,您不希望将每个图像向后推一个或向前推一个,而是只允许交换。所以两张照片可以很容易地交换位置
另一种方法是让每张照片都有一个指向下一张照片的指针,本质上就是创建一个链接列表。然后打印所有照片,直到到达空指针。这将是非常容易移动一张照片周围。
要插入新照片,请将插入照片的指针索引设置为列表中的下一张照片,然后将指向下一张照片的照片更改为插入的照片
1 -> 2 -> 3 #insert 4 after 1, before 2
1 -> 2 -> 3 4 -> 2 # point 4's pointer to 2
1 -> 4 -> 2 -> 3 # change 1's pointer to 4
链表在技术上是可行的,但这在处理非顺序模型时会引起很多问题。例如,如果我想只显示图像1、3、5,我不能使用链表