2016-09-08 13 views
0

これらのファイル変更の時間的複雑度(ファイルサイズに関して)はどのくらいですか?中央に挿入する(先頭に挿入)(末尾に挿入) ファイル修正の時間の複雑さ?

  • 付加
  • 前置
  • を上書き

    私は、上書きと追加が両方とも高速であると予想しています。ファイルがC++のdequeのように構造化されていれば、十分な速さを前もって知ることができますが、低レベルのプリフェンスを許した言語は見たことがありません。途中で挿入するのは速いのではないかと疑いますが、速くできるデータ構造があると思います。ほとんどのファイルシステムで

  • +0

    時間の複雑さ自体に「高速」または「低速」はありません。これらはハードウェア、ファイルシステム、これとそれに依存しているので、これはちょっと変わった質問です。 –

    +0

    OSが非連続ファイルをサポートしているかどうかは、少なくとも部分的に回答に依存します。 –

    +0

    @Sami技術用語としては存在しませんが(「超高速」は数値的分析では技術的用語ではありますが)、専門用語としては使用していません。仕様に依存する質問は、最も一般的な仕様がどのようにそれを処理しているかについて素晴らしい答えがあることを意味します。 – leewz

    答えて

    2

    :ファイルを上書き

    • nはバイト数が書き込まれるべきO(N)です。
    • ファイルの追加はO(n)です(nは書き込まれるバイト数)。
    • PrependingはO(n + m)です.nは書き込まれるバイト数、mは現在ファイル内のバイト数です。
    • 挿入はO(n + m)です(nは書き込まれるバイト数、mはファイル内の現在のバイト数です)。

    挿入のためのO(n + m)は最悪の場合です。ファイルに挿入するときは、現在挿入されているファイル内のすべてのバイトを挿入ポイントから下に移動して、nバイト挿入するための穴を作る必要があります。だから、あなたが持っている場合:その後、

    This is a test       system. 
    

    そして:

    This is a test system. 
    

    をそして、あなたは、あなたが最初に挿入されたテキストのための穴を行う必要があり、「テスト」の後に「緊急放送の」挿入したいです新しいテキストを挿入してください:

    This is a test of the emergency broadcast system. 
    

    このように、ファイルは概念的には配列に非常に似ています。正面または中央に何かを挿入したい場合は、穴を開けなければなりません。あなたが何かを削除したい場合は、空白のスペースを埋める必要があります。

    不連続ブロックからファイルを一緒にパッチすることができるファイルシステムがあります。

    <pointer to "This is a test" chunk> 
    <pointer to "of the emergency broadcast" chunk> 
    <pointer to "system." chunk> 
    

    ファイルシステムは、分割の世話をし、必要に応じてチャンクを合体:それはあなたが論理的に似ている何かを持っている可能性が、あります。これらのファイルシステムはまれではありませんが、その機能は通常、通常のプログラムでは使用されません。

    +0

    ほとんどのファイルシステムでファイル内容が配列のように扱われるソース/参照がありますか? – leewz

    +0

    @leewz:ファイルシステムがファイルの内容を配列のように扱っているとは言いませんでした。概念的には、配列の中で何かを行うのと同じように、プリペア、追加、上書き、および追加を考えることができます。ファイルシステムには通常、2つのアクセスモードがあります。シーケンシャルは、ファイルが概念的にはストリームであり、ランダムアクセスではアレイに似ています。これを確認するには、ファイルシステムのAPIリファレンスを参照してください。ほとんどのプログラミング言語のI/Oライブラリには、順次アクセス方式とランダムアクセス方式があります。 –