对于正整数 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 -fibonacci位序列吗?
答案 0 :(得分:0)
为简洁起见,假设说n的em的k-fbs而不是n的k斐波那契位。
我可以这样做而不必计算感兴趣的n之前的所有n个k-fb吗?
我不确定。到目前为止,我仍然必须计算fbs的 some 。但是,您可能以为我们必须从00…0开始并递增计数-事实并非如此。我们可以反过来做,从最高的fb开始,然后非常有效地进行下去。
这不是一个完整的答案。但是,有一些发现可以帮助您:
在下面的伪代码中,我们使用数据类型fbs
,该数据类型基本上是布尔数组。我们可以使用mySeq[i]
读写各个位,其中位i
代表斐波那契数fib(i)。就像您的问题一样,myFbs[0]
和myFbs[1]
位不存在。默认情况下,所有位都初始化为0
。 fbs
可以不使用[]
来读取表示的数字(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…100
→100…011
和100…011
→011…100
可能就足够了(想想这些是什么转化为排名。