O(1)常数时间解的例子

O(1) Constant time solution example?

本文关键字:时间 常数      更新时间:2023-10-16

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

如X = 10;Y = 85;D = 30;答案= ((Y-X)/D) = 3;

解的复杂度必须为O(1)

显而易见的解决方案不起作用:

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

因为if跳转返回一个向下舍入的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)…

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

明显的解决办法是四舍五入。

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

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

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

使用D = 30的大小跳跃,从10开始

10 -> 40 -> 70 -> 100

所以总共跳了3次…

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

在python中应该是

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