回文再帰アルゴリズムの時間の互換性

シェルドン・クーパー

回文を見つけるために、この再帰関数を作成しました。

def palindrome(string):
    print("palindrome called with:"+string)
    if(len(string)<=3):
        return string[0]==string[-1]
    else:
        res=palindrome(string[1:-1])
        print("palindrome returned:"+str(res))
        return res

私は今、このアルゴリズムの時間計算量を見つけました。私の質問は私のベースケースですよね?len <= 3はどれですか?これを、インターネット上のいたるところにあるフィボナッチと階乗アルゴリズムの古典的な例に関連付けることはできません

害虫

はい、事実はあなたのベースケースだけが正しいということです。

したがって、ここで行う必要があるのは、最初と最後の文字が同じであるかどうかを確認してから、残りの文字列も回文であるかどうかを確認することです。しかし、どの時点でもそれをチェックしていません。

したがって、コードの変更を最小限に抑えれば、次の解決策が機能します。空の文字列が引数として渡された場合、これは失敗します。

def palindrome(string):
    print("palindrome called with:"+string)
    if(len(string)<=3):
        return string[0]==string[-1]
    else:
        if string[0] == string[-1]:
            res=palindrome(string[1:-1])
            print("palindrome returned:"+str(res))
            return res
        else:
            return False

間違いなく、これを書くためのより良い方法があります。

def palindrome(s):
    return s == '' or (s[0]==s[-1] and palindrome(s[1:-1]))

私が行ったのは、さらに2つの再帰呼び出しを行わせることで、基本ケースをさらに減らすことです。

さて、時間計算量になります。これは両方のコードで同じです。

1つの関数呼び出しでO(1)、最初と最後の文字を比較する操作を実行しています。そして、この再帰呼び出しはほとんどの場合行われていn/2ます。n/2なぜなら、長さの文字列ではn、各呼び出しで2文字を削除しているからです。したがって、全体的な複雑さは次のようになりO(n)ます(これは、すべての再帰呼び出しで文字列のコピー/スライスを無視することに注意してください)。

最後に、すべての再帰呼び出しの前に(スライス時に)新しい文字列を作成するため、これを再帰的に回避する必要があります。

def palindrome(s):
    def _palindrome(string, i, j):
        if i >= j:
            return True
        return string[i] == string[j] and _palindrome(string, i + 1, j - 1)
    return _palindrome(s, 0, len(s) - 1)

これは、すべての呼び出しでコピーを作成するわけではありません。したがって、これは間違いなくO(n)解決策です。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

Java の再帰的アルゴリズムの時間的複雑性

分類Dev

再帰的アルゴリズムの時間計算量の分析

分類Dev

再帰的なwebcrawlerの同時実行性-Javaのアルゴリズム

分類Dev

再帰的アルゴリズムの時間計算量:コインの変更

分類Dev

複数の再帰を伴うアルゴリズムの時間計算量

分類Dev

再帰的アルゴリズムの時間計算量の計算

分類Dev

反復および再帰アルゴリズムの時間計算量

分類Dev

再帰的アルゴリズムの時間計算量を証明する

分類Dev

再帰的アルゴリズムの分析

分類Dev

ファイル再帰アルゴリズムの時間と空間の複雑さ

分類Dev

パリンドローム再帰アルゴリズムの時間の複雑さ

分類Dev

次の再帰的アルゴリズムの時間計算量はどのくらいですか?

分類Dev

二項係数を計算するための再帰的アルゴリズムの時間計算量

分類Dev

ネストされた反復関数を使用した再帰的アルゴリズムの時間計算量?

分類Dev

再帰的フィボナッチアルゴリズムの時間計算量を手動で計算する

分類Dev

実行ごとに2つに分割される再帰的アルゴリズムの時間計算量

分類Dev

再帰的アルゴリズムの正当性を証明する方法

分類Dev

アルゴリズム時間分析:再帰ケースパズル

分類Dev

文字列置換アルゴリズムの時間計算量

分類Dev

単一の再帰呼び出しアルゴリズムを分岐する複数の再帰呼び出しアルゴリズムに変換します

分類Dev

再帰的なアルゴリズムの複雑さの分析

分類Dev

Javaでの再帰的アルゴリズムの最適化

分類Dev

予算の旅程の再帰的アルゴリズム

分類Dev

Pythonの2D配列の再帰的アルゴリズム

分類Dev

アルゴリズムの再帰式の作り方

分類Dev

再帰的アルゴリズムのデバッグ

分類Dev

Javaの基本的な再帰アルゴリズム

分類Dev

Ruby再帰アルゴリズムの問題

分類Dev

アルゴリズムからの再帰方程式

Related 関連記事

  1. 1

    Java の再帰的アルゴリズムの時間的複雑性

  2. 2

    再帰的アルゴリズムの時間計算量の分析

  3. 3

    再帰的なwebcrawlerの同時実行性-Javaのアルゴリズム

  4. 4

    再帰的アルゴリズムの時間計算量:コインの変更

  5. 5

    複数の再帰を伴うアルゴリズムの時間計算量

  6. 6

    再帰的アルゴリズムの時間計算量の計算

  7. 7

    反復および再帰アルゴリズムの時間計算量

  8. 8

    再帰的アルゴリズムの時間計算量を証明する

  9. 9

    再帰的アルゴリズムの分析

  10. 10

    ファイル再帰アルゴリズムの時間と空間の複雑さ

  11. 11

    パリンドローム再帰アルゴリズムの時間の複雑さ

  12. 12

    次の再帰的アルゴリズムの時間計算量はどのくらいですか?

  13. 13

    二項係数を計算するための再帰的アルゴリズムの時間計算量

  14. 14

    ネストされた反復関数を使用した再帰的アルゴリズムの時間計算量?

  15. 15

    再帰的フィボナッチアルゴリズムの時間計算量を手動で計算する

  16. 16

    実行ごとに2つに分割される再帰的アルゴリズムの時間計算量

  17. 17

    再帰的アルゴリズムの正当性を証明する方法

  18. 18

    アルゴリズム時間分析:再帰ケースパズル

  19. 19

    文字列置換アルゴリズムの時間計算量

  20. 20

    単一の再帰呼び出しアルゴリズムを分岐する複数の再帰呼び出しアルゴリズムに変換します

  21. 21

    再帰的なアルゴリズムの複雑さの分析

  22. 22

    Javaでの再帰的アルゴリズムの最適化

  23. 23

    予算の旅程の再帰的アルゴリズム

  24. 24

    Pythonの2D配列の再帰的アルゴリズム

  25. 25

    アルゴリズムの再帰式の作り方

  26. 26

    再帰的アルゴリズムのデバッグ

  27. 27

    Javaの基本的な再帰アルゴリズム

  28. 28

    Ruby再帰アルゴリズムの問題

  29. 29

    アルゴリズムからの再帰方程式

ホットタグ

アーカイブ