文件修改的时间复杂度?

时间:2016-09-08 14:31:44

标签: file data-structures time-complexity

这些文件修改的时间复杂度(相对于文件大小)是多少?

  • 覆写
  • 追加(在最后插入)
  • 预先(在开头插入)
  • 插入中间。

我希望覆盖和追加都很快。如果文件的结构类似于C ++的deque,我可以看到前置速度足够快,但我从未见过允许低级前置的语言。我怀疑插入中间的速度很快,尽管我认为有数据结构可以使它快速。

1 个答案:

答案 0 :(得分:2)

在大多数文件系统中:

  • 覆盖文件是O(n),其中n是要写入的字节数。
  • 附加文件是O(n),其中n是要写入的字节数。
  • 前置是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>

文件系统负责根据需要拆分和合并块。这些文件系统并不罕见,但普通程序通常不使用该功能。

相关问题