了解BFS的运行时复杂性

时间:2016-10-06 01:42:58

标签: algorithm time-complexity breadth-first-search

我很难理解BFS算法时间复杂度的一个要素。

对于无向图,我的教授说每条边(u,v)遍历两次。从u的方向开始,从v的方向开始一次。因此,找到与至少一个顶点相邻的所有未标记顶点的步骤是O(| E |)。

有人可以解释如何在有向图中遍历每条边,在无向图中遍历两次吗?我想,对于BFS,我们只是从根顶点向外走?第二次遍历来自哪里?

1 个答案:

答案 0 :(得分:1)

假设您正在使用邻接列表来存储图表。

#include <fstream>
#include <vector>
#include <iterator>

MainPage::MainPage()
{
    InitializeComponent();

    std::ifstream input("Assets\\StoreLogo.png", std::ios::binary);
    std::vector<char> data((std::istreambuf_iterator<char>(input)), (std::istreambuf_iterator<char>()));

    // I just obtained a pointer to the image data through data.data()

    auto bitmapImage = ref new BitmapImage();
    image->Source = bitmapImage;

    auto stream = ref new InMemoryRandomAccessStream();
    auto writer = ref new DataWriter(stream->GetOutputStreamAt(0));

    writer->WriteBytes(ArrayReference<unsigned char>((unsigned char*)data.data(), data.size()));

    create_task(writer->StoreAsync()).then([=](unsigned bytesStored)
    {
        return bitmapImage->SetSourceAsync(stream);
    });
}

在无向图中 v u 在彼此的邻接列表中。因此,在第16行,当我们检查相邻节点时,当前节点是 u 时,我们检查相邻节点 v 并且当前节点是 u 我们检查相邻节点 v 。但这并不意味着我们再次在队列中推送 v 。我们只是检查它。

但是,在无向图中,只有 v 位于 u 的邻接列表中。因此每个边缘 u-> v 都会被检查一次。

我认为你的教授意味着我们检查每个边缘两次而不是遍历