【发布时间】:2016-09-14 00:22:48
【问题描述】:
假设整数表示为斐波那契数的总和而不是 2 的幂,所以 100101 表示 F(6)+F(3)+F(1)=8+2+1=11(我们假设 F(1)=F(2)=1)。我想在 O(1) 摊销时间内在这个表示下增加一个整数。
我有递增算法:直觉是不应该有两个连续的 1 位。所以我首先将最低有效位 0 设置为 1,然后从最高有效位开始,如果数字有两个连续的 1 位,例如位 i 和 i-1,将它们都设置为 0 并设置 i+1位为 1。递归执行此操作,直到没有两个连续的 1 位。
我使用会计方法进行摊销分析。因此,对于每个增量操作,我将授予 k 美元,并且每个位翻转将花费 1 美元。但是,我无法设置和证明 k 的正确值。根据经验,我认为k=3 可以工作,但我不知道如何去证明这一点。
【问题讨论】:
-
您是否允许给定数字的任何可能表示形式?例如
11也可以表示为101000(8 + 3)。 (这将是 Zeckendorf 表示。) -
@MarkDickinson 我假设我使用此算法从 0 递增,因此每个数字应该只有一个唯一表示。
-
@jbapple 这是很久以前 Jeff Erickson 的家庭作业问题......
-
您会考虑接受答案还是发表评论?
标签: algorithm fibonacci amortized-analysis