在Java中,对于数据网络,哪个集合是性能最高的



我有一个"实体"(对象)网络,每个实体都包含关于"下一个"(以下)实体是什么的信息,它可以是没有和很多之间的任何东西。此外,"下一个"实体包含其"下一个"实体的信息(可以是一个全新的实体,也可以是之前的实体,只是链接到它)。

所以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);
    }
}

最新更新