【问题标题】:Memory conscious string filtering记忆感知字符串过滤
【发布时间】:2011-06-13 06:37:59
【问题描述】:

假设我有 500 个单词:

Martin
Hopa
Dunam
Golap
Hugnog
Foo
... + 494 more words

我有以下总共大约 85KB 的文本:

Marting 去给他买了自己的东西 来自 Hopa 商店,现在他正在寻找 尽其所能地入库 朋友杜南。他们正在计划 使用他们发现的 GolapFoo 镇的 Hugnog 商店。 >... text continues into several pages

我想生成以下文本:

-------去拿他自己的东西 来自 ---- 商店,现在他正在寻找 尽其所能地入库 朋友----。他们正在计划 使用他们发现的 ------------ 镇购物。 >... text continues into several pages

目前我正在使用commons方法:

String[] 500words = //all 500 words
String[] maskFor500words = // generated mask for each word
String filteredText = StringUtils.replaceEach(textToBeFiltered, 500words , maskFor500words);
  1. 在内存和 CPU 使用率方面,是否有另一种更有效的方法?
  2. 500 字的最佳存储是什么?文件、列表、枚举、数组...?
  3. 您将如何获得统计信息,例如替换了多少单词以及替换了哪些单词;以及每个单词被替换了多少次。

【问题讨论】:

  • 您可以使用内存分析器来查看您正在使用多少内存。您可能期望 500 个字使用 64 KB 的内存。除非您使用手机运行此程序,否则您无需担心。
  • 如果您希望您的代码是可配置的,也就是说,如果 500 个单词可能会更改,请为它们使用一个文件,但将它们读入其他结构。我会将单词读入一个数组(或一个 ArrayList,因为您可能并不总是能够预测会有多少)。如果您担心的话,数组将为您提供最快的读取访问并占用最少的内存。

标签: java string filter replace


【解决方案1】:

我不太关心 CPU 和内存的使用情况。对于这样的问题和这样的文本量,它应该是相对较小的。 我会做的是

  • 有一个包含所有字符串作为键的 Map,在文本中找到它们的次数(最初为 0)
  • 使用 StringTokenizer 或 String.split() 方法逐字读取文本
  • 对于每个单词,查找地图是否包含它(O(1) 运算,非常快)
  • 如果包含它,则将“----”添加到 StringBuilder,并增加为映射中的单词存储的值
  • 否则添加单词本身(前面有一个空格,除非它是文本的第一个单词)

过程结束,StringBuilder 包含结果,映射包含每个单词被用作替换的次数。 确保使用原始文本的长度初始化 STringBuilder,以避免过多的重新分配。

应该简单高效。

【讨论】:

    【解决方案2】:

    我不太关心内存,但如果你这样做:trie 是你的朋友。它对于大型集合具有内存效率,并且允许非常有效的匹配。您可能希望在 compressed fashion 中实现它。

    【讨论】:

      【解决方案3】:

      如果我正确理解了问题,您需要阅读 85KB 的文本并解析出每个单词(使用 split 或 StringTokenizer)。对于每个单词,你需要知道它是否在 500words 的集合中,如果有,用对应的掩码进行切换。

      如果你知道你有大约 500 个单词,我建议将 500 个单词及其掩码存储在初始容量约为 650 的 HashMap 中(JDK 文档说散列在负载因子为 0.75 时最有效)。使用 for 循环将单词掩码对放入 HashMap 中。

      你得到的最大的收益(HashMap)是get/put操作(搜索key)是在恒定时间内完成的,这比数组中的O(n)甚至O(log(n )) 如果你对排序数组进行二分搜索。

      借助 HashMap,您可以在过滤 85KB 文本的同时构建一个 SringBuffer。 从您的方法中返回 String.toString(),您就完成了!问候, - M.S.

      PS 如果您在服务器上构建地图并在其他地方(在客户端)进行过滤并且需要传输字典,则 HashMap 不会这样做 - 它不能被序列化。在这种情况下使用哈希表。如果在同一台机器上,HashMap 的内存效率更高。后来,-M.S.

      【讨论】:

        猜你喜欢
        • 2021-06-17
        • 2010-09-23
        • 2010-10-09
        • 1970-01-01
        • 1970-01-01
        • 2023-01-10
        • 2010-10-28
        • 2023-03-07
        • 1970-01-01
        相关资源
        最近更新 更多