在C++中调整整数除法的商
Adjusting quotient of integer division in C++
示例: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
。这似乎是在计算大于或等于被除数(N)的除数(d)的最小倍数时使用的。
问题
- 这个图案有关联的名称吗?在设计数据结构和算法时有多常见?
- 如果不常见,是否有另一种方法可以用 c++ 编写此代码更容易理解?
(N + d - 1) / d
是在 C++ 中编写整数表达式的一种完全正常的方式。此表达式中的所有项都是整数类型,因此,特别是除法 /
的分子和分母也是 int
。因此,C++ 将应用 /
作为 int
类型的除法运算符。
我不完全确定你在这两个问题中问的是什么。这个 "pattern" 没有我知道的特定名称,但我不确定您为什么认为它应该有一个。这只是一个数学表达式。
至于使它成为 "easier to understand",那当然是主观的,但是(除了变量没有提供信息的名称这一事实之外)我发现它完全可读。如果您正在寻找表达式的代数简化,那么我会警告您不要这样做。例如,虽然 (N/d) + (1/d) - 1
在数学上看起来是等效的,但在这种情况下通常不是这样。这主要是因为前面提到的这些是整数除法,但也因为 int
类型的精度有限,这在某些情况下可能会影响结果(例如整数溢出)。
示例: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
。这似乎是在计算大于或等于被除数(N)的除数(d)的最小倍数时使用的。
问题
- 这个图案有关联的名称吗?在设计数据结构和算法时有多常见?
- 如果不常见,是否有另一种方法可以用 c++ 编写此代码更容易理解?
(N + d - 1) / d
是在 C++ 中编写整数表达式的一种完全正常的方式。此表达式中的所有项都是整数类型,因此,特别是除法 /
的分子和分母也是 int
。因此,C++ 将应用 /
作为 int
类型的除法运算符。
我不完全确定你在这两个问题中问的是什么。这个 "pattern" 没有我知道的特定名称,但我不确定您为什么认为它应该有一个。这只是一个数学表达式。
至于使它成为 "easier to understand",那当然是主观的,但是(除了变量没有提供信息的名称这一事实之外)我发现它完全可读。如果您正在寻找表达式的代数简化,那么我会警告您不要这样做。例如,虽然 (N/d) + (1/d) - 1
在数学上看起来是等效的,但在这种情况下通常不是这样。这主要是因为前面提到的这些是整数除法,但也因为 int
类型的精度有限,这在某些情况下可能会影响结果(例如整数溢出)。