Arrays 线性时间位集算法中的Lehmar码生成

Arrays 线性时间位集算法中的Lehmar码生成,arrays,algorithm,sequence,Arrays,Algorithm,Sequence,为了生成置换的词典索引,我们首先生成置换的Lehmar码——阶乘数系统中的基本表示。要做到这一点,我们取置换的每个元素,减去左边小于它的元素数。如何找到左侧元素的数量小于排列的特定数字?如果你简单地扫描所有的图像,你可以在线性时间内完成。如果将它们存储在二进制搜索树中,则可以在对数时间内完成。但也有一种方法可以在恒定的时间内完成。在博客中,“线性算法”一节介绍了这一点。引述: 让我们通过例子来研究这个算法,再次使用置换(2 0 1) 从长度为3的位集开始,初始化为零(000b) 排列的第一个元素

为了生成置换的词典索引,我们首先生成置换的Lehmar码——阶乘数系统中的基本表示。要做到这一点,我们取置换的每个元素,减去左边小于它的元素数。如何找到左侧元素的数量小于排列的特定数字?如果你简单地扫描所有的图像,你可以在线性时间内完成。如果将它们存储在二进制搜索树中,则可以在对数时间内完成。但也有一种方法可以在恒定的时间内完成。在博客中,“线性算法”一节介绍了这一点。引述:

让我们通过例子来研究这个算法,再次使用置换(2 0 1)

  • 从长度为3的位集开始,初始化为零(000b)

  • 排列的第一个元素是2,因此翻转位集的第2位:001b。如上所述,莱默码的第一位始终与排列的第一位相同,在这种情况下为2

  • 置换的第二个元素是0,因此将位集合的位0设置为101b。将位集右移n-k,其中n为3,表示置换中的元素数,k为0,表示置换的第二个元素。101b>>(3-0)=000b。计算结果中的个数(countOnes(000b)=0),然后从元素中减去这个数,得到莱默数:0-0=0
  • 排列的第三个元素是1,因此设置位集合的位1:111b。右移:111b>>(3-1)=001b。从元素中减去结果中的一个数,得到莱默数字:1-countOnes(001b)=1-1=0。 正如预期的那样,莱默代码是200

  • 我可以看到这对特定的排列是有效的,但我完全不知道它为什么有效。

    让我们这样看:假设我们在排列的位置t。到目前为止,如果i位于当前元素的左侧,则位集中的位i为1。当你向右移动n-k次时,左边是字符串的前k位(考虑一直移动n次,然后撤消k次),所以现在我们有一些0和一些1,每个0和1对应一个小于当前元素的数字。因此,我们需要做的就是在结果字符串中计算1