假设我的文件系统中有非常多的目录(比如100.000
),并且每个目录中都有相似数量的目录。每个目录可以包含任意数量的文件,但通常不会超过几个。这种结构变为恒定深度(10
)。
我的问题是,如果我从这个目录结构中读取文件,例如:/dir-34/dir-215/dir-345/file1
使用Paths.get()
与读取文件形式相比,那么时间复杂度(在阅读操作中)是否存在差异像这样的简单文件系统:
/dir1
/dir2
/dir3
file1
/dir4
file2
注意:这只是一个理论问题我只想知道我尝试打开文件的目录中的目录/文件数是否对读取操作的速度有任何影响的
答案 0 :(得分:2)
一些流行的文件系统使用比旧文件系统更高效的数据结构。 ext4默认情况下启用了目录哈希(如@ninjalj所指出的),XFS也是如此。这意味着单个目录中的查找平均需要O(1)
(如果您的路径具有固定的最大子目录数,则为常量时间)。这遵循performance of the hash function itself.
即使每个目录中有数以万计的文件,访问单个文件的速度也非常快 - 但前提是您拥有完整路径。如果您没有完整路径,而是必须查看模式的目录,那么您将面临目录中条目数的O(n)
。对于默认系统级目录读取调用的小读取大小(32k),这进一步加剧了这种情况。
(虽然ext4
目录可以包含大量文件,但它们仅限于64000个子目录条目。)
答案 1 :(得分:1)
如果/path/to/file
可用,(注意:性能和时间复杂度仍然主要取决于磁盘结构和底层文件系统实现。例如,btrfs,一切都是b-tree,ext4和XFS使用H树)
因此,为了遍历目录结构直到叶节点(包含该文件的目录),平均情况时间复杂度应为O(logN),而最坏情况应为O(N),N = no中的目录树。最糟糕的情况是,在N-1下创建第N个目录,在N-2中创建第N-1个目录,依此类推......直到根目录,在树中形成一个分支。理想情况下,如果您具有完整路径,则不必遍历树中的所有目录。
然后,如果底层FS支持目录索引和散列,则每次查找都需要另一个O(1)来查找目录中的文件。因此,O(logN)+ O(1),即忽略低阶项,它应该只有O(logN),其中N是水平。