我正在设计一个仅限磁盘的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...
}
我无法正常使用此功能。
答案 0 :(得分:0)
磁盘不适合AVL树,因为:
1)您无法从磁盘中读取一点数据。你将永远得到一个部门,你可以免费获得更多一点;和
2)从磁盘上的任意位置读取非常昂贵。
由于这些原因,基于磁盘的搜索树(例如,用于数据库索引)使用不同的数据结构。 B +树很常见:
https://en.wikipedia.org/wiki/B%2B_tree
你应该做那样的事情。
使用基于磁盘的AVL树查找项目所需的访问次数大约是使用B +树查找的次数的10倍。