Я работаю над тем, что включает в себя выполнение многих детальных команд и обработку их побочных эффектов синхронным детерминированным способом. У меня есть потенциально большой ориентированный циклический граф объектов, каждый из которых содержит делегата. Эти объекты сгруппированы в компоненты. Компоненты являются иерархическими и могут быть вложены на любую глубину. Связи между объектами могут пересекать границы компонентов.
Существует два списка (буфер выполнения, промежуточный буфер), в который будут добавлены некоторые из этих объектов. Поскольку объекты в буфере выполнения повторяются, выполняются их делегаты, результат которых определяет, какие (если таковые имеются) связанные объекты будут помещены в промежуточный буфер. Когда итерация завершена, буферы меняются местами, прежний исполнительный буфер очищается, и цикл начинается заново.
В дополнение к определению, какие связанные объекты добавляются в промежуточный буфер, некоторые делегаты приводят к отключению компонента. Если этот параметр отключен, ни один из объектов в этой ветви не должен обрабатываться.
Мне нужен наиболее эффективный способ указать / определить, какие компоненты отключены, чтобы предотвратить обработку объектов. Ниже приведены варианты, которые мне известны ...
Установить флаг отключения только для родительского компонента ветви. Рассматривая каждый объект для выполнения, поднимитесь полностью до корневого компонента, чтобы увидеть, помечены ли какие-либо из них отключенными ... До O (n), где n - глубина компонента, владеющего объектом. Это можно оптимизировать, поддерживая словарь, так что восхождение для любого данного компонента необходимо выполнять один раз в каждом цикле.
Установить флаг отключения для всех компонентов в ветви ... O (1) для каждого объекта, потому что ему нужно только проверить, не установлен ли у его владельца флаг отключения. Но O (n) пометить ветвь как отключенную, где n - количество компонентов в ветке.
Назначьте каждому компоненту пару фракций Фарея для представления вложенного интервала и ведите глобальную запись отключенных интервалов. Рассматривая каждый объект для выполнения, проверьте, попадает ли интервал принадлежащего ему компонента в один из отключенных интервалов. До O (n) для каждого объекта, где n - количество отключенных компонентов. Это также можно оптимизировать, поддерживая словарь, так что проверка интервалов любого данного компонента должна выполняться один раз в каждом цикле. Я не уверен в масштабируемости этого. Насколько большой / глубоко вложенной может стать ветвь, прежде чем дроби начнут исчерпывать десятичные точки?
Выполните какое-то волшебство указателя, чтобы все компоненты в ветви имели общий флаг отключения.
Edit:
Ветвь компонентов может быть отключена явно и / или неявно. Явное означает, что ветвь была помечена как отключенная. Неявный означает, что ветвь считается отключенной, поскольку ветвь предка в иерархии компонентов помечается как отключенная. Если данная ветвь C явно отключена, и ветвь предка A также отключена, повторно включив A не должно приводить к включению C . Имея это в виду, я не вижу, как вариант 4 может работать с указателем или общей ссылкой. Я думал о наличии двух флагов, один для явной настройки и один для неявной. Явный флаг для одного компонента может использоваться как неявный флаг для дочерних компонентов. Но это только позволяет мне отключить непосредственные дочерние компоненты.