Rubyで回文を判定するプログラムを作成しました。
以下のページを見ると、計算量はO(n)のような関数で表せることがわかります。
https://qiita.com/cotrpepe/items/1f4c38cc9d3e3a5f5e9c
私の作成したこのプログラムは、入力した文字列とその文字列をreverseメソッドによって文字列の順番を逆転させた物を比較して一致するかどうかで回文判定をしています。
つまり文字列の長さに比例して計算量が増えていくので、
入力文字列の長さをnとすると、
計算量=O(n)
となると思っているのですが、合っていますでしょうか?
皆様のご意見を伺いたいです。
ruby
1#ユーザー入力 2puts "回文か判定しますので、文字を入力してください" 3answer=gets.chomp 4#クラス定義、回文判定メソッド定義、処理時間計測開始 5class Word 6 def checkPalindrome(word) 7 word = word.to_s 8 return ( word == word.reverse ) 9 end 10end 11if Word.new.checkPalindrome(answer) 12 puts "それは回文です" 13else 14 puts "それは回文ではありません" 15end 16
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
回文であるかどうかを真面目に判定するとして、
文字列の長さnが偶数の時は、n = 2m より、
str[0] == str[n-1] で、
str[1] == str[n-2] で、……
str[m-1] == str[m]
であるかを調べることになりますかね。(全体の半分を比較すればいい)
同様に文字列の長さnが奇数の場合は、n = 2m+1 から m = (n-1)/2 より、
str[m-1] == str[m+1] までを比較すればいいです。(str[m] は回文にした場合の中心点ですから比較対象が自分自身となります)
どちらにせよ比較のループは最大で m = [n/2] (ただし[] はその中の値を超えない最大の整数)ですから、O(n) です。
※与えられた文字列の後ろ半分を reverse して、ハッシュ値計算……しても変わらないか
多分ですが、よほどへまな実装をしない限り O(n) で判定できるのではないでしょうか。
投稿2019/12/16 07:37
総合スコア13703
0
ベストアンサー
投稿2019/12/15 09:38
編集2019/12/15 14:30退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/12/15 14:01 編集
2019/12/15 11:10
2019/12/15 11:33
2019/12/15 11:54
2019/12/15 13:53
退会済みユーザー
2019/12/15 14:46 編集
退会済みユーザー
2019/12/15 14:04
2019/12/15 14:20
2019/12/18 14:01
退会済みユーザー
2019/12/18 16:01
0
私の作成したこのプログラムは、入力した文字列とその文字列をreverseメソッドによって文字列の順番を逆転させた物を比較して一致するかどうかで回文判定をしています。
つまり文字列の長さに比例して計算量が増えていくので、
ここの論理が分かりません。
「文字列の長さに比例して計算量が増えていく」は「計算量がO(n)」と同一の意味ですが、
あなたがの質問は
「私のプログラムは文字列の長さに比例して計算量が増えていくが、これは計算量がO(n)か?」でよろしいですか?
それならば定義の問題なので、答えは「はい」です。
ただ、あなたのプログラムが文字列の長さに比例して計算量が増えていくかどうかは、reverseや==の実装に依存しますので私は確信を持って答えられません。
たぶん常識的な長さの範囲においてはほとんどO(n)になるんではないかなあとは思いますが。
投稿2019/12/15 07:18
総合スコア3047
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/15 07:33
2019/12/15 07:57
2019/12/15 08:10
退会済みユーザー
2019/12/15 09:38
2019/12/15 10:00
退会済みユーザー
2019/12/15 10:29
2019/12/15 11:15
退会済みユーザー
2019/12/15 13:34
0
合っていると思います。
投稿2019/12/14 08:26
総合スコア23567
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。