我正在向服务器发送字符串,并希望计算复杂性。
对于每个字符串s
,我发送s
的所有前缀。因此,我首先发送一个字符,然后发送两个字符,然后发送三个......直到发送|s|
个字符。
这里的通信复杂性是什么?我会说O(|s|²)
但我不确定。
另外在另一种算法中,我为s
中的每个字符发送一个固定大小的数据,比方说100个字符。所以我发送了|s| * 100
个字符。现在这应该在O(|s|)
对吗?但哪一个更糟糕?显然,简短的s
第一个算法更好,或者我完全离开这里?
答案 0 :(得分:1)
如果我错了,请纠正我。
发送一个字符,然后发送两个字符,然后发送三个......直到 发送| s |字符。
当您发送第一个字符时,剩余的字符(| S | -1)或您是否每次都重新开始| S |
让我们说| S | = n
1 + 2 + ... + N = N(N-1)/ 2
这种情况的复杂性是:O(| S | ^ 2)
这种情况的复杂性是: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,第一个算法的成本会更低。
话虽如此,你应该把这些想法视为一个实际问题: