另一位程序员的C++理解遍历B树

标签 c++ database data-structures

<分区>

我有一个已经存在于数据库中的 B 树。现在,下面一段由其他程序员编写的代码试图遍历 B-Tree。但是,我无法理解函数的用途:readInner1(page,slot) 和 readInnerPage(page,slot)。有人可以通过使用这两个函数帮助我理解代码的作用吗?

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
}

如果有人能解释一下代码就更好了?

最佳答案

代码通常执行二分查找。

因此 leftright 是搜索的边界,这将每次迭代减半,直到它们保持相同的值。

数据似乎以 16K 字节的页面排列,这些页面中可能有一些标题信息,这些信息可能已排序,因此它正在检查这些值然后重新调整搜索。

如果允许您修改代码,我建议您用内联函数替换宏。

关于另一位程序员的C++理解遍历B树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14608143/

相关文章:

c - 如何在C中打印队列[数据结构]?

java - 将 URL 映射到最具体的上下文根

c++ - 使用左值引用错误地调用了右值引用构造函数

c++ - std::vector.resize() 中的第二个参数是什么意思?

c++ - 如何为 Windows 实现终端仿真器?

android - android中的数据库位置

php - 使用 'now()' 格式化存储在数据库中的时间

algorithm - 是否有任何允许并行加法的自然数代数表示?

c++ - C++ 编译器或预处理器能否将符号转换为大写?

php - MYSQL 确保两个 cronjobs 不处理相同的请求