Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在Rails中重新排序实例_Ruby On Rails_Ruby_Algorithm_Sorting - Fatal编程技术网

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,我不能使用链表