【问题标题】:Why does D'Esopo-Pape algoritham have worst case of exponential time comlexity?为什么 D'Esopo-Pape 算法具有指数时间复杂度的最坏情况?
【发布时间】:2021-08-10 21:20:07
【问题描述】:

D'Escopo-Pape 算法在实现上与 Dijkstra 算法非常相似,适用于负权重边缘,但不适用于负循环。在大多数情况下,它显然比 Dijkstra 算法和 Bellman-Ford 算法更快。但是显然存在这种算法需要指数时间的特殊情况,有人可以提供一些示例或指向我一些更彻底地分析该算法的材料。
这是实现:

struct Edge {
    int to, w;
};

int n;
vector<vector<Edge>> adj;

const int INF = 1e9;

void shortest_paths(int v0, vector<int>& d, vector<int>& p) {
    d.assign(n, INF);
    d[v0] = 0;
    vector<int> m(n, 2);
    deque<int> q;
    q.push_back(v0);
    p.assign(n, -1);

    while (!q.empty()) {
        int u = q.front();
        q.pop_front();
        m[u] = 0;
        for (Edge e : adj[u]) {
            if (d[e.to] > d[u] + e.w) {
                d[e.to] = d[u] + e.w;
                p[e.to] = u;
                if (m[e.to] == 2) {
                    m[e.to] = 1;
                    q.push_back(e.to);
                } else if (m[e.to] == 0) {
                    m[e.to] = 1;
                    q.push_front(e.to);
                }
            }
        }
    }
}

这是我使用的网站的链接:D'Esopo-Pape
就特殊情况和时间复杂性而言,这并没有真正深入。

【问题讨论】:

  • 您真的在问为什么人们更喜欢最坏情况二次(或 V² log V 或其他)的算法而不是通常的算法快速但有时呈指数增长?
  • 是的,我编辑了它,问这样的问题有点愚蠢。因为我大部分时间都花在做竞技编程(当时我还在上高中)所以我默认为小任务(如果您愿意冒险,小的优化可以产生影响)而不是研究或实际项目......

标签: c++ algorithm time-complexity


【解决方案1】:

指数时间

这不是一个完整的证明,如果需要,您可以阅读“关于寻找最短路径树的说明”(Aaron Kershenbaum,1981,https://doi.org/10.1002/net.3230110410)。您可能会发现另一个有趣的来源是“确定最短路径树的标记方法的属性”。

这个算法会出错的直观原因是,如果找到指向它的边,则将集合 M0 中的一个节点再次从中拉出,以便稍后重新检查。这听起来已经是二次的,因为可能有 |V|-1 边缘指向它,所以每个节点都可能被“复活”很多次,但更糟糕的是:这种效果是自我放大的,因为每次一个节点在这样,从该节点传出的边可以导致更多的复活,等等。在完整的证明中,必须注意边缘权重,以确保足够的“复活”可以实际上发生,因为它们是有条件的,因此 [Kershenbaum 1981] 提出了一种构建方法Pape 算法需要指数级步骤的实际示例。

顺便说一句,作者在同一篇论文中说:

我已使用此算法在具有各种长度函数(通常与距离相关)的非常大、非常稀疏的实际网络(数千个节点和 2 到 3 之间的平均节点度)中查找路线,并发现它的性能优于所有其他人。

(但由于没有人使用此算法,因此可用的基准测试并不多,除了 this one,Pape 的算法在其中 没有 比较好)

相比之下,触发指数行为需要结合高度、邻接列表中特定的边顺序以及不寻常的边权重。提到了一些缓解措施,例如在运行算法之前按权重对邻接列表进行排序。

为什么很少使用

我在这方面找不到任何真正的来源,也不要指望它存在,毕竟你不必为不使用一些具有奇怪属性的不寻常算法进行辩护。有指数最坏情况(尽管仔细观察,它似乎不太可能是偶然触发的,而且无论如何 Simplex 算法有指数最坏情况,并且它被使用了 lot),它是相对未知的,并且唯一可用的实际基准对算法“通常有效”的说法提出了质疑(尽管我会注意到他们使用了 4 的度数,这似乎仍然很低,但它绝对高于“介于 2 和 3 之间”用于声称该算法是有效的)。此外,不应期望 Pape 的算法在一般密集图上​​表现良好,即使没有触发指数行为。

【讨论】:

  • 非常感谢!当我第一次读到这个算法时,我真的很困惑,因为它在某些用例中听起来很有希望,但从未给出过最坏情况的实际原因(刚刚提到)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多