Sid*_*gil 0 c++ conditional-statements
bool flag = ((idx == n) ? true : false);
if (C[idx]->n < t)
fill(idx);
if (flag && idx > n)
C[idx - 1]->deletion(k);
Run Code Online (Sandbox Code Playgroud)
上面的代码片段是BTree实现的一部分,我到处搜索但找不到第二个if语句是否会被执行?
只有当 时flag才会出现,对吗?而 if 语句只会执行 if和,这是不可能的。trueidx == nidx > nflag = true
我认为fill(idx)价值正在改变,但我不明白如何改变?有人解释一下
填充函数
void BTreeNode::fill(int idx) {
if (idx != 0 && C[idx - 1]->n >= t)
borrowFromPrev(idx);
else if (idx != n && C[idx + 1]->n >= t)
borrowFromNext(idx);
else {
if (idx != n)
merge(idx);
else
merge(idx - 1);
}
return;
}
Run Code Online (Sandbox Code Playgroud)
查看您提供的链接中的代码后,该变量idx从未更改。但是,通过遍历fill(idx),n在某些情况下会被修改(因为它是一个属性,并且fill是一个可以访问 的方法n)。因此,在某些情况下,当被 修改或 被调用的方法之一if时,可以触发第二条语句。nfillfill
代码:
fill(idx):
void BTreeNode::fill(int idx) {
if (idx != 0 && C[idx - 1]->n >= t)
borrowFromPrev(idx);
else if (idx != n && C[idx + 1]->n >= t)
borrowFromNext(idx);
else {
if (idx != n)
merge(idx);
else
merge(idx - 1);
}
return;
}
Run Code Online (Sandbox Code Playgroud)
它可以调用borrowFromPrev、borrowFromNext或merge,这些函数在某些情况下可以更改 n:
// Borrow from previous
void BTreeNode::borrowFromPrev(int idx) {
BTreeNode *child = C[idx];
BTreeNode *sibling = C[idx - 1];
for (int i = child->n - 1; i >= 0; --i)
child->keys[i + 1] = child->keys[i];
if (!child->leaf) {
for (int i = child->n; i >= 0; --i)
child->C[i + 1] = child->C[i];
}
child->keys[0] = keys[idx - 1];
if (!child->leaf)
child->C[0] = sibling->C[sibling->n];
keys[idx - 1] = sibling->keys[sibling->n - 1];
child->n += 1; // here
sibling->n -= 1; // here
return;
}
// Borrow from the next
void BTreeNode::borrowFromNext(int idx) {
BTreeNode *child = C[idx];
BTreeNode *sibling = C[idx + 1];
child->keys[(child->n)] = keys[idx];
if (!(child->leaf))
child->C[(child->n) + 1] = sibling->C[0];
keys[idx] = sibling->keys[0];
for (int i = 1; i < sibling->n; ++i)
sibling->keys[i - 1] = sibling->keys[i];
if (!sibling->leaf) {
for (int i = 1; i <= sibling->n; ++i)
sibling->C[i - 1] = sibling->C[i];
}
child->n += 1; // here
sibling->n -= 1; // here
return;
}
// Merge
void BTreeNode::merge(int idx) {
BTreeNode *child = C[idx];
BTreeNode *sibling = C[idx + 1];
child->keys[t - 1] = keys[idx];
for (int i = 0; i < sibling->n; ++i)
child->keys[i + t] = sibling->keys[i];
if (!child->leaf) {
for (int i = 0; i <= sibling->n; ++i)
child->C[i + t] = sibling->C[i];
}
for (int i = idx + 1; i < n; ++i)
keys[i - 1] = keys[i];
for (int i = idx + 2; i <= n; ++i)
C[i - 1] = C[i];
child->n += sibling->n + 1; // here
n--; // here
delete (sibling);
return;
}
Run Code Online (Sandbox Code Playgroud)