如何在磁盘上旋转二进制树

时间:2016-05-26 05:35:45

标签: sorting data-structures binary-search-tree

我正在设计一个仅限磁盘的avl树库。

树的每个节点如下。

struct node 
{
   int key;
   unsigned char height;
   int64 left;
   int64 right;
}; 

并且创建时的每个节点都保存到文件中。

左侧和右侧字段是文件的偏移量  左右子节点所在的位置。

到目前为止,所有工作都很好,除了树木轮换。

如果节点在内存中,则旋转如下。

node* rotateright(node* p)
{
   node* q = p->left;
   p->left = q->right;
   q->right = p;
   fixheight(p);
   fixheight(q);
   return q;
}

但是,我正在使用偏移到文件而不是内存。

int64 rotateright(int64 p)
{
  node q_node;
  node p_node;

  seek(fp,p*sizeof(node));
  read(fp,sizeof(node),&p_node);

  seek(fp,p.left*sizeof(node));
  read(fp,sizeof(node),&q_node);

  p.left=q_node.right;

  // etc...
} 

我无法正常使用此功能。

1 个答案:

答案 0 :(得分:0)

磁盘不适合AVL树,因为:

1)您无法从磁盘中读取一点数据。你将永远得到一个部门,你可以免费获得更多一点;和

2)从磁盘上的任意位置读取非常昂贵。

由于这些原因,基于磁盘的搜索树(例如,用于数据库索引)使用不同的数据结构。 B +树很常见:

https://en.wikipedia.org/wiki/B%2B_tree

你应该做那样的事情。

使用基于磁盘的AVL树查找项目所需的访问次数大约是使用B +树查找的次数的10倍。