C++ 了解另一个程序员B树的遍历
C++ Understanding traversal of another programmers B Tree
我有一个B树,它已经存在于数据库中。现在,由其他程序员编写的以下代码段尝试遍历B树。但是,我无法理解这些函数的用途:readInner1(页面,插槽)和readInnerPage(页面,插槽)。有人可以帮助我通过使用这两个函数来理解代码的作用吗?
static inline unsigned readUint32Aligned(const unsigned char* data) { return toHost(*reinterpret_cast<const uint32_t*>(data)); }
/// The page remains accessible during the lifetime of the BufferReference object.
class BufferReference
{
public:
/// The size of a page
static const unsigned pageSize = 16384;
/// A page buffer
struct PageBuffer { char data[pageSize]; };
private:
/// The buffer frame
const BufferFrame* frame;
/// No copying of references
BufferReference(const BufferReference&);
void operator=(const BufferReference&);
public:
/// Constructor
BufferReference();
/// Constructor from a request
BufferReference(const BufferRequest& request);
/// Destructor
/// Access the page
const void* getPage() const;
/// Get the page number
unsigned getPageNo() const;
};
Info1(unsigned root,unsigned value1)
{
// Traverse the B-Tree
#define readInner1(page,slot) readUint32Aligned(page+24+8*(slot))
#define readInnerPage(page,slot) readUint32Aligned(page+24+8*(slot)+4)
BufferReference ref;
ref=readShared(root);
while (true) {
const unsigned char* page=static_cast<const unsigned char*>(ref.getPage());
// Inner node?
if (readUint32Aligned(page+8)==0xFFFFFFFF) {
// Perform a binary search. The test is more complex as we only have the upper bound for ranges
unsigned left=0,right=readUint32Aligned(page+16);
cout<<"n right="<<right<<"n";
while (left!=right) {
unsigned middle=(left+right)/2;
printf("n MIDDLE=%d",middle);
unsigned middle1=readInner1(page,middle);
cout<<"n middle1="<<middle1<<"t value1="<<value1<<"n";
if (value1>middle1) {
left=middle+1;
cout<<"n left="<<left<<"n";
} else if ((!middle)||(value1>readInner1(page,middle-1))) {
ref=readShared(readInnerPage(page,middle));
break;
} else {
right=middle;
cout<<"n right="<<right<<"n";
}
}
// Unsuccessful search?
if (left==right) {
ref.reset();
return false;
}
} else {
// A leaf node
break;
}
}
#undef readInnerPage
#undef readInner1
}
如果有人可以解释代码,那也很棒?
代码通常执行二进制搜索。
因此,left
和 right
是搜索的边界,这会将每次迭代减半,直到它们保持相同的值。
数据似乎排列在 16K 字节的页面中,并且这些页面中可能有一些标题信息,这些信息可能已排序,因此它正在检查这些值然后重新调整搜索。
如果允许您修改代码,我建议您用内联函数替换宏。
宏
readInner1
和readInnerPage
都被定义为对函数readUint32Aligned
的调用。这两个宏之间的唯一区别是,readInnerPage
返回在给定相同页面和插槽参数的情况下readInner1
返回的值四个字节处找到的值。
函数readUint32Aligned
本质上只是对函数toHost
的调用,这在您提供的代码示例中没有定义。但是,我的猜测是toHost
将无符号的 32 位整数从网络字节顺序转换为主机顺序。
相关文章:
- 有什么方法可以遍历结构吗
- 在循环中按顺序遍历成员变量
- 遍历模板参数
- 在遍历处理程序的向量时注册和注销处理程序
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 遍历并行数组以确定C++中的最大数字
- 遍历顺序由 std::文件系统directory_iterator给出
- 遍历链表时的无限循环
- 为什么程序员同时使用 std::bad_alloc 和 std::exception.是否 std::例外 仅是不够的
- 遍历unordered_map向量
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- C++声明双链表,使用两个 for 循环双向遍历列表并打印
- 如何正确地推回然后遍历堆中对象的向量?
- 遍历二维数组的所有子数组
- 如何在可变参数模板函数中遍历可变参数元组?
- 程序在遍历所有值之前离开循环. 数组的
- 在POCO服务器应用程序中预防目录遍历攻击
- 请在此程序中建议关卡顺序树遍历的错误
- Firemonkey:如何使用TScreen.Forms在应用程序中遍历所有表单
- C++ 了解另一个程序员B树的遍历