用k个位对斐波那契位序列进行排名和取消排名

时间:2019-08-31 08:26:24

标签: arrays bit-manipulation permutation fibonacci ranking

对于正整数 n k ,将“ n k -斐波那契位序列”设为 k 1的位序列,其中索引1上的i描述的不是Math.pow(2,i),而是Fibonacci(i)。这些总计为 n 的正整数,并且将给定的 k -fibonnaci-bitsequence的 n 的“等级”作为其在所有这些斐波那契位序列的按字典顺序排列的列表,从0开始。

例如,对于 n 编号39,我们具有有效的 k -斐波那契位序列, k <= 4。在此示例中,斐波那契位序列后面的斐波那契数如下:

34 21 13 8 5 3 2 1

10001000 k = 2等级= 0

01101000 k = 3等级= 0

10000110 k = 3等级= 1

01101100 k = 4等级= 0

所以,我希望能够做两件事:

    我想找到
  • 给出 n k n k -斐波那契位序列 n k -斐波那契位序列的等级。
  • 给出 n k 和一个等级,我想找到 n k -斐波那契位序列具有该排名。

我可以执行此操作而不必计算感兴趣的对象之前的所有 n -fibonacci位序列吗?

1 个答案:

答案 0 :(得分:0)

初步

为简洁起见,假设说n的em的k-fbs而不是n的k斐波那契位。

问题

  

我可以这样做而不必计算感兴趣的n之前的所有n个k-fb吗?

我不确定。到目前为止,我仍然必须计算fbs的 some 。但是,您可能以为我们必须从00…0开始并递增计数-事实并非如此。我们可以反过来做,从最高的fb开始,然后非常有效地进行下去。

这不是一个完整的答案。但是,有一些发现可以帮助您:

Zeckendorf

在下面的伪代码中,我们使用数据类型fbs,该数据类型基本上是布尔数组。我们可以使用mySeq[i]读写各个位,其中位i代表斐波那契数fib(i)。就像您的问题一样,myFbs[0]myFbs[1]位不存在。默认情况下,所有位都初始化为0fbs可以不使用[]来读取表示的数字(n)。辅助函数#(fbs)返回fbs内部的设置位数(k)。 n = 7的示例:

  fbs        meaning       representation    helper functions 
1 0 1 0
| | | `— 0·fib(2) = 0·1 ——— myFbs[2] = 0      #(myFbs) == 2 
| | `——— 1·fib(3) = 1·2 ——— myFbs[3] = 1        myFbs  == 7
| `————— 0·fib(4) = 0·3 ——— myFbs[4] = 0
`——————— 1·fib(5) = 1·5 ——— myFbs[5] = 1

对于任何给定的n,我们可以轻松地计算n的字典最大(整个k个)fb,因为该fb恰好是n的Zeckendorf representation

function zeckendorf(int n) returns (fbs z):
1  int i := any (ideally the smallest) number such that fib(start) > n
2  while n-z > 0
3  |  if fib(i) < n
4  |  |  z[i] := 1
5  |  i := i - 1

zeckendorf(n)是唯一的,并且n的唯一fb均为k = #(zeckendorf(n))。因此zeckendorf(n)的等级为= 0。此外,不存在n为k'<{#(zeckendorf(n))的k'-fbs。

转化

n的任何k-fb都可以通过在fb内的任何地方用100替换位序列011来转换为n的(k + 1)-fbs。之所以有效,是因为fib(i)= fib(i-1)+ fib(i-2)。
如果我们输入的n的k-fbs的秩为0,并且替换了最右边的100,那么我们得到的n的(k + 1)-fbs的秩也为0。如果我们替换第二最右边的100,则我们得到的(k + 1)-fbs的等级为rank = 1,依此类推。


您应该可以使用从zeckendorf(n)开始的重复转换来回答这两个问题。对于第一个问题,仅查看给定fb的k稳定变换011…100100…011100…011011…100可能就足够了(想想这些是什么转化为排名。