我正在向服務器發送字符串並且想要計算複雜性。通信複雜性
對於每個字符串s
我發送s
的所有預製件。因此,我先發送一個字符,然後是兩個字符,然後是三個字符,直到發送|s|
個字符。
這裏的通信複雜性是什麼?我會說O(|s|²)
,但我不確定。
另外在另一種算法中,我發送的每個字符s
的固定大小的數據量,比方說100個字符。所以我發送|s| * 100
個字符。現在這個應該在O(|s|)
對不對?但哪一個更糟?很明顯簡短s
第一個算法是更好的,或者我完全在這裏?
我正在向服務器發送字符串並且想要計算複雜性。通信複雜性
對於每個字符串s
我發送s
的所有預製件。因此,我先發送一個字符,然後是兩個字符,然後是三個字符,直到發送|s|
個字符。
這裏的通信複雜性是什麼?我會說O(|s|²)
,但我不確定。
另外在另一種算法中,我發送的每個字符s
的固定大小的數據量,比方說100個字符。所以我發送|s| * 100
個字符。現在這個應該在O(|s|)
對不對?但哪一個更糟?很明顯簡短s
第一個算法是更好的,或者我完全在這裏?
請糾正我,如果我錯了。
發送一個字符,然後兩個字符,然後三個...直到 發送| s |字符。
當您發送第一個字符時,是剩餘字符(| S | -1)還是每次都要重新開始| S |
假設| S | = N
1 + 2 + ... + N = N(N-1)/ 2
在這種情況下的複雜度爲:O(| S |^2)
在這種情況下複雜度爲:O(| S |)
線性時間複雜度是所有的時間更好,檢查本教程中,瞭解更多有關complexity time
令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 |總是小於100(線性時間複雜度爲100),那麼'| s |^2'複雜度就不會更高效了。 – Blub 2014-10-20 03:08:47
「高效」是非常主觀的。如果你有兩個解決方案,你想比較,你可以根據大O的複雜性來決定哪一個更有效。但在這種情況下,我看不到你有兩種方法。如果s小於100,那麼這不是問題(如果你知道排序算法,一些研究人員更喜歡使用插入排序,儘管事實是二次的,當它們的元素尺寸小於100時)。 – user3378649 2014-10-20 03:12:45