即使描述这个问题也很难,但我会试一试。我已经为此苦苦挣扎了几天,并决定在这里问。
好的,所以我正在尝试为我所说的“概念”或“事物”建模。只是一般的概念。这与处理逻辑有关。
因此,每个“事物”都是由它与其他事物的关系来定义的。我将其存储为每个关系一组 5 位。一个“东西”可能是这样的:
class Thing {
char* Name;
HashTable<Thing*, int> Relationships;
}
所以,我对“事物”进行建模。每个关系 5 位。每个位代表一种可能的关系。像这样:1 等于,2 内部,3 外部,4 包含,5 重叠。开启所有 5 位意味着我们完全不知道这种关系是什么。拥有 2 位意味着我们认为这种关系可能是两种可能性之一。关系从“未知”开始(所有 5 位都是真的),随着时间的推移变得更加具体。
所以这就是我如何模拟随着时间的推移不断增加的知识。事物以完全未知的状态开始,可以通过部分已知的状态,并可以达到完全已知的状态。
多一点背景:
我尝试通过使用额外的类来为我的“概念”(事物)建模添加额外的定义。像这样:
class ArrayDefinition {
Array<Thing> Items;
}
我的 Thing 类变成了这样:
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(ish)个可能的“数组对”。
我希望我现在终于开始明白了。如何避免将它们全部相互处理?我已经意识到,如果两个“事物”具有完全已知的关系,那么比较它们的“数组定义”是没有意义的,因为这只是用来找出关系的额外细节,但我们有确切的关系,所以毫无意义。
所以......假设这些“带有数组的事物”中只有 500 个具有未知或部分已知的关系。这仍然使 250000(ish) 可能的“数组对”进行比较!
现在......对我来说,最明显的起点是意识到除非用于定义两个数组的关系发生变化(变得更具体),否则处理这个“数组对”是没有意义的。
例如,假设我有这两个数组:
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
”意味着我需要针对 Y 的数组处理 X 的数组。
我真的不想为了处理 1000 个数组上的逻辑而比较 500,000 个“数组对”,而它们之间几乎没有任何变化!
所以......我第一次尝试简化这一点,是保留一个事物用于定义的所有数组的列表。
假设我有 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)。
我们可以通过检查任何数组对是否已经具有完全已知的关系来进一步修剪这个列表。
我遇到的问题是它仍然看起来过分。
假设 X 是一个非常常见的“事物”。它用于 10,000 个阵列。而 Y 是一个很常见的东西,用在 10,000 个数组中。
我最终还是要比较 100,000,000 个数组对。好的,假设我不需要全部比较它们,实际上,其中只有 50 个部分已知或完全未知。
但是...我仍然需要遍历 100,000,000 个数组对的列表,才能确定其中哪些是部分已知的。所以它仍然是低效的。
我真的想知道是否没有有效的方法来做到这一点。如果真的我能做的就是制定一些有效的“启发式”策略。我还没有太多运气想出好的策略。
我意识到这个问题是高度专业化的。而且我意识到阅读这篇长篇文章可能需要很长时间。我只是不确定如何缩小帖子长度或用更常见的问题来描述这一点。
如果它有帮助......我最好的尝试用通用术语表达这一点,是“如何仅比较已更新的列表”。
有人有什么想法吗?那很好啊。如果不是……也许只有我写出来可能有助于我的思考过程。
问题是,我只是忍不住觉得有一些算法或方法可以让这个问题运行得快速高效。我只是不知道那个算法是什么。
谢谢大家