質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

4818閲覧

strlen とlenの違い

arare000

総合スコア26

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

0クリップ

投稿2016/11/15 19:39

C言語では、strlenの処理速度はO(n)ですが、PythonではlenのスピードはO(1)になると知りました。この原因は何でしょうか?? なぜこの点処理についてはC言語よりPythonの方が早いのか、ご存じの方はいらっしゃいますでしょうか。

退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

C言語で文字列を扱う場合、ヌル終端文字列という'\0'を終端の目印にした単純なcharの配列として表します。この構造は非常に単純です。しかし、長さを調べるには、先頭から一つ一つ'\0'でないか調べていく必要があります。だからstrlen()はO(n)の計算量が必要になるのです。

これに対して、Pythonを含めた後々の言語で文字列を表すとき、文字列の長さの情報も一緒に持つようにしました。ある文字列を生成したり、長さが変わるような処理を行った場合は、長さも同時に計算して文字列の実体と一緒に入れておくようにしたと言うことです。なので、長さを求める関数の演算では、その情報を取り出すだけで済むため、len()等はO(1)で済むことになります。

Cで表現すれば、

C

1struct string { 2 size_t len; 3 char str[0]; 4};

のような構造体で構成されているという感じです(これは一例で、実際はもっと複雑だったり、言語によって異なります)。文字列の操作の時に毎回lenも一緒に計算しておけば、すぐに長さを求める事ができます。逆に言うと、その処理分、単純なヌル終端文字列よりも遅くなってしまう場合があるという欠点もあり、必ずしも有利ではありません。それに、C言語であっても長さを別途自分で計算して別途変数に入れておけば、strlen()を使わなくてもその場でO(1)で取り出すことができるでしょう。しかし、それはO(n)の処理を前倒しにしているに過ぎません。他の言語は常に前倒しにした方が有利と判断して、文字列に長さの情報も一緒に入れているというわけです。

なお、C言語以外がヌル終端文字列を使わない理由の一つに、'\0'を扱えないからと言うのがあります。通常のテキストデータで'\0'が現れる事はありませんが、'\0'が現れるバイナリデータや特殊なテキストデータ(通信のプロトコルによっては、区切りに'\0'使う物がある等)を扱おうとすると、ヌル終端文字列では処理がそこで停止してしまいます。'\0'を終端の目印にせず、別途長さを記憶していれば、'\0'が現れても処理を継続することができます。

他情報は最初の方にあるリンク先のWikipeidaも参考にしてみてください。

投稿2016/11/15 21:53

raccy

総合スコア21759

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

arare000

2016/11/16 11:10

ありがとうございます。驚くほど詳細な内容で、大変勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問