在C ++

时间:2018-12-19 13:54:45

标签: c++ integer-division

示例:B +树

给定树中的N个元组,每个内部节点最多di个孩子,每个叶子最多dl个值,如果我是B +树,则最小高度为h = ceil(log_di((N + dl - 1) / dl))没看错。 仅当/表示整数除法并且我可能用(N + dl - 1) / dl替换static_cast<double>(N) / dl时,这才成立。

#include <cmath>
int minHeight(int N)
{
    constexpr int di = 256;
    constexpr int dl = 255;
    return std::lround(std::ceil(log((N + (dl - 1)) / dl) / log(di)));
}

我的兴趣在于模式:(N + d - 1) /d。计算除数(d)的最小倍数(d)大于或等于被除数(N)时似乎使用了此方法。

问题

  1. 此模式有名称吗?设计数据结构和算法时有多普遍?
  2. 如果不常见,还有另一种用c ++编写此代码以便于理解的方法吗?

1 个答案:

答案 0 :(得分:2)

(N + d - 1) / d是用C ++编写整数表达式的一种完全正常的方法。该表达式中的所有术语均为整数类型,因此,除法/的分子和分母也均为int。因此,C ++将/作为int类型的除法运算符。

我不能完全确定您在任何一个问题中要问的是什么。这个“模式”没有我知道的特定名称,但是我不确定您为什么认为应该有一个特定的名称。这只是一个数学表达式。

至于使其“易于理解”,这当然是主观的,但是(除了变量没有参考性的名称这一事实之外),我发现它完全可读。如果您正在寻找表达式的代数简化形式,那么我警告您。例如,尽管(N/d) + (1/d) - 1在数学上看起来是等效的,但通常在这种情况下不是。这主要是由于上述事实,即它们是整数除法,而且还因为int类型具有有限的精度,在某些情况下(例如整数溢出)可能会影响结果。