【问题标题】:Determining string uniqueness in a large file确定大文件中的字符串唯一性
【发布时间】:2010-08-13 21:19:20
【问题描述】:

在 C 中,我想处理一个包含 108 个 16 位字母数字字符串的文件,并确定每个字符串在文件中是否唯一。我该怎么做?

【问题讨论】:

  • 到目前为止您尝试过什么?你在哪里遇到问题?我们不是代码猴子。
  • 您需要确定每一个是否唯一,还是只提取唯一的?
  • 你有多少内存?仅存储标识符就需要大约 800MB。如果你能负担得起使用大约两倍,任何合理的数据结构(哈希表、平衡树、trie)都可以。否则,你需要更聪明。
  • 我会将字符串转储到具有适当索引的 sqlite 表中,并使用组查询来查询骗子。您需要多久执行一次此操作以及必须以多快的速度执行此操作?如果你只需要偶尔做一次,那就使用现有的工具。
  • @wong 我需要在那个文件中告诉我是否有任何相同的字符串意味着我要检查每个 id

标签: c file-io


【解决方案1】:

正如其他人所说,最直接的方法是简单地加载整个文件并使用qsort之类的东西对其进行排序。

如果您不能一次将那么多数据加载到内存中,另一种选择是分几次加载数据。第一次通过时,读取文件并仅加载以A 开头的行。对它们进行排序并找到独特的线条。对于下一轮,加载所有以B 开头的行,排序并查找唯一行。对可能以行开头的每个字母数字字符重复此过程。使用这种技术,您一次只需将文件的一部分加载到内存中,并且不会导致您对任何行进行错误分类。

【讨论】:

    【解决方案2】:

    鉴于您谈论的是约 16 兆字节的数据,显而易见的方法是将数据加载到哈希表(或按该顺序排列的东西)并计算每个字符串的出现次数。

    但我无法完全想象在 C 中执行此操作 - 大多数其他语言将提供合理的数据结构(某种映射),从而大大简化工作。

    【讨论】:

    • 嗯,根据我的数学计算,它比 16 兆多一点 :)
    • 看在图灵的份上,你能数出人数吗?
    • GHashTable
    • @Nikolai (etc.) 哎呀,是的,我弄错了零的数量。我当然不能数——这就是我使用电脑的原因!尽管如此,它的数量足够小,因此将其放入内存非常简单,因此主要是解析输入文件的问题(其格式仍不清楚)。
    【解决方案3】:

    对多个文件进行桶排序(哈希函数),每个桶一个文件。然后处理每个桶的文件,以确定桶内的所有字符串是否都是唯一的。

    【讨论】:

      【解决方案4】:

      您需要对文件进行排序。

      只需将其加载到单个内存块中,在内存块上从 C 运行时库中运行 qsort,最后按顺序运行所有字符串以检查两个连续的相同字符串。

      【讨论】:

      • 我不同意。对 n 元素数组进行排序是 O(n log n),而填充哈希表或哈希集是摊销 O(n)。在这种规模的数据上,这会产生实际影响。
      • @Matthew:不过,我们这里说的大概是1.6GB,可能空间有限。只需一点额外的内存就可以对数据进行排序,而散列会占用更多的数据。如果有足够的可用内存(比如一个填充良好且内存负载不重的 64 位系统),请进行散列处理。否则,就地排序可能会比涉及磁盘缓存的解决方案更快(或者可能不会;日志 1.6G 相当大)。
      • @David,这是一个有效的观点。恒定因素(包括交换到磁盘)总是会影响运行时间。但话又说回来,log2(10^8) 是 26。无论如何,你“需要”对它进行排序肯定不是真的。散列至少需要考虑。
      【解决方案5】:

      使用带有 set/map 函数的库,例如见link text

      【讨论】:

      • @all 我不知道任何数据结构,我的意思是我知道基础知识............我想从 1000 万个字符串中搜索每一个 id,无论它是否唯一...... …………
      猜你喜欢
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 2021-08-29
      • 1970-01-01
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多