Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
Algorithm 用于对表中的行进行排序的密钥分配方案_Algorithm_Sorting - Fatal编程技术网

Algorithm 用于对表中的行进行排序的密钥分配方案

Algorithm 用于对表中的行进行排序的密钥分配方案,algorithm,sorting,Algorithm,Sorting,我正在寻找一种为表中的行分配键的方案,该方案允许在表中移动行并分配新位置,而无需对整个表重新编号 类似于使用键1、2、3、4,然后将行“2”移动到3和4之间,然后将其重命名为“3.5”(因此最终将使用1、3、3.5、4)。但该方案需要具有“无限”可扩展性(允许至少几千个“随机”行移动,然后才需要“正常化”键,最坏(最病态)的情况是允许25-50个这样的移动) 生成的键应该很容易排序,理想情况下,我希望它们对于数据库(假设为SQLite)查询是“自然”排序的 有什么想法吗?从概念上讲,您可以将表视

我正在寻找一种为表中的行分配键的方案,该方案允许在表中移动行并分配新位置,而无需对整个表重新编号

类似于使用键1、2、3、4,然后将行“2”移动到3和4之间,然后将其重命名为“3.5”(因此最终将使用1、3、3.5、4)。但该方案需要具有“无限”可扩展性(允许至少几千个“随机”行移动,然后才需要“正常化”键,最坏(最病态)的情况是允许25-50个这样的移动)

生成的键应该很容易排序,理想情况下,我希望它们对于数据库(假设为SQLite)查询是“自然”排序的


有什么想法吗?

从概念上讲,您可以将表视为链接列表。创建一个具有唯一ID、键及其下一个节点和任何其他所需数据的表。只需按顺序插入项,当需要在其中插入新项时,只需交换键值和关联的父节点。键值不会保持一致,但这就是额外的唯一ID的用途,这也适用于按键排序


实际上,由于键已经指定了顺序,所以甚至不需要“下一个节点”。上述方案应该很好,只要您在移动的节点之外重命名其他节点的键,即2和3的键值被交换。

此问题提醒了我在编写代码时出现的问题。在这种情况下,大多数人所做的是有根据地猜测两行之间可能插入多少行。那么这个猜测就是这些线之间的间距。因此,如果您认为两个元素之间可能有2000个插入,那么您可以让element1的键为2000,让element2的键为4000。然后,我们想在元素1或元素2之间放置一个元素,你可以天真地分割差异(3000),或者如果你对元素3的每侧有多少个元素有一些直觉,那么你可以将其加权一些(即3500而不是3000)

另一种选择(其实是一样的,但你使用的是不同的编号系统)是使用浮点数,我相信你没有做到这一点。1和2之间的值为1.5。1.5和2之间的值为1.75。1.5和1.75之间等于1.625,以此类推


我建议不要使用字符串键。最好还是用数字键,而且如果你能帮忙的话,最好用整数型键而不是浮点型键。

我现在决定用一种穷人的浮点方案:使用64位数字,将左手的20位左右作为整数增量,然后将右侧的位作为分数进行管理。当在其他两个值之间插入一个值时,选择它们之间的中间值(即它们的平均值)。这应该允许在最病态的情况下至少插入44个,在“平均”情况下插入数千个。只是好奇,你使用的任何东西都不支持浮动吗?是的,到目前为止,我实现的是一个64位整数,前20位是“整数”部分,其余的是“分数”。因此,向列表底部添加从左侧开始的第19位增量。要在两行之间插入,请将新键设为两个封闭键值的平均值。如果需要,该方案可以扩展到2-3个64位的值,但是没有一种简单的方法可以使其自扩展。实际上,它可能可以通过使用数据的“blob”进行自扩展。然后,排序顺序将基于memcmp(至少在SQLite中是这样),因此它相当于使用一个无限长的整数。当然,左边不会有自动扩展,但如果允许,比如说,在“小数点”的左边有6个字节,那么就可以枚举宇宙中的恒星。