检查文件在C中是否唯一的好方法

时间:2015-02-24 00:59:31

标签: c inode

我正在编写一个C程序,用于计算给定目录中文件的总大小。我知道每个文件都指向一个inode,所以我打算使用stat来查找inode值和文件大小。因为当有多个硬链接和/或sym链接到inode时我想避免错误的计算,我想将inode存储在一个数组中。问题是,现在要检查inode对于给定文件是否是唯一的,我将不得不再次迭代inode数组,给出大约n^2的运行时间。我想避免过于复杂的结构,如RB树。有没有更快,更聪明的方法来实现这个?我知道有一些系统工具可以做到这一点,我想知道他们是如何实现这样的。

2 个答案:

答案 0 :(得分:3)

即使二叉树也是一个不错的选择,因为在随机数据下它们相对平衡。这也是一个非常简单的实现结构。

通常,选择的结构是具有恒定平均搜索时间的哈希表。这里的挑战是为您的数据找到一个好的哈希函数。哈希表的实现并不困难,我想你可以找到很多实现它们的好库。

但是如果你愿意等到你在数组中存储所有inode,那么你可以对这个数组进行排序并遍历它以便找到重复的数据。

修改

Inodes包含引用计数。这会计算硬链接的数量。因此,您可以使用引用计数>检查inode中的重复项。 1。

答案 1 :(得分:2)

使用哈希表。它是O(1)(虽然微小的套装有点贵)。当然,你可能会发现这个过于复杂的问题。正如你所说的关于红黑树,但如果你想要最好的最坏情况表现,你需要做一些比普通阵列更复杂的事情(顺便说一下,对于小型集合来说,这是最快的,尽管理论上更糟糕时间复杂度)。

如果你没有哈希表实现已经可用(毕竟这是C),这里有几个概述:https://stackoverflow.com/a/8470745/4323