沟通复杂性

时间:2014-10-20 00:50:03

标签: algorithm complexity-theory time-complexity

我正在向服务器发送字符串,并希望计算复杂性。

对于每个字符串s,我发送s的所有前缀。因此,我首先发送一个字符,然后发送两个字符,然后发送三个......直到发送|s|个字符。

这里的通信复杂性是什么?我会说O(|s|²)但我不确定。

另外在另一种算法中,我为s中的每个字符发送一个固定大小的数据,比方说100个字符。所以我发送了|s| * 100个字符。现在这应该在O(|s|)对吗?但哪一个更糟糕?显然,简短的s第一个算法更好,或者我完全离开这里?

2 个答案:

答案 0 :(得分:1)

如果我错了,请纠正我。

  

发送一个字符,然后发送两个字符,然后发送三个......直到   发送| s |字符。

当您发送第一个字符时,剩余的字符(| S | -1)或您是否每次都重新开始| S |

  • 第一种可能性:

让我们说| S | = n

1 + 2 + ... + N = N(N-1)/ 2

这种情况的复杂性是:O(| S | ^ 2)

  • 第二种可能性: 1 + 2 + ... +α= | S |

这种情况的复杂性是:O(| S |)

线性时间复杂度始终更好,请查看本教程以获取有关complexity time

的更多信息

答案 1 :(得分:0)

设c表示第二算法中的因子。在您的示例中,您将c设置为100.然后您的第二个算法将需要c * | s |要转移的字符。正如user3378649指出的那样,你的第一个算法要求转移| s | *(| s | -1)/ 2个字符。

所以现在,每当c * | s |时,应该很容易看出它们具有相同的成本= | s | *(| s | -1)/ 2,或更简洁:

c =(| s | -1)/ 2

显然,如果c< (| s | -1)/ 2则第二算法的成本较低,如果c> (| s | -1)/ 2,第一个算法的成本会更低。

话虽如此,你应该把这些想法视为一个实际问题:

  1. | s |的典型值是多少?如果您保证始终满足其中一个不等式(例如,如果您可以保证| s |< 10),则应选择适当的算法。
  2. 您的系统对延迟时间有多宽容?如果您始终使用第一个算法,则在获得异常大的字符串时可能会遇到麻烦。即使99%的数据真的很短,长时间延迟造成的潜在用户影响也是一个问题。
  3. 您可以考虑使用两种算法:在| s |时使用第一种算法很小,在| s |时使用第二种算法很大。
  4. 您是否考虑过将整个字符串发送到合理大小的块中,并让通信的另一方找出前缀?数据传输通常比计算时间更昂贵。此外,必须考虑启动通信的成本。通信传输通常使用块大小最小,因此不鼓励分解小消息。
  5. 祝你好运!