Algorithm 通信复杂性

Algorithm 通信复杂性,algorithm,complexity-theory,time-complexity,Algorithm,Complexity Theory,Time Complexity,我正在向服务器发送字符串,并希望计算复杂性 对于每个字符串s我将发送s的所有前缀。因此,我首先发送一个字符,然后两个字符,然后三个。。。直到发送| s |字符 这里的通信复杂性是什么?我本来会说“O(| s |²),但我不确定 在另一个算法中,我为s中的每个字符发送一个固定大小的数据量,比如说100个字符。所以我发送了100个字符。现在应该是O(| s |)对吗?但哪一个更糟糕?显然,简而言之,第一种算法更好,还是我完全错了?如果我错了,请纠正我 发送一个字符,然后两个字符,然后三个。。。直到

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

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

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


在另一个算法中,我为
s
中的每个字符发送一个固定大小的数据量,比如说100个字符。所以我发送了100个字符。现在应该是
O(| s |)
对吗?但哪一个更糟糕?显然,简而言之,第一种算法更好,还是我完全错了?

如果我错了,请纠正我

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

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

  • 对于第一种可能性:
假设| s |=n

1+2+…+n=n(n-1)/2

本例中的复杂性为:O(|S | ^2)

  • 关于第二种可能性: 1+2+…+a=| S|
这种情况下的复杂性是:O(| S |)


线性时间复杂度一直都比较好,请查看本教程以了解有关第二种算法中让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,则第一个算法的成本较低

话虽如此,您应将这些想法视为一个实际问题:

  • 您的| s |的典型值是多少?如果你保证总是满足其中一个不等式(比如如果你能保证| s |<10),你应该选择合适的算法
  • 您的系统对更长的延迟有多大的容忍度?如果您一直使用第一种算法,当您得到一个异常大的字符串时,您可能会遇到麻烦。即使99%的数据都很短,但长时间延迟可能会对用户造成潜在影响
  • <> LI>可以考虑使用这两种算法:当S小时使用第一个算法,当S很大时使用第二个算法。
  • 您是否考虑过将整个字符串以合理大小的块发送,并让通信的另一端计算前缀?数据传输通常比计算时间更昂贵。此外,还必须考虑发起通信的成本。通信传输通常使用最小块大小,因此不鼓励分解小消息
    祝你好运

    是的,这是第一个。但我想知道,假设我知道| s |总是小于100(线性时间复杂度有一个因子100),那么
    |s | ^2
    复杂度不是更有效吗?“有效”是非常主观的。如果您有两个解决方案,并且您想要进行比较,那么您可以根据big-O的复杂性来决定哪一个更有效。但在这种情况下,我不认为你有两种方法。如果s小于100,这不是问题所在(如果你知道排序算法,一些研究人员更喜欢使用插入排序,尽管事实上插入排序是二次的,当他们的元素较小时)