问:Branched和Versioned实体的优化数据结构

时间:2016-03-26 21:33:10

标签: algorithm heap guava finger-tree redisson

给定一个实体(比如一个文件或一个库/包)可以随着时间的推移发展其版本和分支, 寻找优化的数据结构,让我可以将版本导航到实体的特定实例。

例如(有点人为的例子)给出如下条目:

MySIMDIntristicsLib.v1~archMIPS.v1~fbsd.v1 
MySIMDIntristicsLib.v1~archMIPS.v2~fbsd.v1
MySIMDIntristicsLib.v1~archX86.v1~win.v1
MySIMDIntristicsLib.v1~archX86.v2~win.v1
MySIMDIntristicsLib.v1~archX86.v2~win.v2
MySIMDIntristicsLib.v2~archX86.v1~win.v1


// get latest across all branches 
get( Entity="MySIMDIntristicsLib", branch[(latest) "~"] ) 
returns: "MySIMDIntristicsLib.v2~archX86.v1~win.v1"


// get latest across  archMips/fbsd branch 
get( Entity="MySIMDIntristicsLib", branch[(latest) "archMIPS~fbsd"] ) 
returns: "MySIMDIntristicsLib.v1~archMIPS.v2~fbsd.v1"



// get earliest   for archX86 v2 branch 
get( Entity="MySIMDIntristicsLib", branch[(earliest) "archX86.v2~"] ) 
returns "MySIMDIntristicsLib.v1~archX86.v2~win.v1"

我怀疑类似的东西已经存在(因为包管理或源代码管理类似于上面的访问语义)。

我一直在寻找上述的内存数据结构,具有良好的最新/最早访问时间,但也有下降插入/移除速度。

在残酷的方法中,我认为可以使用Min Max heap为每个可以拥有版本的分支实现上述内容。

然而,可能已经有更好的东西了。 我还检查了我通常的这些类型的来源Redisson - 但是没有看到上面的数据结构是否有明确的实现

上面的DSL是我自己构建的,也可能有一些漏洞,所以如果有更好的DSL / API用于这种数据访问 - 也想学习。

1 个答案:

答案 0 :(得分:0)

如果您的列表很小,那么最快的解决方案可能是扫描您实体的已排序集合,过滤掉您不想要的那些,或者只是抓住符合您标准的第一个(例如,您可以反向迭代上面的实体)订购并抓住第一个“archMIPS~fbsd”获取“最新”)。

如果您的列表很大,那么您将要为您的分支/版本编制索引,您可以使用内存数据库(例如H2 Database EngineHSQLDBCQEngine,等