什么是“版本化数据结构”在CS中正确调用?
有吗
现有的“版本数据结构”的列表,我可以通过,从我自己比较和选择?我只找到一篇关于“多版本哈希表”(标题Hash Tables in Logic Programming,约1987年)的论文,这就是我能找到的全部。
示例数据(在下面的讨论中请求):
"a b" c "d e" {
f {
"g h" "i j" {
"k l m" n "o p q" {
r;
}
}
}
}
"a b" x {
y {
"z z z";
}
}
"foo bar" baz;
"foo baz" bar;
如果出现多个类似的“树”,则它们将保持原位,例如:
foo {
bar;
oof;
bar {
"a b c";
}
bar;
}
将永远不会得到排序,但始终保持在相同的顺序写。
数据将被一些“提交/版本”工具“编译”成二进制格式,并“回滚”回文本格式或被其他工具查询。
为了进一步说明,让我们看看Unix shell中的一些使用示例:
sh> $EDITOR file.txt
File saved.
sh> commit file.txt # create/commit file.txt.db (we assume 9 commits before this one)
Commited as version 10.
sh> show file.txt.db 'a b' # Trailing '*' is implicit
"a b" c "d e" {
f {
"g h" "i j" {
"k l m" n "o p q" {
r;
}
}
}
}
"a b" x {
y {
"z z z";
}
}
sh> show file.txt.db 'a b' '*' y
"a b" x {
y {
"z z z";
}
}
sh> show file.txt.db 'foo *'
"foo bar" baz;
"foo baz" bar;
sh> show file.txt.db -rollback=2 'a b' # "historical" query, say that 'a b" c "d e" ...' was not there the time
"a b" x {
y {
"z z z";
}
}
sh> rollback file.txt.db 2
Rolled back to version 2.
sh> $EDITOR file.txt
File saved.
sh> commit file.txt # new "branch" commit (because of the rollback above)!
Commited as version 2.1.
注意:所有历史记录都会被保存!任何东西都不会被删除(如果不是其他工具明确要求的话)。
或许需要一些“日志”或“日志”??
最佳答案
如果您处理的是纯基于文本的数据,则基本版本化的数据结构可以像数组或结构的链接列表一样简单,如下所示:
struct versioned_string {
int version;
char* data;
};
“提交”一个新条目只需要分配一个新字符串来存储数据。检索一个特定的版本将包括在列表中搜索特定的
version
值(对于链表)或索引到数组(对于数组)。“回滚”将涉及从列表末尾清除一个条目并释放关联的字符串。您还可以使用数据库(例如sqlite),将信息存储在表中,并让DB引擎处理添加、删除和搜索。不过,这可能有点过头了。
不过,我并不是真的以你为榜样。我假设您发布的第一个代码块指示单个输入字符串(即,在特定版本中文本数据的快照)?如果是这样的话,多个“树”应该不是问题,因为输入是作为原始文本存储的,而不是以任何方式处理或解释的。我当然不理解您的“Unix shell”示例。你能更详细地分析一下吗?具体来说,对于每一行,都要清楚地列出输入是什么,输出是什么,以及您希望数据的“当前版本”在那一点看起来是什么。
更新:
忽略我之前关于回滚的评论;我考虑的是这个网站如何使用这个术语(意思是恢复到以前的状态),而您使用这个术语的方式不同(意思是检索旧版本)。
整个数据集的每个快照都可以由单个C字符串表示,因为元素由非空字符(空格和/或大括号)分隔。一个简单的数据结构,就像我在上面概述的那样,如果你创建了它们的链接列表,它应该能提供你所需要的功能。由于数据存储在它的字符串表示中,提交和回滚操作将与向列表中添加新元素(用于提交)或向后遍历列表并将字符串传递给
printf
(用于回滚)一样简单。“show”命令是另一种动物,因为它与数据的版本没有太大关系。就版本控制系统而言,您所要做的就是从列表中获取最后一个条目。真正的工作是由您为解析字符串和内部操作数据而创建的任何库函数完成的。