算法找到最有效的并行发送数据的方式

Algorithm to find most efficient way to send data parallely

本文关键字:数据 方式 并行 算法 有效      更新时间:2023-10-16
有 2 台计算机 A 和 B.计算机 A 可以以 x MB/s 的速度发送数据

,计算机 B 可以以 y MB/s 的速度发送数据。
示例 - 如果 x = 20、y = 10 和 Z = 100,则最短时间为 4 秒,因为计算机 A 可以在 4 秒内发送 80 MB 数据,B 可以在 2 秒内并行发送 20 MB 数据。
下面给出的算法的时间复杂度为 O(n^2)。我们如何以更有效的方式解决它?

编辑 - 如何为n台计算机完成并找到从每台计算机发送的数据?

我的解决方案 -

int main()
{
    int x = 50;
    int y = 10;
    int Z = 200;
    vector<int> xvec, yvec;
    for(int i = x;i <= Z; i+= x)
    {
        xvec.push_back(i);
    }
    for(int i = y;i <= Z; i+= y)
    {
        yvec.push_back(i);
    }
    for(int i = 0; i < xvec.size(); i++)
    {
        for(int j = 0; j < yvec.size(); j++)
        {
            if(xvec[i] + yvec[i] >= Z)
            {
                cout << "min time : " << i+1;
                exit(0);
            }
        }
    }
}

如果问题是真的要为这两个节点计算它,那么对你的问题的评论很好。如果问题是针对任意数量的节点进行计算,那么您的问题就是图中流问题的一个实例。因此,将您的问题编码为图形并使用已知的标准算法,例如,福特-富尔克森 O(|V|*|E|u_{max}), 埃德蒙·卡普 O(|V||E|^2),或 Dinic O(|V|^2*|E|)。找到最大流量后,您可以将数据量除以最大流量。

如何为n台计算机完成?

逻辑z/(x1+x2+...+xn)是理解逻辑的最有效和最简单的方法。

使用函数ceil将提供您拥有用于许多计算的剩余部分,例如 50 MB 和 3 台速度为每秒 5 MB、4 MB 和 2 MB 的计算机。计算后,您可能的最小时间是50/(5+4+2)=4.54,系统将在 4 秒后再等待一秒钟来处理0.54 s部分(将决定执行哪台计算机 - 可能是最快的计算机)。