O(n)と記述された文字列をコピーする操作を見てきました。ここでnは文字列の長さです。文字列の各文字を繰り返し処理して個別にコピーする必要があるためです。しかし、コンパイラが一定時間にメモリブロック全体をコピーできる命令を生成することはできないのでしょうか?このような機能は、今日の一般的なアーキテクチャにも存在しますか?一定の時間内に文字列をコピーしますか?
答えて
私の知る限りではありません。
ただし、O()表記が意味を持つためには、まず各基本操作のコストを定義する必要があります。これはしばしば省略されます。「明らかです」。そして、それは本当に大部分です。あなたの(架空の)シナリオは、コストの定義が不可欠な状況の良い例です。
もう1つ、もう少し有用な例は、ディスクまたはテープストレージの検索/ソートアルゴリズムの分析です。
任意の大きさのデータブロックをコピーする命令を使用すると、その単一命令はO(n)時間かかるようにバインドされます。
ハードウェアでの実装方法によって異なります。たとえば、64ビットコンピュータには、特別なSIMD命令を使用してレジスタをレジスタにコピーするだけの場合は、8バイトの文字列を一度にコピーするのに十分なハードウェアがあります。特にグラフィックスプロセッサでは、はるかに大きなブロックをコピーできるのではなく、命令やメモリアーキテクチャを想像するほどではありません。我々は、18ヶ月ごとにチップに収まる余分なトランジスタすべてで何かをしなければならない。技術的には依然としてO(n)であるが、実際にはO(1)である。 –
@Karl Big-Oは、「小さな値」に制限すると意味がありません。 –
一部のCPUアーキテクチャでは、1つの場所から別の場所にメモリブロックをコピーする命令が1つしかありませんでしたが、その1つの命令には多くのサイクルがかかったため、依然としてO(n)でした。何があっても、CPUはアドレスバスを介して各文字を読み取らなければならないので、O(n)を回避する方法はありません。
O(n)が線形なので、あなたは一定の時間を意味すると思います。
メモリの仕組みのため、できません。あなたが何かをコピーするときには、何かがメモリのすべてのセルにアクセスし、それを別のセルにコピーする必要があります。いくつかの細胞が並行して何かを作ることは可能ですが、可変数の細胞を作ることはできません。結局、すべてのビットは電線を使用してコピーしなければならず、メモリがシステムに接続するワイヤの数よりも多いと仮定する必要があります。 DMIのような独立した要素があり、プロセッサ時間を解放し、他のものを並行して計算させるので、必ずしも計算時間を消費する必要はありません。
P.S.あなたの質問は、理論的なコンピュータサイエンスと実際の技術と実装を混在させているので、質問の精神で答えにくいですが、私はあなたが提起したポイントに対処しようとしました。
.NET文字列では、不変参照オブジェクトです。参照のみをコピーする必要があるため、一定時間内に "コピー"されます。
- 1. 時間文字列の合計時間の文字列
- 2. streambufの内容を文字列にコピー
- 3. 配列内の文字列を文字列変数にコピーする際に問題が発生しました
- 4. 文字配列内の特殊文字を特定します
- 5. regex/php:文字列から時間を解析しますか?
- 6. デジタル時間に文字列の書式を設定する
- 7. Rails文字列内の文字列内の補間
- 8. PHPの2つの文字列の間に一定量の文字を取得します
- 9. pandas.to_datetime一貫性のない時間文字列の書式
- 10. mktime(php)からiphone時間(文字列)
- 11. 文字列内の特定の文字を数えます
- 12. 文字をCの文字列から別の文字列にコピー
- 13. 文字列から単一文字を削除しますか?
- 14. 文字列を別の文字列にコピーする
- 15. 文字列内の文字間のヌル文字
- 16. cassandraコピーは、再インポート時に空文字列をヌルにします。
- 17. SQLは一定時間内にわずか数時間しか値を取得しませんか?
- 18. 構文解析時間文字列(MM:SS.msec)
- 19. 文字列を配列にコピーする
- 20. Postgresから列を選択します。列は配列内の任意の文字列に一致します
- 21. 文字列内の文字のインデックスを検索しますか?
- 22. 文字列内の実際の%での文字列補間
- 23. 文字列内の一連の文字を削除する
- 24. C++の文字列内の文字列を検索します
- 25. PHP - 2文字の間の文字列の一部を選択
- 26. VBS内の一致する文字列
- 27. 文字列内の特殊文字(/ * - + _ @&$#%)を確認しますか?
- 28. Ruby(Rails)は時間の文字列を秒に変換しますか?
- 29. 文字列へのポインタから文字列をコピー
- 30. JavaScript内の文字列内の小文字と大文字の間のスペース
最後の2番目の文章では、「線形」ではなく「定数」を意味しました。 – sepp2k
はい、私はそこに "不変"を意味しました。一定。 – newdayrising