有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);
}
}
}
}
答案 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
部分(将决定执行哪台计算机 - 可能是最快的计算机)。