给定一个实体(比如一个文件或一个库/包)可以随着时间的推移发展其版本和分支, 寻找优化的数据结构,让我可以将版本导航到实体的特定实例。
例如(有点人为的例子)给出如下条目:
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用于这种数据访问 - 也想学习。
答案 0 :(得分:0)
如果您的列表很小,那么最快的解决方案可能是扫描您实体的已排序集合,过滤掉您不想要的那些,或者只是抓住符合您标准的第一个(例如,您可以反向迭代上面的实体)订购并抓住第一个“archMIPS~fbsd”获取“最新”)。
如果您的列表很大,那么您将要为您的分支/版本编制索引,您可以使用内存数据库(例如H2 Database Engine,HSQLDB,CQEngine,等