在Java中,对于数据网络来说,什么样的收集最有效?

在Java中,对于数据网络来说,什么样的收集最有效?,java,performance,collections,neural-network,Java,Performance,Collections,Neural Network,我有一个实体对象网络,每个对象都包含关于下一个实体是什么的信息,这些实体可以是介于“无”和“很多”之间的任何东西。另外,下一个实体包含下一个实体的信息,可以是全新的实体,也可以是刚刚链接到它的上一个实体 所以A知道B和C在哪里,B知道A,D和E在哪里,依此类推。注意A和B的双向方向。连接的数量或方向没有限制 如果我必须经常对实体进行数千次搜索,那么模拟这样一个网络的最佳性能集合是什么?如果我搜索字符串而不是对象,那么最好的集合是什么?这有区别吗?其他类型的实体会更快吗 谢谢大家 编辑:我试图做的

我有一个实体对象网络,每个对象都包含关于下一个实体是什么的信息,这些实体可以是介于“无”和“很多”之间的任何东西。另外,下一个实体包含下一个实体的信息,可以是全新的实体,也可以是刚刚链接到它的上一个实体

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

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

谢谢大家


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

您的问题目前相当模糊。如果可以为搜索词定义一个键,那么可以使用java.util中的HashMap数据结构作为一个非常快速的查找表

最坏的情况是,您必须使用深度优先搜索DFS或广度优先搜索BFS搜索整个网络。技术术语是图形。

关于:

Map<Entity, List<Entity>>
?

映射存储实体本身以及所有后续实体(下一个和/或上一个)的列表。使用键访问映射值始终为O1,这意味着在恒定的时间内访问元素,这并不取决于映射中存储了多少元素


如果您有将实体放置在特殊订单位置的限制,这种方法肯定不起作用。

您需要搜索实体本身吗?如果是这样的话,作为一种通用解决方案,您可以创建一个HashMap,在其中为与您的搜索条件相对应的类设置键。实体将是一个值

如果您能添加更多关于搜索的信息,就有可能提出更充分的解决方案

Ex1:实体具有数字属性,搜索条件是当属性>特定阈值时-RBTReeMap将是解决方案

Ex2:您正在搜索实体序列-可以考虑图形搜索算法


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

我将重点关注实体是什么,并为此定义一个类。如果需要查找实体,只需在创建时将其注册到映射中即可

大概是这样的:

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

这听起来好像你有一个图形类型的问题。也许你可以用neo4jhttp://neo4j.org/ 作为表示关系的一种方式,然后使用其API进行搜索?

但这是否意味着每个实体在映射中存储多次,然后在不同的列表中存储多次?您将只存储对对象的引用,以便分配堆栈上的内存。对象本身在堆上只存储一次。太好了,我试试这个!非常感谢。问题是,我没有任何起始位置,我首先需要搜索每次开始的实体。这就是算法必须快速移动的地方。因此,我正在寻找对象xyz,然后检查它的邻居和它的邻居的邻居等。谢谢,这看起来很好,我将尝试一下。Map是否比tskuzzy提出的HashMap更快?Map只是一个由HashMap实现的接口。但是波希米亚人忘记初始化map:静态map map=newhashmap@我没有忘记初始化它。我故意漏掉了它,就像我漏掉了接球手和二传手一样。我在这里传达课堂设计——我只包括与答案直接相关的代码。但如果这是一个大问题,那么很好-我已经更新了answer@Bohemian没什么大不了的。。我只是想澄清一下,因为你已经初始化了nextenties和preventies。我想做的是在网络/图形中的模拟中保存大量历史事件的记忆,然后搜索某个记忆并跟踪到它的邻居和邻居的邻居的连接,依此类推,寻找符合我搜索模式的记忆组合。例如,我正在验证实体A、B、C和A是否按此顺序存在。广度优先意味着我有某种树集合,但我没有父子关系。圆是可能的。不,你可以在任何类型的图上做BFS,不仅仅是在树上:我正在搜索
只有一个实体,然后检查从该实体开始的实体序列。图搜索算法听起来很有趣。在图论方面,您希望在图上执行什么类型的操作?查找两个节点之间的路径?连接的组件?如果连接了两个节点。。等等……实际上,完全不同的行为。我希望能够使用某个节点的名称/密钥搜索该节点,然后转到它的直接邻居nextEntity及其邻居的邻居。在执行此操作时,我必须检查节点之间的距离,这很可能是附加到每个节点的邻居列表的属性。我还想比较节点的属性。问题是,它不是最终结束的树,因为节点之间的关系允许圆圈-节点a和B可以双向连接,没有父子关系。请尝试将节点映射到其子节点。或者,您可以在Node类中使用具有列表子级的Node。然后你可以对它们进行各种操作。哇,这看起来很有希望。我一定会仔细看看这个。谢谢嗨,在过去的两天里我一直在试用Neo4J,它看起来很有希望,但当我模拟创建1000个节点时,我意识到这个过程有多慢。。。花了几秒钟。我是做错了什么,还是真的那样?