Есть словарь (на самом деле js объект), в котором могут быть тысячи элементов. У каждого элемента есть набор не нормализованных "пожеланий" быть поближе к определённым узлам. что то вроде "я, id0, оцениваю желание быть поближе к элементу id1 в 10 баллов, к id9 в 123832 балла а к id5 в 8". Необходимо реорганизовать структуру в кольцо максимально учитывая пожелания близости (причём отмечу, что необходимо не просто подобрать соседей а именно учесть пожелание быть поближе: тоесть в данном примере id5 от id0 на противоположном конце кольца оказаться не должен).
Причём дополнительной сложностью является то, что задача (в идеале) должна решаться в браузере в рантайме, хотя при большой необходимости можно унести и на бэкенд.
Скорее всего, есть алгоритм, решающий задачи такого типа, но все мои попытки что-то нагуглить упираются в настойчивое желание гугла впарить мне qsort.
другими словами
{
id0 : {
weights: {
id1: 10,
id9: 123832,
id5: 8
}
},
id1: {
weights: {
id0 : 10
}
},
id5: {
weights: {
id0 : 8
}
},
id9 : {
weights: {
id0 : 123832
}
}
}
должно перобразовываться в любой из массивов
['id0', 'id9', 'id5', 'id1']
['id9', 'id5', 'id1', 'id0']
['id5', 'id1', 'id0', 'id9']
['id1', 'id0', 'id9', 'id5']
['id0', 'id1', 'id5', 'id9']
['id1', 'id5', 'id9', 'id0']
['id5', 'id9', 'id0', 'id1']
['id9', 'id0', 'id1', 'id5']