我希望创建一个大型项目列表,以便轻松插入新项目,并轻松更改该列表中项目的位置。更新项目的位置时,我想更改关于项目顺序的尽可能少的字段。
经过一番研究,我发现Jira的Lexorank算法满足了所有这些需求。 Jira的每个故事都有一个等级字段&#39;包含由3部分构成的字符串:<bucket>|<rank>:<sub-rank>
。 (我不知道这些部分是否有实际名称,为了便于参考,这就是我所说的)
有效排名字段的示例:
0|vmis7l:hl4
0|i000w8:
0|003fhy:zzzzzzzzzzzw68bj
将卡片拖到0|vmis7l:hl4
以上时,新卡片将获得等级0|vmis7l:hl2
,这意味着只需更新此新卡片的等级字段,同时始终可以对整个列表进行排序在这个排名领域。这是相当聪明的,我无法想象Lexorank是唯一使用它的算法。
我的问题与在Jira中创建新卡片有关。每张新卡都以空的子排名开头,并且总是选择排名,使得新卡位于列表的底部。我创建了一堆新故事只是为了看看排名会如何变化,而且排名总是增加8(基数为36)。
我只能想象,经过一段时间(2.7亿张牌)之后,没有更多的牌可以生成,系统需要重新计算所有牌的等级字段,以便为其他牌号腾出空间。
答案 0 :(得分:0)
我们在这里谈论一种特殊的索引编制。这不是排序;它只是准备以某种顺序结束商品,以防有人碰巧对它们进行分类(通过任何分类算法)。我知道这种索引的变体已经在图书馆中使用了数十年,甚至是几个世纪,以确保属于同一类却缺乏通用书名的书籍最终在书架上紧挨着,但我从未听说过它。
也许可以明智地选择8作为折衷方案,甚至可以通过分析典型的用例。考虑以下情况:如果选择较小的增量,则e。 G。 1,则所有票证的排名将类似于[a, b, c, …]
。如果您以正确的顺序创建大量票证(最多26张),这将非常有用,因为这样您的等级字段会很小(一个字母)。但是,一旦您在其他两个票证之间移动票证,则必须添加一个字母:[a, b]
,并在它们之间添加新的票证:[a, an, b]
。如果您希望拥有很多,最好在等级[a, i, q, …]
之间留出空隙,然后另外一张票也可以得到一个字母:[a, e, i, q, …]
。但是,当然,如果您现在从一开始就以正确的顺序创建了许多票证,您很快就会用光字母:[a, i, q, y, z, za, zi, zq, …]
。 8可能是一个很好的值,它可以在票证之间留出足够的空隙,而又不会过早增加许多字母的需要。请记住,其他情况(也许不是手动创建的Jira票证)可能会使其他值更合理。
您是对的,现在会重新计算等级字段,然后,Lexorank称其为“平衡”。基本上,平衡是在以下三种情况之一中发生的:①等级用尽(达到最大值),②等级是由于用户对票券的排名过于靠近([a, b, i]
而造成的) a
和b
),以及③在管理页面中手动触发平衡。 (实际上,根据演示文稿,Lexorank最多允许三个字母等级,因此“太靠近”可以像aaa
和aab
之类,但思想是相同的。)
在平衡期间,等级的[0|a, 0|an, 0|b]
可以再次变得干净利落[1|a, 1|i, 1|q]
。 brownbag presentation about Lexorank(在评论中由@dandoen链接)提到
旁注:Lexorank还会跟踪等级的最小值和最大值。对于算法本身的功能,这不是必需的。