如何存储新构建的数据结构?C++

如何存储新构建的数据结构?C++,c++,data-structures,save,store,C++,Data Structures,Save,Store,我已经获得了很多关于算法和数据结构的知识,以及如何将它们应用到不同的问题中。他们说:在问题X上使用二进制搜索树BST,但永远不要在构建树时做什么 现在,对于这个问题,我已经在一些包含一些值的对象上构建了一个BST。此外,搜索功能已到位。因此,我编译、插入对象,并对字符串进行搜索。然而,在程序终止和过程重复之后,所有这些都会被破坏。我的意图是将树存储在某个地方,并能够根据需要在存储的BST中搜索 那么,我如何将我的BST保存在某个地方,并在已经构建的树上进行搜索呢?也就是说,我不想每次都造树。我计

我已经获得了很多关于算法和数据结构的知识,以及如何将它们应用到不同的问题中。他们说:在问题X上使用二进制搜索树BST,但永远不要在构建树时做什么

现在,对于这个问题,我已经在一些包含一些值的对象上构建了一个BST。此外,搜索功能已到位。因此,我编译、插入对象,并对字符串进行搜索。然而,在程序终止和过程重复之后,所有这些都会被破坏。我的意图是将树存储在某个地方,并能够根据需要在存储的BST中搜索

那么,我如何将我的BST保存在某个地方,并在已经构建的树上进行搜索呢?也就是说,我不想每次都造树。我计划建立一个大的树,我想有选择搜索

乏味的例子:


如果我理解正确,您希望将BST写入磁盘,并在程序启动时将其加载回磁盘吗

C++没有真正的内置方法,所以你需要编写自定义逻辑,允许BST将其自身串到字符串中,并将其反序列化,然后将数据保存到磁盘,你可以在C++中用谷歌来围绕磁盘I/O,这样,当程序启动时,它可以读回字符串并重新创建树


这是我找到的一个页面,它可能会帮助你解决细节问题

如果我理解正确,您希望在程序启动时将BST写入磁盘并将其加载备份吗

C++没有真正的内置方法,所以你需要编写自定义逻辑,允许BST将其自身串到字符串中,并将其反序列化,然后将数据保存到磁盘,你可以在C++中用谷歌来围绕磁盘I/O,这样,当程序启动时,它可以读回字符串并重新创建树


这是我找到的一个页面,它可能会帮助你解决细节问题

如果您想像您建议的那样从固态内存中就地搜索树,您需要找到一种存储它的方法,以便保留遍历所需的信息。我有一个类似的问题要用我做的B+树来解决。想到的一个简单方法是使用fseek library函数或类似的函数,将节点存储在一个二进制文件中,格式如下:

struct Node {
    someType *data;  //note that this must be a pointer
    Node *left, *right;
};
对于示例树:

    1
   / \
  2   3         
和这样的节点:

struct Node {
    someType *data;  //note that this must be a pointer
    Node *left, *right;
};
文件中的表示形式如下所示

1->data line #, 2, 3;
2->data line #, nil, nil;
3->data line #, nil, nil;
您可以更改分隔符,并且必须选择在文件中存储nil的方法,但这是基本思想。对于搜索,您可以从第0行开始读取节点数据,该数据将存储在文件的其他位置,确定要转到哪个子节点,并查找子节点的行,类似于内存中的BST流。正如我在评论中提到的,数据可能需要是指针,这样才能在二进制文件中使用行号。您可能需要将实际数据存储在文件或另一个文件中的其他位置,因为您可能不知道内存大小,并且如果它包含数据的分隔符,您将遇到解析问题


让我知道我是否能更好地澄清这一点。

如果您想像您建议的那样从固态内存中就地搜索树,您需要找到一种存储它的方法,以便保留遍历所需的信息。我有一个类似的问题要用我做的B+树来解决。想到的一个简单方法是使用fseek library函数或类似的函数,将节点存储在一个二进制文件中,格式如下:

struct Node {
    someType *data;  //note that this must be a pointer
    Node *left, *right;
};
对于示例树:

    1
   / \
  2   3         
和这样的节点:

struct Node {
    someType *data;  //note that this must be a pointer
    Node *left, *right;
};
文件中的表示形式如下所示

1->data line #, 2, 3;
2->data line #, nil, nil;
3->data line #, nil, nil;
您可以更改分隔符,并且必须选择在文件中存储nil的方法,但这是基本思想。对于搜索,您可以从第0行开始读取节点数据,该数据将存储在文件的其他位置,确定要转到哪个子节点,并查找子节点的行,类似于内存中的BST流。正如我在评论中提到的,数据可能需要是指针,这样才能在二进制文件中使用行号。您可能需要将实际数据存储在文件或另一个文件中的其他位置,因为您可能不知道内存大小,并且如果它包含数据的分隔符,您将遇到解析问题


如果我能更清楚地说明这一点,请告诉我。

我会查看并返回我会查看并返回。那么,如何构造文件中的顺序呢?仅仅使用任何树遍历?如果我有一个位向量,我想在它上做一些操作,然后才知道应该向右还是向左。像下面这样。然后我可以从文件中取出值并对其进行操作吗?结构节点{someType*data;//请注意,这必须是指针节点*left、*right;位集foo;};我的问题有意义吗?你完全可以从位向量fr中读取数据
将文件存储到内存中,然后首先执行操作。您可以找到一种方法,将向量存储在与左右行号相同的条目中,以便可靠地解析它,或者将行号、文件名+行号存储到向量的其他位置。至于构造顺序,只要将根的行号保存在某个地方,这实际上并不重要。我将使用一个预顺序遍历来初始填充文件。嗨,Kyle。很抱歉反应太晚。我现在试着采用你的解决方案,这似乎很好。然而我很难按照建议找到如何使用fseek。您如何知道使用fseek跳转到文件中的哪个位置?每个节点都必须知道其子节点在文本文件中的位置,这确实很难解决。那么,如何构造文件中的顺序呢?仅仅使用任何树遍历?如果我有一个位向量,我想在它上做一些操作,然后才知道应该向右还是向左。像下面这样。然后我可以从文件中取出值并对其进行操作吗?结构节点{someType*data;//请注意,这必须是指针节点*left、*right;位集foo;};我的问题有意义吗?您完全可以将位向量中的数据从文件读入内存,然后首先执行操作。您可以找到一种方法,将向量存储在与左右行号相同的条目中,以便可靠地解析它,或者将行号、文件名+行号存储到向量的其他位置。至于构造顺序,只要将根的行号保存在某个地方,这实际上并不重要。我将使用一个预顺序遍历来初始填充文件。嗨,Kyle。很抱歉反应太晚。我现在试着采用你的解决方案,这似乎很好。然而我很难按照建议找到如何使用fseek。您如何知道使用fseek跳转到文件中的哪个位置?每个节点必须知道其子节点在文本文件中的位置,这确实很难解决:\