【问题标题】:Good way to check if file is unique in C检查文件在C中是否唯一的好方法
【发布时间】:2015-04-25 12:41:10
【问题描述】:

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

【问题讨论】:

    标签: c inode


    【解决方案1】:

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

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

    但是如果你愿意等到你把所有的inode都存入了数组,那么你可以对这个数组进行排序并遍历它以找到重复的......

    编辑:

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

    【讨论】:

    • 一般来说,目录中的文件数量(不进行递归)可能不会那么高,无法保证使用哈希表。所以二叉树实际上可能比哈希表快。
    【解决方案2】:

    使用哈希表。它是 O(1)(虽然对于小集合来说有点贵)。当然,正如您所说的关于红黑树,您可能会发现这种“过于复杂”,但是如果您想要在最坏情况下获得良好的性能,您需要做一些比普通数组更复杂的事情(顺便说一下尽管理论上的时间复杂度更差,但对于小集合来说最快)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-30
      • 2010-09-18
      相关资源
      最近更新 更多