我有一个"实体"(对象)网络,每个实体都包含关于"下一个"(以下)实体是什么的信息,它可以是没有和很多之间的任何东西。此外,"下一个"实体包含其"下一个"实体的信息(可以是一个全新的实体,也可以是之前的实体,只是链接到它)。
所以A知道B和C在哪里,B知道A, D和E在哪里,等等。注意A和b的双向方向,连接的数量和方向没有限制。
如果我必须经常(成千上万次)搜索实体,那么模拟这种网络的最佳(最性能)集合是什么?如果我搜索字符串而不是对象,最好的集合是什么?这有什么区别吗?其他类型的实体会更快吗?
谢谢大家!
编辑:我要做的是在网络/图中保存大量的"记忆"(模拟中的历史事件),然后搜索特定的记忆,并遵循与其邻居和邻居的邻居的连接等等,寻找适合我搜索模式的记忆的"组合"。例如,我正在验证实体"A, B, C和再次A"是否在此顺序中存在。
你的问题相当模糊。如果你可以为你的搜索词定义一个"键",你可以使用HashMap
数据结构(在java.util
中)作为一个非常快速的查找表。
最坏的情况是你必须使用深度优先搜索(DFS)或广度优先搜索(BFS)来搜索整个网络(技术术语是"图")。
这听起来好像你有一个"图形"类型的问题。也许您可以使用neo4j (http://neo4j.org/)来表示您的关系,然后使用它的API来进行搜索?
怎么样:
Map<Entity, List<Entity>>
?
映射存储实体本身以及所有后继对象(下一个和/或上一个)的列表。使用键访问映射值总是0(1),这意味着在恒定的时间内访问元素(它不依赖于映射中存储了多少个元素)
需要搜索实体本身吗?如果是这样,作为一种通用解决方案,您可以创建一个HashMap,其中键入与您的搜索条件相对应的类。实体将是一个值。
如果你能提供更多关于搜索的信息,我们可能会提出更充分的解决方案。
Ex1:实体具有数字属性和搜索条件,当属性>特定阈值时- RBTReeMap将是解决方案。
Ex2:你正在搜索实体序列-可以考虑图形搜索算法。
Ex3:你的实体结构非常类似于FSA(有限状态自动机)。在这种情况下,搜索是通过输入语言完成的(而不是实体本身)。解决方案是最小化自动化并使其具有确定性。
我将关注什么是Entity,并为它定义一个类。如果您需要查找实体,只需在创建时将其注册到映射中。
像这样:
public class Entity {
static Map<String, Entity> map = new HashMap<String, Entity>();
String id;
Set<Entity> nextEntities = new HashSet<Entity>();
Set<Entity> prevEntities = new HashSet<Entity>();
public Entity (String id) {
this.id = id;
map.put(id, this);
}
public static forId(String id) {
return map.get(id);
}
}