在Java中,哪些集合是数据网络中性能最高的?

时间:2011-12-21 12:54:14

标签: java performance collections neural-network

我有一个“实体”(对象)网络,每个实体都包含有关“下一个”(以下)实体的信息,这些实体可以是无实体和大量实体之间的任何内容。此外,“下一个”实体包含其“下一个实体”的信息(可以是一个全新的实体,也可以是与之相关的实体)。

所以A知道B和C在哪里,B知道A,D和E在哪里等等。注意A和B的双向方向。连接的数量或方向没有限制。

如果我必须经常搜索实体(数千次),那么模拟这样一个网络的最佳(最高性能)集合是什么?如果我在搜索字符串而不是对象,那么最好的集合是什么?这有什么不同吗?任何其他类型的实体会更快吗?

谢谢大家!

编辑:我要做的是在网络/图表中保存大量“记忆”(模拟中的历史事件),然后搜索某个记忆并跟踪与其邻居的连接和邻居的邻居等等,寻找符合我搜索模式的记忆的“组合”。例如,我正在验证实体“A,B,C和A”是否按此顺序存在。

5 个答案:

答案 0 :(得分:3)

你的问题现在很模糊。如果您能以某种方式为搜索词定义“键”,则可以使用HashMap数据结构(在java.util中)作为非常快速的查找表。

最糟糕的情况是您必须使用深度优先搜索(DFS)或广度优先搜索(BFS)来搜索整个网络(技术术语是“图形”)。

答案 1 :(得分:1)

怎么样:

Map<Entity, List<Entity>>

地图存储实体本身以及所有后继者的列表(下一个和/或上一个)。使用键访问映射值始终为O(1),这意味着在恒定的时间内访问元素(它不依赖于映射中存储的元素数量)

如果您有实体应按特殊顺序(位置)放置的约束,则此方法肯定不起作用。

答案 2 :(得分:1)

您是否需要自己搜索实体?如果是这样,作为一般解决方案,您可以创建一个HashMap,其中键入与您的搜索条件对应的类。实体将是一个值。

如果您要添加有关搜索的更多信息,可以提出更合适的解决方案。

Ex1:实体具有数字属性,搜索条件是属性&gt;特殊阈值 - RBTReeMap将是解决方案。

Ex2:您正在搜索实体序列 - 可能会考虑图搜索算法。

Ex3:您的实体结构与FSA(有限状态自动机)非常相似。在这种情况下 - 这里的搜索是通过输入语言(而不是实体本身)完成的。解决方案是自动机的最小化并使其具有确定性。

答案 3 :(得分:1)

我会专注于实体是什么,并为此定义一个类。如果您需要查找实体,只需在创建时在地图中注册即可。

这样的事情:

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

答案 4 :(得分:1)

这听起来好像你有一个“图形”型问题。也许您可以使用neo4j(http://neo4j.org/)来表示您的人际关系,然后使用其API进行搜索?