Даже описать эту проблему сложно, но я отдам ее. Я боролся с этим в течение нескольких дней и решил спросить здесь.Эффективный алгоритм для сравнения только обновленных списков
ОК, поэтому я пытаюсь моделировать «понятия» или «вещи», как я их называю. Просто понятия вообще. Это связано с логикой обработки.
Итак, каждая «вещь» определяется ее отношением к другим вещам. Я сохраняю это как набор из 5 бит на связь. «Вещь» может быть такой:
class Thing {
char* Name;
HashTable<Thing*, int> Relationships;
}
Итак, я моделирую «Вещи». 5 бит на связь. Каждый бит означает одну возможную связь. Например: 1 равно, 2 внутри, 3 снаружи, 4 содержит, 5 перекрытий. Имея все 5 бит на средствах, мы полностью не знаем, что такое отношения. Имея 2 бита, мы думаем, что отношения могут быть одной из двух возможностей. Отношения начинаются как «неизвестные» (все 5 бит являются истинными) и становятся более конкретными с течением времени.
Так вот, как я моделирую растущие знания с течением времени. Вещи начинаются в полностью неизвестном состоянии и могут проходить через частично известные состояния и могут достигать полностью известных состояний.
Побольше фон:
Я пытаюсь добавить дополнительное определение к моему моделированию «понятий» (вещей), с помощью дополнительных классов. Как это:
class ArrayDefinition {
Array<Thing> Items;
}
И мой класс Вещь становится так:
class Thing {
char* Name;
HashTable<Thing*, int> Relationships;
ArrayDefinition* ArrayDef;
}
Это "ArrayDef" не должен использоваться. Это просто необходимо использовать, если необходимо. Некоторые «вещи» не имеют массивов, некоторые делают. Но у всех «вещей» есть отношения.
Я могу обработать это «ArrayDefinition», чтобы выяснить взаимосвязь между двумя вещами! Например, если X = [ A B C D E ]
и Y = [ C D E ]
, мой код может обрабатывать эти два массива и выяснить, что «Y inside X
».
ОК, так что достаточно фона. Я объяснил основную проблему, избегая моего реального кода, который имеет всевозможные отвлекающие детали.
Вот проблема:
Проблема делает это не работает до смешного медленно.
Представьте себе, что существует 2000 «вещей». Скажем, 1000 из них имеют определения массива. Теперь это делает 500 000 (иш) возможных «пар-пар», которые нам нужно сравнивать друг с другом.
Надеюсь, теперь я начинаю наконец иметь смысл. Как избежать их обработки друг против друга? Я уже понял, что если у двух «вещей» есть полностью известные отношения, нет смысла сравнивать их «определения массива», потому что это просто используется для определения дополнительных деталей отношения, но у нас есть точная взаимосвязь, поэтому нет никакого смысла.
Итак, предположим, что только 500 из этих «вещей с массивами» имеют неизвестные или частично известные отношения. Это все еще делает 250000 (иш) возможными «парными парами» для сравнения!
Теперь ...для меня, наиболее очевидное место для начала, понимает, что если отношения, используемые для определения двух изменений массивов (становятся более конкретными), тогда нет никакой точки обработки этой «пары-пары».
Например, предположим, что у меня есть эти два массива:
X = [ A B C D E ]
Y = [ Q W R T ]
теперь, если я скажу, что T=R
, это очень приятно. Но это не влияет на отношения между X и Y. Так что только потому, что отношение T к R стало известно как «равное», тогда как до того, как оно могло быть полностью неизвестно, это не означает, что мне нужно снова сравнивать X и Y.
С другой стороны, если я говорю «T outside E
», это взаимосвязь между вещами, используемыми для определения двух массивов. Поэтому, говоря, что «T outside E
» означает, что мне нужно обработать массив X против массива Y.
Я действительно не хочу сравнивать 500 000 «пар массивов», чтобы обработать логику на 1000 массивов, когда почти ничего не изменилось между ними!
Итак, моя первая попытка упростить это состояла в том, чтобы сохранить список всех массивов, которые используется для определения.
Скажем, у меня есть 3 массива:
A = [ X Y Z ]
B = [ X X X X ]
C = [ X Z X F ]
Ну, X используется в 3-х массивов. Таким образом, X может содержать список всех массивов, которые он использует внутри.
Итак, если я сказал "X inside Y"
, это может привести к отображению списка всех массивов, которые Y используется для определения, и все массивы X используются для определения. Предположим, что X используется в 3 массивах, а Y используется в 1 массиве. Из этого мы можем понять, что есть 2 «пары-пары», которые нам нужно сравнить (A vs B и A vs C).
Мы можем закончить обрезку этого списка, установив, что какая-либо из пар массивов уже имеет полностью известные отношения.
Проблема, с которой я столкнулся, это STILL кажется чрезмерным.
Предположим, что X - это действительно обычная вещь. Он используется в 10 000 массивов. И Y - действительно обычная вещь, используемая в 10 000 массивов.
Я все еще получаю 100 000 000 пар массивов для сравнения. Хорошо, так что скажем, мне не нужно сравнивать их всех, на самом деле, только 50 из них были частично известны или полностью неизвестны.
Но ... Мне все же пришлось пробежать список из 100 000 000 пар массивов, чтобы выяснить, какая из них была частично известна. Так что он все еще неэффективен.
Мне действительно интересно, нет ли эффективного метода для этого. И если действительно все, что я могу сделать, это сделать несколько эффективных «эвристических» стратегий. У меня не было слишком много удачи при разработке хороших стратегий.
Я понимаю, что эта проблема является узкоспециализированной. И я понимаю, что чтение этой длинной почты может занять слишком много времени. Я просто не уверен, как уменьшить длину сообщения или описать это с точки зрения более общих проблем.
Если это помогает ... Моя лучшая попытка выразить это в общих терминах - это «как сравнивать только обновленные списки».
У кого-нибудь есть идеи? Это было бы прекрасно. Если нет ... возможно, только я пишу это, может помочь моему процессу мышления.
Дело в том, что я просто не могу не чувствовать, что есть какой-то алгоритм или подход, который может сделать эту проблему быстрой и эффективной. Я просто не знаю, что это за алгоритм.
Спасибо всем
О мальчик, тот много, чтобы принять в систему. –
Похоже, вы пытаетесь сказать: «У меня есть список определений. Каждый из них определяет набор, указанный слева, как объединение множеств справа. Некоторые множества вообще не определены, поэтому это не всегда можно узнать, что такое отношение между двумя наборами. Как я могу эффективно определить столько, сколько я могу о них? » –
Привет, Джейсон. Это не совсем так. Мне не нужны «определения массива» для моделирования «вещей». Существует много логики, которые я могу сделать, просто используя отношения. «Определения массива» просто добавляют дополнительное определение. Кроме того, это не «логический союз». Массивы действительно представляют собой массивы, а не «наборы», потому что порядок имеет значение. Спасибо за попытку. Я думаю, Энтони сказал это правильно («О, мальчик»). Моя проблема настолько специфична и сложна, я требую, чтобы вы потратили огромное количество усилий, чтобы оказать мне какую-либо помощь. – boytheo