我目前正在优化我的代码。为了做到这一点,我必须确保我的顺序BFS完美地工作。然后,我应该应用线程或executor服务并行运行它。如果图形太大,我的BFS会崩溃吗?
public void bfs(int rootNode, isvisited visitor)
{
// BFS uses Queue data structure
Queue<Integer> q = new LinkedList<Integer>();
int currentLevel = 0;
q.add(rootNode);
visitor.visit(rootNode, currentLevel);
while (!q.isEmpty())
{
currentLevel++;
Set<Integer> nextNodes = new LinkedHashSet<Integer>();
q.forEach(currNode ->nextNodes.addAll(outgoingNeighbors(currNode)));
q.clear();
for (int child : nextNodes)
{
visitor.visit(child, currentLevel);
q.add(child);
}
} }发布于 2017-03-03 03:04:42
..。为了做到这一点,我必须确保我的顺序BFS完美地工作。..。
你有没有试过写一些单元测试来证明或否定这个功能?总的来说,对我来说,它看起来很好,尽管它真的取决于visitor.visit(...)做什么。另外,还不清楚outgoingNeighbors是干什么的。
次要评论:
q.forEach(currNode ->nextNodes.addAll(outgoingNeighbors(currNode)));缺少一个空格for (int child : nextNodes)...也可以使用forEach。..。我应该应用线程或executor服务并行运行它。
当使用多线程时,我的建议是总是把事情分解成不依赖的任务。目前,“访客”对象似乎有点可疑,并可能导致未来的麻烦。
你有做多线程的代码吗?
如果图形太大,我的BFS会崩溃吗?
好的。如果您的意思是您可以调用一个1000个节点的东西,应该是好的。如果您计划在chromebook上创建100万个线程,您可能会遇到一些问题。这真的取决于你对大的定义和你正在使用的限制。
请注意,规模问题通常通过优化代码/解决方案或以分布式方式解决问题来解决。如果您开始遇到这样的问题,我建议您从调试器开始,找出问题所在,然后开始为您发现的任何问题找到一个很好的解决方案。
发布于 2017-03-03 12:32:55
既然Rishi已经解决了您的问题,那么让我来谈谈您的代码:
IsVisited。尽管如此,这整件事对我来说还是很可疑的。字体名称很奇怪。通常,is-prefix是为布尔人保留的。因此,该类型可能更好地命名为BFSVisitor或类似于这些代码的名称。q应该是queueclear()应该是不必要的。https://codereview.stackexchange.com/questions/156758
复制相似问题