我正在用Java编写一个程序,其中必须实现三种搜索算法,其中之一是深度优先图搜索算法。我的程序遍历由邻接矩阵表示的连通图,并使用前沿和已探索集合来执行每个算法。
前沿存储已扩展父节点的未探索子节点,而已探索集合存储已扩展的节点。已探索集合的目的是避免重复,从而避免无限循环。
我的前沿使用链接阻塞双端队列实现,而我的已探索集合使用链接散列表实现。
然而,在测试该算法实现的初始版本时,我注意到仍然存在少量的重复项,特别是当目标节点不存在时,算法肯定必须访问图中的每个节点。最终我意识到,这是因为当一个节点被扩展时,它的所有子节点都被添加到前沿,但只有其中一个被探索。因为图是连通的,所以其他路径可能存在于节点中,这可能导致在将其添加到已探索集合之前,该节点多次遇到。
这引出了我的问题:我应该解决它吗?
深度优先搜索应该首先探索形成图的树的一侧,然后回溯,这意味着即使它在树的一侧遇到了次优的目标节点,它也应该返回那个节点而不是以前尚未探索的(更优的)节点。
然而,如果我正在实现一个已探索集合以避免重复,则在某些情况下允许出现重复似乎相矛盾。
我认为真正的错误可能在于没有深入理解算法,因此真诚地希望能得到帮助,谢谢您。
前沿存储已扩展父节点的未探索子节点,而已探索集合存储已扩展的节点。已探索集合的目的是避免重复,从而避免无限循环。
我的前沿使用链接阻塞双端队列实现,而我的已探索集合使用链接散列表实现。
然而,在测试该算法实现的初始版本时,我注意到仍然存在少量的重复项,特别是当目标节点不存在时,算法肯定必须访问图中的每个节点。最终我意识到,这是因为当一个节点被扩展时,它的所有子节点都被添加到前沿,但只有其中一个被探索。因为图是连通的,所以其他路径可能存在于节点中,这可能导致在将其添加到已探索集合之前,该节点多次遇到。
这引出了我的问题:我应该解决它吗?
深度优先搜索应该首先探索形成图的树的一侧,然后回溯,这意味着即使它在树的一侧遇到了次优的目标节点,它也应该返回那个节点而不是以前尚未探索的(更优的)节点。
然而,如果我正在实现一个已探索集合以避免重复,则在某些情况下允许出现重复似乎相矛盾。
我认为真正的错误可能在于没有深入理解算法,因此真诚地希望能得到帮助,谢谢您。