检查文件在 C 中是否唯一的好方法
Good way to check if file is unique in C
我正在编写一个 C 程序来计算给定目录中文件的总大小。我知道每个文件指向一个 inode,所以我打算使用 stat
来查找 inode 值和文件大小。由于我想避免在有多个硬链接and/or符号链接到一个inode时出现错误计算,所以我想将inode存储在一个数组中。问题是,现在要检查给定文件的 inode 是否唯一,我将不得不再次遍历 inode 数组,运行时间约为 n^2
。我想避免过于复杂的结构,例如 RB 树。有没有更快、更聪明的方法来实现它?我知道有一些系统工具可以做到这一点,我想知道他们是如何实现这样的功能的。
使用哈希 table。它是 O(1)(虽然对于小集合来说有点贵)。当然,你可能会发现这个 "overly complex" 正如你所说的红黑树一样,但是如果你想要良好的最坏情况性能,你需要做一些比普通数组更复杂的事情(顺便说一句尽管理论上的时间复杂度更差,但对于小集合来说是最快的。
如果您没有可用的散列 table 实现(毕竟这是 C 语言),这里有几个概述:
即使是二叉树也是一个不错的选择,因为在随机数据下它们是相对平衡的。这也是一个实现起来非常简单的结构。
一般来说,选择的结构是平均搜索时间不变的散列table。这里的挑战是为您的数据找到一个好的哈希函数。哈希 tables 的实现并不困难,我猜你会找到很多实现它们的好库。
但是如果你愿意等到你把所有的索引节点都存入数组,那么你可以对这个数组进行排序并遍历它以找到重复项..
编辑:
索引节点包含引用计数。这会计算硬链接的数量。因此,您可以检查引用计数 > 1 的 inode 之间的重复项。
我正在编写一个 C 程序来计算给定目录中文件的总大小。我知道每个文件指向一个 inode,所以我打算使用 stat
来查找 inode 值和文件大小。由于我想避免在有多个硬链接and/or符号链接到一个inode时出现错误计算,所以我想将inode存储在一个数组中。问题是,现在要检查给定文件的 inode 是否唯一,我将不得不再次遍历 inode 数组,运行时间约为 n^2
。我想避免过于复杂的结构,例如 RB 树。有没有更快、更聪明的方法来实现它?我知道有一些系统工具可以做到这一点,我想知道他们是如何实现这样的功能的。
使用哈希 table。它是 O(1)(虽然对于小集合来说有点贵)。当然,你可能会发现这个 "overly complex" 正如你所说的红黑树一样,但是如果你想要良好的最坏情况性能,你需要做一些比普通数组更复杂的事情(顺便说一句尽管理论上的时间复杂度更差,但对于小集合来说是最快的。
如果您没有可用的散列 table 实现(毕竟这是 C 语言),这里有几个概述:
即使是二叉树也是一个不错的选择,因为在随机数据下它们是相对平衡的。这也是一个实现起来非常简单的结构。
一般来说,选择的结构是平均搜索时间不变的散列table。这里的挑战是为您的数据找到一个好的哈希函数。哈希 tables 的实现并不困难,我猜你会找到很多实现它们的好库。
但是如果你愿意等到你把所有的索引节点都存入数组,那么你可以对这个数组进行排序并遍历它以找到重复项..
编辑:
索引节点包含引用计数。这会计算硬链接的数量。因此,您可以检查引用计数 > 1 的 inode 之间的重复项。