求O(1)时间复杂度的角度钳位函数:映射至[0, tau)
O(1) 实现将数值映射到 [0, τ) 区间
当然有全输入O(1)的解决方案,核心是利用取模运算的特性,同时处理JavaScript中负数取模的特殊行为:
const TAU = Math.PI * 2; function clamp(theta) { const remainder = theta % TAU; return remainder >= 0 ? remainder : remainder + TAU; }
原理说明
- JavaScript 的
%运算符对负数计算时会返回负余数(比如-1 % TAU结果为-1),所以只需要对负余数额外加上TAU,就能将结果拉到[0, TAU)区间内。 - 不管输入是极大的正数、极小的负数还是零,整个过程只需要一次取模运算和一次条件判断,完全是常数时间复杂度 O(1),不会出现原实现中处理大负数时的循环迭代问题。
测试示例
- 输入正数:
clamp(TAU + 3.14)→ 返回3.14 - 输入负数:
clamp(-2)→ 返回TAU - 2(约等于4.283) - 输入τ的整数倍:
clamp(5 * TAU)→ 返回0 - 输入0:
clamp(0)→ 返回0
内容的提问来源于stack exchange,提问作者error
相关产品推荐
相关产品推荐

