假设我们有n个进程形成一般网络。我们不知道哪些连接在一起,但我们知道进程的数量(n)。如果在每一轮,进程向它连接的所有进程发送一条消息,从每个进程接收1条消息,并且程序执行r轮次,有没有办法找到程序执行期间发送了多少消息?
答案 0 :(得分:1)
正如您所指出的,如果没有确切的网络结构,就无法对发送的消息数量设置特定值。相反,我们可以看看它的Big-O值。
现在只是要明确我们对Big-O的意思:
N / 2
个其他进程),我们必须假设最坏的情况因此,让我们假设最坏的情况,其中每个进程都连接到N - 1
个其他进程。
我们还要定义一些变量:
S
:=进程集N
:= S
我们可以将集合S
表示为完整的(每个节点连接到每个其他节点),无向图,其中图中的每个节点对应一个进程,图中的每个边对应于发送的2个消息(1个传出传输和1个回复)。
从here开始,我们看到完整图表中的边数为(N(N-1))/2
因此,在最糟糕的情况下,发送的邮件数量为N(N-1)
或N^2 - N
。
现在因为我们正在处理Big-O表示法,我们对这个值如何随N
的变化而增长感兴趣。
通过三角不等式,我们可以看到O(N^2 - N)
是O(N^2)
的元素。
因此,在最坏的情况下,发送的消息数量会增加为N^2
。
也可以使用邻接矩阵得出此结果,该邻接矩阵是N x N
矩阵,其中1
元素中的(i, j)
引用节点{{ 1}}到节点i
。
因为在原始问题中,每个流程都会向所有已连接的流程发送一条消息,而这些流程会通过单个消息进行响应,我们可以看到,对于每对j
和(i, j)
,都会有边缘(一个代表传出消息,一个代表回复)。例外情况是(j, i)
对,即。我们一个进程不会向自己发送消息。
所以矩阵将完全填充i = j
s,但对角线除外。
1
上方:N = 4 的邻接矩阵。
因此,我们首先要确定发送的消息总数的公式,作为节点数的函数。
通过矩形区域,我们可以看到矩阵中0 1 1 1
1 0 1 1
1 1 0 1
1 1 1 0
的数量(忽略对角线)将是1
。
现在我们必须考虑对角线。函数N x N = N^2
给出了可以存在的对(x, x)
的数量 - 这意味着该函数将有完全N个不同的解。
因此,总体结果是,当考虑对角线时,我们会收到f(i) where Z(N) -> Z(N) x Z(N) : f(i) = (i, i)
条消息。
现在,我们使用与上面相同的Big-O推理得出相同的结论,消息的数量在最坏的情况下增长为N^2 - N
。
所以,现在你只需要考虑已经发生的轮数,留下你的O(RN ^ 2)。
当然,现在你必须考虑你是否确实遇到了最糟糕的情况......