Учитывая объект (скажем, файл или библиотеку/пакет), который может развивать свои версии и ответвления с течением времени, я ищу оптимизированную структуру данных, которая позволяет мне перемещаться по версиям к конкретному экземпляру объекта.
Например (немного надуманный пример) заданы такие записи, как:
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 для такого доступа к данным, я бы тоже хотел узнать.