O(1)恒定时间解决方案示例?

时间:2016-10-17 08:40:24

标签: c++ loops big-o

我有一项任务需要计算一只青蛙从X位跳到大于或等于Y的位置,给定每次跳跃的固定距离(D)。

E.g X = 10; Y = 85; D = 30;答案=((Y-X)/ D)= 3;

解决方案的复杂性必须 O(1)

明显的解决方案不起作用:

int diff=Y-X;
int jumps=diff/D;

因为如果跳转返回一个向下舍入的double,则不会等于或大于。

我可以使用while循环:

int diff=Y-X;
int jumps=0;
int jumps_counter=0;

while(jumps<diff)
{
 jumps+=D;
 jumps_counter++;
}

但显然这不是O(1),而是O(x-y)......

解决这个问题的最佳方法是什么?

3 个答案:

答案 0 :(得分:4)

明显的解决方案是将其四舍五入。

int diff = Y-X;
int jumps = std::ceil((double)diff/D);

这是一个O(1)操作,避免循环找到所需的步数。

答案 1 :(得分:0)

以整数运算

int jumps = diff / D + (diff % D ? 1 : 0);

答案 2 :(得分:-1)

D = 30尺寸跳跃,从10开始会给你

10 ---&gt; 40 ---&gt; 70 ---&gt; 100

总共3次跳跃..

你需要一个简单的公式:ceil((y-x)/d)其中ceil(z)是大于z的最小整数

在python中

就像

import math
math.ceil( (float)(y-x)/d )