【问题标题】:Number of Fibonacci numbers smaller than number k. Sub O(n)小于数 k 的斐波那契数的数量。子 O(n)
【发布时间】:2016-04-13 15:04:19
【问题描述】:

面试题:有多少斐波那契数小于给定数k?你能找到一个关于 k 的函数,得到小于 k 的斐波那契数吗?

示例:n = 6

答案:6 为 (0, 1, 1, 2, 3, 5)

很简单,编写一个循环或使用斐波那契的递归定义。但是,这听起来太容易了……有没有办法使用封闭式定义来做到这一点? (https://en.wikipedia.org/wiki/Fibonacci_number#Closed-form_expression)

【问题讨论】:

  • 为什么有人需要知道这个?这只是一个难题,还是家庭作业? “sub O(n)”是否意味着您正在寻找 O(log(n)) 或 O(1) 或不在乎?
  • 你会接受答案的上限还是下限,因为这可能很容易......
  • 这是一道面试题。让我将其添加为编辑。这就是为什么我认为它太容易做到 O(n)
  • 我认为封闭形式的逆(如果存在逆)将允许在 O(1) 中计算。它允许将 Fib 视为离散值的图。

标签: algorithm fibonacci


【解决方案1】:

这是一个接近形式的 Python 解决方案,它是 O(1)。它使用 Binet 的公式(来自您链接到的 Wikipedia 文章):

>>> from math import sqrt,log
>>> def numFibs(n): return int(log(sqrt(5)*n)/log((1+sqrt(5))/2))

>>> numFibs(10)
6

1,1,2,3,5,8 的轨道

关键是比内公式中的第二项可以忽略不计,忽略它的结果很容易反转。

上面的公式计算小于或等于n的斐波那契数。每个新的斐波那契数都会跳 1。例如,numFibs(12) = 6numFibs(13) = 7。 13 是第 7 个斐波那契数,因此如果您想要严格小于n 的斐波那契数的数量,您必须引入一个滞后。比如:

def smallerFibs(n):
    if n <= 1:
        return 0
    else:
        return min(numFibs(n-1),numFibs(n))

现在smallerFibs(13) 仍然是 6,但后来 smallerFibs(14) = 7. 这当然仍然是 O(1)

【讨论】:

  • 这是一个很好的解释!谢谢!
  • 包含数字本身的第一个逻辑在 numFibs(144)、numFibs(143) 和 numFibs(144) 都给出 11 的情况下失败
  • 我遵循了这个方法,它正在工作math.stackexchange.com/a/67714/369172
  • @DhananjayanSanthanakrishnan 很好的观察。问题似乎是我的公式在所有其他斐波那契数上都出错了,因为比内公式中的第二项在符号上交替出现。那篇数学文章中的“软糖因素”似乎是一种方式。另一种方法是检查numFibs(n) 是否为奇数。如果是这样,请检查numFibs(n+1)。如果该数字是偶数 - 则返回它,否则返回原始值。
【解决方案2】:

我认为至少可以很容易地看到这个数字的增长。由Binet / De-Moivre formula

fn = (φn - ψn) / 5

自从|ψ| ,然后

fn ∼ φn / 5

由此可知,小于 x 的斐波那契数的数量会像 logφ(5x) 一样增长。

【讨论】:

  • 你需要一个平方根
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-10
  • 2017-01-08
  • 1970-01-01
  • 2016-06-19
  • 2013-10-20
  • 1970-01-01
相关资源
最近更新 更多