高效算法,仅比较已更新的列表

时间:2010-02-04 02:20:05

标签: algorithm collections logic ontology concept-analysis

5 个答案:

答案 0 :(得分:0)

通常,您无法为每个操作提供尽可能快的结构。需要做出权衡。

此问题与在关系数据库SELECT * WHERE ...上执行查询的问题非常相似。你可以考虑寻找灵感。

答案 1 :(得分:0)

我不确定我完全理解你在做什么(ArrayDefinition的目的特别朦胧),但我认为你应该考虑将对象的建模与它们的关系分开。换句话说,为每个关系创建一个从对象到对象的单独映射。如果对象由其整数索引表示,则只需找到一种表示整数到整数映射的有效方法。

答案 2 :(得分:0)

我睡了一觉,当我醒来时,我有了一个新想法。它可能有用......

如果每个“thing”都保留了所有“数组定义”的列表,则用它来定义。

class Thing {
    char* Name;
    HashTable<Thing*, int> Relationships;
    ArrayDefinition* ArrayDef;
    Set<ArrayDefinition*> UsedInTheseDefs;
}

class ArrayDefinition {
    Array<Thing> Items;
    Set<int> RelationModifiedTag;
}

我保留了所有“可比阵列对”的全局列表。

我还构建了一个全局列表,其中包含所有“可以比较的数组”(不是成对,只是一个一个)。

然后,每次关系发生变化时,我都可以查看我所在的“数组定义”列表,并为其添加一些“标记”:)

所以我可以这样做:

static CurrRel = 0;
CurrRel++; // the actual number doesn't matter, it's just used for matching

foreach(Arr in this->UsedInTheseDefs) {
    Arr->RelationModifiedTag.Add( CurrRel );
}
foreach(Arr in other->UsedInTheseDefs) {
    Arr->RelationModifiedTag.Add( CurrRel );
}

我改变了双方的关系。因此,如果我这样做:"A outside B",那么我已经为所有用于定义的数组添加了“modifiedtag”,并且所有数组B都用于定义。

所以,然后我遍历我的“可比阵列对”列表。每对当然是两个数组,每个数组都有一个“RelationModifiedTag”集。

所以我检查两个RelationModifiedTag集合,看看它们是否有匹配的数字。如果他们这样做,那么这意味着这个数组对的关系刚被改变了!那么......我可以进行数组比较。

它应该工作:)

它确实需要一些开销,但主要的是我认为它可以很好地扩展到更大的数据集。对于较小的数据集,只说10个数组,可以使用更简单的更强力方法,只需比较所有没有完全已知关系的数组对,并且不用费心去跟踪已经改变的关系。

可以进一步优化。但是我不会进入这里,因为它只是分散了主算法,而且它们很明显。例如,如果我有两个要比较的集合,我应该遍历较小的集合并检查较大的集合。

道歉必须阅读所有这些长文本。并感谢所有帮助的尝试。

答案 3 :(得分:0)

嗯,首先,一些词汇。

设计模式:Observer

这是一种设计模式,允许对象将自己注册到其他人,并询问有关事件的通知。

例如,每个ThingWithArray都可以在自己管理的Thing中注册自己,这样如果更新了ThingThingWithArray就会收到通知。

现在,通常会有unsubscribe方法,这意味着只要ThingWithArray不再依赖某些Thing,因为使用了所有使用它们的关系,那么它们就会被使用可以unsubscribe自己,以便不再被告知变更。

这样您只会通知那些真正关心更新的人。

但有一点需要考虑:如果你有递归关系,它可能会变得毛茸茸,你需要想办法避免这种情况。

另外,请遵循ergosys建议,并在对象之外建模关系。有一个BIG课通常是麻烦的开始...如果你很难将它切成逻辑部分,那就是你的问题不明确,你应该就如何建模它寻求帮助......一旦你有了得到一个清晰的模型,事情通常会更容易落实到位。

答案 4 :(得分:0)

从你自己的回答中我推断出未知的关系被已知的关系大大超过数字。然后,您可以在单独的哈希表/集中跟踪每个事物的未知关系。作为进一步优化,不是跟踪所使用事物的所有定义,而是跟踪哪些定义具有未知关系 - 哪些关系可能受到影响。然后给定X和Y之间新定义的关系,取其中一个的受影响的定义,并找到每个未知关系与另一个的受影响定义的交集。为了使加速度数据结构保持最新,当关系变为已知时,将其从未知关系中删除,如果没有未知关系仍然通过数组def,则从can-affect集中删除该东西。

数据结构看起来像这样:

class Thing {
    char* Name;
    HashTable<Thing*, int> Relationships;
    Set<Thing*> UnknownRelationships;
    ArrayDefinition* ArrayDef;
    Set<Thing*> CanAffect; // Thing where this in ArrayDefinition and UnknownRelationships not empty
}

class ArrayDefinition {
    Array<Thing> Items;
}