2016-03-21 29 views

回答

4

您正在重複使用N表示兩件事。真的應該有三個變量:

  • N是整個字符串
  • M的長度是字符串
  • O中的字的數量是每個字的(平均)長度

然後你的整個算法將運行在O(N + M*O)。但是,M*O始終會比N小,因爲字符串由單詞和將它們分隔開的空格組成。所以你可以簡化整個事情到O(N)

+0

感謝您的答案如果原始輸入是list = ['foo','bar','hello','world'],並且我只翻轉每個單詞(而不是整個列表),那麼每個單詞的平均長度確實有幫助。答案是O(M * O),對吧? –

+0

實際上,'M * O == N',因爲'O'(根據定義)'N/M'。 – chepner

+0

'M * O'通常會在一般情況下略小於'N',因爲原始字符串中的單詞之間會有空格。 – Blckknght

1

如果您使用N作爲整個字符串的長度,那麼您不應該使用N * M來表示反轉每個單詞,它只是N,因爲您要通過整個字符串本身兩次:一次扭轉它,並且一次扭轉單個單詞。

編輯:如果給你一個字符串列表,並且要扭轉名單其次是字符串本身的反轉的順序,那麼這將是O(N)+ O(L * M) ,其中N是數組中元素的數量,M是單詞的長度,因爲數組與單詞是分開的。您可以顛倒數組的順序而不顛倒單詞,這是與單詞分開的計算。當你翻轉單詞時,單詞的長度乘以你正在翻轉的單詞的數量。

+0

顛倒O(N)的整個列表與對整個列表O(N * M)中的每個字符串執行反轉不同嗎?我在這裏錯過了什麼? –

+0

你定義爲N是什麼?這是整個字符串的長度。你爲什麼用整個字符串的子串乘以整個字符串的長度?你正在尋找的第二個數字將更接近L * M,L是字符串的數量,M是每個的長度。然而,子字串數乘以字數將我們帶回原來的N –

+0

啊,我明白了!謝謝你清理那個。假設原始輸入是這個字符串列表(list = ['foo','bar','hello','world'],整個列表的反轉是否爲O(N),然後是每個元素的反轉是O(N * M)? –

0

看代碼做什麼:

  1. 它會掃描整個句子(N字)找字邊界。
  2. 對於每個單詞,它會反轉單詞。單詞中W字符的反轉函數循環W/2次。
  3. 最後,它顛倒了整個字符串(N/2個循環)。

棘手的部分是逆轉單詞。因爲這些單詞都是同一個句子的一部分,所以你可以將它們看作是對整個句子的另一遍遍。

這使得:

  1. 爲O(n)
  2. 爲O(n)
  3. 爲O(n)

所以整個事情是O(3N),這是上)。