斐波那契字符串数组

时间:2011-03-18 14:04:33

标签: arrays algorithm string

我有一个数组:AB AB BAB ABBAB BABABBAB ...数组的每个项的数量都基于Fibonacci数。将第n个字符串和第n + 1个字符串放在一起,然后生成第n + 2个字符串,例如.BABABBAB = BAB + ABBAB。 那么10 ^ 16的字母是A还是B?

2 个答案:

答案 0 :(得分:3)

f[n]成为n fibonacci number

假设我们想要在通过连接x获得的字符串中找到位置f[1], f[2], ..., f[n]的值。

  1. 找到最低kf[1] + f[2] + ... + f[k] >= x。因此,位置x属于包含f[k]个字符的字词(至少在它的连接中。但由于所有字词都来自ab,我们将会尝试将问题简化为那两个。)
  2. 要查找术语x中与f[k]对应的位置,请从f[1] + ... + f[k - 1]中减去x
  3. 如果k = 1打印a,如果k = 2打印b,则转到第4步。
    1. 如果f[k - 2] < x,那么我们要查找的位置在对应于(长度)f[k - 1]的字词中。从k减去1,从f[k - 2]减去x,然后转到第3步
    2. 否则,我们正在寻找的位置在与f[k - 2]对应的单词中。从k中减去2,保持x不变,然后转到第3步
  4. 这不需要生成实际的单词,只需要它们的长度,这是基本的斐波纳契数。

    工作示例 - 请注意,我只是将实际单词用于说明目的,不需要它们。

    n  f[n]  corresponding word
    1  1     a
    2  1     b
    3  2     ab
    4  3     bab
    5  5     abbab 
    6  8     bababbab
    

    连接所有这些:ababbababbabbababbab。让我们问问自己,10的位置是什么(b)。

    1. f[1] + f[2] + f[3] + f[4] + f[5] >= 10, so k = 5
    2. x = 10, f[1] + f[2] + f[3] + f[4] = 7, so subtract 7 from x, giving x = 3
    3'. k isn't 1 or 2, skip this.
    4'. f[k - 2 = 3] = 2 < x. k = 4, x = 1
    3''. still ignoring this.
    4'' f[k - 2 = 2] = 1 >= x. k = 2, x = 1
    3'''. k = 2, print 'b'.
    

答案 1 :(得分:2)

请不要认真对待这个答案:

我从来都不是很好和数学,这听起来像这个任务应该太重,没有一个怪异的算法计算,所以我的解决方案是简单地猜测。要在AB之间进行选择,我会在php中编写一个非常简单的程序来打印出前15或20行“

<?php
$var1 = "B";
$var2 = "A";
for($i=3;$i<=15;$i++){
    $tmp = $var2;
    $var2 = $var1;
    $var1 = $tmp.$var1;
    echo $i." ".$var1."<br>";
}
echo strlen(implode('',explode('B',$var1)));
echo "<br>";
echo strlen(implode('',explode('A',$var1)));
?>

结果显示,A s(38%)总是少于B s(62%) - 因此猜测B的机会正确并不是那么糟糕