我正在尝试将数据插入到B树的叶节点(数组)中。这是我到目前为止的代码:
void LeafNode::insertCorrectPosLeaf(int num)
{
for (int pos=count; pos>=0; pos--) // goes through values in leaf node
{
if (num < values[pos-1]) // if inserting num < previous value in leaf node
{continue;} // conitnue searching for correct place
else // if inserting num >= previous value in leaf node
{
values[pos] = num; // inserts in position
break;
}
}
count++;
} // insertCorrectPos()
在行值[pos] = num之前,我认为需要编写一些代码来移动现有数据而不是覆盖它。我正在尝试使用memmove,但对此有疑问。它的第三个参数是要复制的字节数。如果我在64位机器上移动一个int,这是否意味着我会在这里放一个“4”?如果我对此完全错误,任何帮助将不胜感激。感谢
答案 0 :(得分:1)
最简单的方法(也许是最有效的方法)是使用标准库预定义结构之一来实现“值”。我建议使用list或vector。这是因为list和vector都有一个insert函数可以为你完成。我特别推荐vector类,因为它具有与数组相同的接口类型。但是,如果您想特别优化此操作的速度,那么我会建议列表类,因为它的实现方式。
如果你想要艰难的方式,那么这里...... 首先,您需要确保有足够的空间。您可以动态分配:
int *values = new int[size];
或静态
int values[MAX_SIZE];
如果你静态分配,那么你需要确保MAX_SIZE是一个你永远不会超过的巨大值。此外,每次添加元素时,都需要根据分配的空间量检查数组的实际大小。
if (size < MAX_SIZE-1)
{
// add an element
size++;
}
如果动态分配,则每次添加元素时都需要重新分配整个数组。
int *temp = new int[size+1];
for (int i = 0; i < size; i++)
temp[i] = values[i];
delete [] values;
values = temp;
temp = NULL;
// add the element
size++;
插入新值时,需要将每个值都移过。
int temp = 0;
for (i = 0; i < size+1; i++)
{
if (values[i] > num || i == size)
{
temp = values[i];
values[i] = num;
num = temp;
}
}
请记住,这根本没有优化。一个真正神奇的实现将通过动态分配比您需要的更多空间来组合两个分配策略,然后在空间不足时按块增长数组。这正是矢量实现的作用。
列表实现使用一个链表,由于它的结构,它有一个O(1)时间来插入一个值。但是,空间效率低得多,并且在位置n处访问元素的时间为O(n)。
此外,此代码是即时编写的...使用时要小心。可能有一个奇怪的边缘情况,我在最后一个代码段中缺少。
干杯! 奈德