ネストされたwhileループをO(n)にするにはどうすればよいですか?

ジェイクウェスト

私はここにサイトwww.interviewcake.comからこのコードを持っています。サイトはO(n)であると言っています、そしてインタビューケーキでチームメンバーに説明を求めたところ、彼らはこれが真実であることを確認しました。コードは次のとおりです。

function reverseWords(message) {

  // First we reverse all the characters in the entire message
  reverseCharacters(message, 0, message.length - 1);
  // This gives us the right word order
  // but with each word backward

  // Now we'll make the words forward again
  // by reversing each word's characters

  // We hold the index of the *start* of the current word
  // as we look for the *end* of the current word
  let currentWordStartIndex = 0;
  for (let i = 0; i <= message.length; i++) {

    // Found the end of the current word!
    if (i === message.length || message[i] === ' ') {

      // If we haven't exhausted the string our
      // next word's start is one character ahead
      reverseCharacters(message, currentWordStartIndex, i - 1);
      currentWordStartIndex = i + 1;
    }
  }
}

function reverseCharacters(message, leftIndex, rightIndex) {

  // Walk towards the middle, from both sides
  while (leftIndex < rightIndex) {

    // Swap the left char and right char
    const temp = message[leftIndex];
    message[leftIndex] = message[rightIndex];
    message[rightIndex] = temp;
    leftIndex++;
    rightIndex--;
  }
}

インタビューケーキのチームメンバーがこれを言ったという説明:

*はい、O(n ^ 2)のように見えるネストされたループがあります。

しかし、問題の過程で、各内部ループでO(n)文字を反転していないことがわかります...各文字を正確に2回だけ反転します。したがって、総コストはO(n)になります。

これはトリッキーなものです。なぜなら、各呼び出しを単独で行うのではなく、アルゴリズム全体でreverseCharactersへのすべての呼び出しのコストを調べる必要があるからです。*

ただし、内側のループで各文字をループしているため、まだ混乱しています。文字列が大きくなるほど、呼び出しの実行に時間がかかります。

これを別のチャネルに開いて、これについてさらに洞察を得ることができるかどうか、そしてなぜO(n)^ 2ではなくO(n)であるのかを確認したかったのです。

完全に明確にするために、reverseWords上記のコード関数がO(n)^ 2ではなくO(n)である理由について説明したいと思います。

RobH

そのコードで私が言えることから、外側のループの仕事は各単語の終わりを探すことです。1つが見つかると(そしてそのときだけ)、reverseCharacters()その単語の文字を逆にするために呼び出されます。したがって、2つのタスクの大きなOは、乗算される(O(n)* O)のではなく、加算されます(O(n)+ O(n)= O(2n)、これは依然としてO(n)と見なされます)。 (n)= O(n ^ 2))は、ネストされたループで通常行われると予想されるとおりです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ネストされた2番目のwhileループで変数値を使用できるようにするにはどうすればよいですか?

分類Dev

ネストされたループにitertoolsを使用するにはどうすればよいですか?

分類Dev

正しいネストされたループを作成するにはどうすればよいですか?

分類Dev

jQueryでネストされたforeachループを使用するにはどうすればよいですか?

分類Dev

ネストされたループ内で$ _を使用するにはどうすればよいですか?

分類Dev

2つのネストされたループを終了するにはどうすればよいですか?

分類Dev

ネストされたforループを除外するにはどうすればよいですか?

分類Dev

このネストされたループを改善するにはどうすればよいですか?

分類Dev

このネストされたループを改善するにはどうすればよいですか?

分類Dev

PHP MySQLのwhileループ内でネストされたステートメントを実行するにはどうすればよいですか?

分類Dev

whileループのネストされたforループでOpenMPを使用するにはどうすればよいですか?

分類Dev

配列オブジェクトのネストされた配列の条件でWhileループを使用するにはどうすればよいですか?

分類Dev

Rubyでネストされたwhileループを使用して配列を反復処理するにはどうすればよいですか?

分類Dev

PHP-if isset条件内にwhileループをネストするにはどうすればよいですか?

分類Dev

ネストされたテーブルをdivに追加するにはどうすればよいですか?

分類Dev

AngularJSでネストされたテーブルを作成するにはどうすればよいですか?

分類Dev

ネストされたループとは何ですか? また、以下の例でそれを使用するにはどうすればよいですか?

分類Dev

ネストされたforループでcontinueステートメントのようなものを使用するにはどうすればよいですか?

分類Dev

ngForループにAngularのネストされたコンポーネントを設定するにはどうすればよいですか?

分類Dev

ネストされたクラスのフィールドを実際にプライベートにするにはどうすればよいですか?

分類Dev

ネストされたクラスのフィールドを実際にプライベートにするにはどうすればよいですか?

分類Dev

XとXを倍数にするRでネストされたforループを作成するにはどうすればよいですか?

分類Dev

ナビゲーションを構築するときにネストされたループを回避するにはどうすればよいですか?

分類Dev

ネストされたストアパイプを作成するにはどうすればよいですか?

分類Dev

ネストされたループから抜け出すにはどうすればよいですか?

分類Dev

forループを使用せずにstr_splitを使用してネストされたリストを分割するにはどうすればよいですか?

分類Dev

ネストされたforループの最初のforループを1行に出力するにはどうすればよいですか?

分類Dev

最初の要素に基づいてネストされたリストをグループ化するにはどうすればよいですか?

分類Dev

Pythonでこれらのネストされたループをベクトル化するにはどうすればよいですか?

Related 関連記事

  1. 1

    ネストされた2番目のwhileループで変数値を使用できるようにするにはどうすればよいですか?

  2. 2

    ネストされたループにitertoolsを使用するにはどうすればよいですか?

  3. 3

    正しいネストされたループを作成するにはどうすればよいですか?

  4. 4

    jQueryでネストされたforeachループを使用するにはどうすればよいですか?

  5. 5

    ネストされたループ内で$ _を使用するにはどうすればよいですか?

  6. 6

    2つのネストされたループを終了するにはどうすればよいですか?

  7. 7

    ネストされたforループを除外するにはどうすればよいですか?

  8. 8

    このネストされたループを改善するにはどうすればよいですか?

  9. 9

    このネストされたループを改善するにはどうすればよいですか?

  10. 10

    PHP MySQLのwhileループ内でネストされたステートメントを実行するにはどうすればよいですか?

  11. 11

    whileループのネストされたforループでOpenMPを使用するにはどうすればよいですか?

  12. 12

    配列オブジェクトのネストされた配列の条件でWhileループを使用するにはどうすればよいですか?

  13. 13

    Rubyでネストされたwhileループを使用して配列を反復処理するにはどうすればよいですか?

  14. 14

    PHP-if isset条件内にwhileループをネストするにはどうすればよいですか?

  15. 15

    ネストされたテーブルをdivに追加するにはどうすればよいですか?

  16. 16

    AngularJSでネストされたテーブルを作成するにはどうすればよいですか?

  17. 17

    ネストされたループとは何ですか? また、以下の例でそれを使用するにはどうすればよいですか?

  18. 18

    ネストされたforループでcontinueステートメントのようなものを使用するにはどうすればよいですか?

  19. 19

    ngForループにAngularのネストされたコンポーネントを設定するにはどうすればよいですか?

  20. 20

    ネストされたクラスのフィールドを実際にプライベートにするにはどうすればよいですか?

  21. 21

    ネストされたクラスのフィールドを実際にプライベートにするにはどうすればよいですか?

  22. 22

    XとXを倍数にするRでネストされたforループを作成するにはどうすればよいですか?

  23. 23

    ナビゲーションを構築するときにネストされたループを回避するにはどうすればよいですか?

  24. 24

    ネストされたストアパイプを作成するにはどうすればよいですか?

  25. 25

    ネストされたループから抜け出すにはどうすればよいですか?

  26. 26

    forループを使用せずにstr_splitを使用してネストされたリストを分割するにはどうすればよいですか?

  27. 27

    ネストされたforループの最初のforループを1行に出力するにはどうすればよいですか?

  28. 28

    最初の要素に基づいてネストされたリストをグループ化するにはどうすればよいですか?

  29. 29

    Pythonでこれらのネストされたループをベクトル化するにはどうすればよいですか?

ホットタグ

アーカイブ