【问题标题】:Jira's Lexorank algorithm for new stories用于新故事的 Jira 的 Lexorank 算法
【发布时间】:2016-11-21 11:20:01
【问题描述】:

我希望创建一个大型项目列表,以便轻松插入新项目并轻松更改该列表中项目的位置。在更新项目的位置时,我希望尽可能少地更改有关项目顺序的字段。

经过一番研究,我发现 Jira 的 Lexorank 算法可以满足所有这些需求。 Jira 中的每个故事都有一个“rank-field”,其中包含一个由 3 部分组成的字符串:<bucket>|<rank>:<sub-rank>。 (我不知道这些部分是否有实际名称,为了方便参考,我就这样称呼它们)

有效排名字段示例:

  • 0|vmis7l:hl4
  • 0|i000w8:
  • 0|003fhy:zzzzzzzzzzzw68bj

当在0|vmis7l:hl4上方拖动一张卡片时,新卡片将获得排名0|vmis7l:hl2,这意味着只需要更新这张新卡片的排名字段,而整个列表总是可以在这个排名上排序-场地。这相当聪明,我无法想象 Lexorank 是唯一使用它的算法。

  1. 在子排名中使用的这种排序方法有名称吗?

我的问题与在 Jira 中创建新卡有关。每张新卡都以一个空的子等级开始,并且始终选择等级以使新卡位于列表的底部。我创建了一堆新故事只是为了看看排名会如何变化,而且排名似乎总是增加 8(以 36 为基数)。

  1. 有谁更具体地知道新卡的排名是如何生成的?为什么要加 8?

我只能想象,过了一段时间(2.7 亿张牌)之后,就没有更多的排名可以生成了,系统需要重新计算所有牌的排名字段,以便为额外的排名腾出空间。

  1. 是否有其他触发器需要重新计算所有排名字段?
  2. 我认为存储桶在重新计算中发挥了作用。我想知道怎么做?

【问题讨论】:

  • 很好的问题和很好的研究。我也很好奇这个。
  • 作为获得许可的 JIRA 用户,您可以从 my.atlassian.com 帐户访问 JIRA 软件的源代码。您可以在 JIRA Software (GreenHopper) JAR 中找到各种 LexoRank 算法,该 JAR(至少从 7.1.0 开始)可以在 dependencySources/jira-greenhopper-plugin-X.Y.Z-sources.jar 中找到。提取该 JAR 后,find . -name '*LexoRank*' 将告诉您在哪里可以找到算法的内部工作原理。
  • 对 lexorank 感兴趣的人的有用视频:youtube.com/watch?v=OjQv9xMoFbg
  • 你也可以使用库排序(间隔排序)的思想。保留带有空格的块。这个想法似乎与此类的中间步骤非常相似。 en.wikipedia.org/wiki/Library_sort

标签: algorithm sorting jira jira-agile


【解决方案1】:
  1. 我们在这里讨论一种特殊的索引。这不是排序;它只是准备项目以某种顺序结束,以防有人碰巧对它们进行排序(通过任何排序算法)。我知道这种索引的变体已经在图书馆使用了几十年甚至几个世纪,以确保属于同一但缺乏共同标题的书籍最终在书架上彼此相邻,但我从未听说过它。

  2. 8 可能是明智地选择作为折衷方案,甚至可能通过分析典型用例。考虑一下:如果您选择一个小的增量,例如。 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 票证)可能会使其他值更合理。

  3. 你是对的,排名字段时不时地重新计算,Lexorank 称之为“平衡”。基本上,平衡发生在以下三种情况之一:① 排名用尽(达到最大值),② 排名是由于用户对票的重新排名太近([a, b, i] 和@987654329 之间应该有的东西@和b), ③在管理页面手动触发平衡。 (实际上,根据介绍,Lexorank 最多允许三个字母等级,所以“靠得太近”可能是 aaaaab,但想法是一样的。)

  4. 等级的部分在平衡过程中会增加,所以一个凌乱的[0|a, 0|an, 0|b]可以再次变成一个干净整洁的[1|a, 1|i, 1|q]brownbag presentation about Lexorank(由 cmets 中的 @dandoen 链接)提到了 的循环使用,因此不是恒定增量(0→1→2→3→…),而是以 3 为模增加 2,所以它会在 2 (0→1→2→0→…) 之后变回 0。在比较排名时,排序算法可以认为 0 “大于” 2(承认它不是纯粹的字典顺序)。如果现在平衡算法向后工作(首先重新排序最后一张票),这将始终保持排序顺序不变。 (这只是一个侧面,这就是为什么我保持简短的解释,但如果这很有趣,请询问,我会详细说明。)

旁注:Lexorank 还跟踪排名的最小值和最大值。对于算法本身的功能,这不是必需的。

【讨论】:

  • When comparing the ranks, the sorting algorithm can consider a 0 "greater" than a 2 (it will not be purely lexicographical then, admitted) 有点令人困惑:比如说,对于长度为 3 的排名系统,我们现在有两个相邻的排名 0|aaa0|aab,我们可能会在它们之间插入一个新的排名桶1 as 1|aaa 这最终也会用完。这样我们就可以得到两个具有相同等级的元素,比如0|aaa,排序为0|aaa < 1|aaa < 2|aaa < 0|aaa,但我们的数据库究竟如何知道first 0|aaalast的相对排序> 0|aaa ?
  • 只有在执行 平衡 时,桶数才会增加(模 3)。因此,如果您只是插入一个新值,您将坚持当前使用的存储桶编号。只有平衡过程中(这可能需要一些时间,在此期间数据库处于只读模式),您才能找到两个不同的桶号。当平衡过程完成(并且数据库再次设置为读/写)时,您将在所有条目中找到相同的桶号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多