O(1) 恒定时间解决方案示例?
O(1) Constant time solution example?
我有一个任务需要计算青蛙从位置 X 跳到大于或等于 Y 的位置,给定每次跳跃的固定距离 (D)。
例如
X = 10; Y = 85; D = 30;答案 = ((Y-X)/D) = 3;
解决方案的复杂度必须是 O(1)。
显而易见的解决方案无效:
int diff=Y-X;
int jumps=diff/D;
因为如果跳转 returns 一个向下舍入的双精度数,这将不等于或大于。
我可以使用 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) 的操作,避免了循环查找所需的步骤数。
D = 30 尺码跳跃,从 10 开始会给你
10 ---> 40 ---> 70 ---> 100
总共跳了 3 次..
您需要一个简单的公式:ceil((y-x)/d)
其中 ceil(z) 是大于 z 的最小整数
在python中就像
import math
math.ceil( (float)(y-x)/d )
整数运算
int jumps = diff / D + (diff % D ? 1 : 0);
我有一个任务需要计算青蛙从位置 X 跳到大于或等于 Y 的位置,给定每次跳跃的固定距离 (D)。
例如 X = 10; Y = 85; D = 30;答案 = ((Y-X)/D) = 3;
解决方案的复杂度必须是 O(1)。
显而易见的解决方案无效:
int diff=Y-X;
int jumps=diff/D;
因为如果跳转 returns 一个向下舍入的双精度数,这将不等于或大于。
我可以使用 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) 的操作,避免了循环查找所需的步骤数。
D = 30 尺码跳跃,从 10 开始会给你
10 ---> 40 ---> 70 ---> 100
总共跳了 3 次..
您需要一个简单的公式:ceil((y-x)/d)
其中 ceil(z) 是大于 z 的最小整数
在python中就像
import math
math.ceil( (float)(y-x)/d )
整数运算
int jumps = diff / D + (diff % D ? 1 : 0);