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

时间:2016-06-05 13:58:20

标签: c++ algorithm

有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);
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

如果真的要为这两个节点计算问题,那么对你的问题的评论就可以了。如果问题是计算任意数量的节点,那么您的问题就是图中流问题的一个实例。因此,在图表中编码您的问题并使用已知的标准算法,例如,Ford-Fulkerson O(| V | * | E | u_ {max}),Edmund Karp O(| V | | E | ^ 2),或Dinic O(| V | ^ 2 * | E |)。 找到最大流量后,您可以将数据量除以最大值。流动。

答案 1 :(得分:0)

  

如何为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部分(将决定执行哪台计算机 - 可能是最快的计算机)。