微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我获得了很多关于算法和数据结构以及如何将它们应用于不同问题的知识。他们说:“在问题 X 上使用二叉搜索树 (BST)”,但从来没有在构建树时做什么。

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

那么,如何将我的 BST 保留在某个位置并在已经构建的树上进行搜索?也就是说,我不想每次都建树。我打算建造一棵大树,我希望可以选择在其中进行搜索

乏味的例子:

int main() {    
    const string s1 = "Volkswagen";
    const string s2 = "Ferrari";
    const string s3 = "Whatever";
    
    Car* g1 = new Car(s1);
    Car* g2 = new Car(s2);
    Car* g3 = new Car(s3);
    BinTree t; //construct empty tree and add to it in the following 3 lines
    t.insert(g1);
    t.insert(g2);
    t.insert(g3);
    Gene* found_gene; //declare
    found_gene = t.search("Rugbrødsbil") //assign the found object for later use. 
}

解决方法

如果我理解正确,您想将 BST 写入磁盘并在程序启动时随时加载它?

C++ 并没有真正的内置方法来执行此操作,因此您需要编写自定义逻辑来允许 BST 对其自身进行序列化和反序列化(例如,到/从字符串),然后保存该数据到磁盘(你可以在 C++ 中搜索磁盘 I/O),这样当程序启动时它可以读回字符串并重新创建树。

https://www.geeksforgeeks.org/serialize-deserialize-binary-tree/ 这是我找到的一个页面,可以帮助您了解具体细节!

,

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

以树为例:

    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 存储在文件中的方法,但这是基本思想。对于搜索,您将从第 0 行开始读取节点数据,这些数据将存储在文件的其他位置,确定要转到哪个子节点,然后 fseek 到子节点的行,类似于内存中的 BST 流程.就像我在评论中提到的那样,数据可能需要是一个指针,以便您可以在二进制文件中使用行号。您可能需要将实际数据存储在文件或其他文件中的其他位置,因为您可能不知道数据的内存大小(如果它包含分隔符,则会出现解析问题)。

如果我能更好地澄清这一点,请告诉我。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。