В моем коде повторение Java TreeSet является доминирующим фактором времени. В рассмотрении системы я полагаю, что это - O (n) сложность. Кто-либо может проверить это?
Я думаю, что путем обеспечения ссылок назад от дочернего узла для порождения узла я мог улучшить производительность.
TreeSet
итерация, конечно же, O (n), как и следовало ожидать от любого разумного алгоритма обхода дерева.
Я думаю, что, предоставляя ссылки назад от дочернего узла к родительскому узлу, я мог бы улучшить производительность.
TreeMap
(на котором основан TreeSet
) уже имеет такие родительские ссылки. Все сводится к следующему методу:
private Entry<K,V> successor(Entry<K,V> t) {
if (t == null)
return null;
else if (t.right != null) {
Entry<K,V> p = t.right;
while (p.left != null)
p = p.left;
return p;
} else {
Entry<K,V> p = t.parent;
Entry<K,V> ch = t;
while (p != null && ch == p.right) {
ch = p;
p = p.parent;
}
return p;
}
}
Рассматривали ли вы создание копии TreeSet при его изменении? Если основное время тратится на итерацию TreeSet (а не на ее изменение), то копирование TreeSet в массив или ArrayList (только при изменении) и только итерация по этому массиву / ArrayList может почти снизить стоимость итерации TreeSet.