【问题标题】:most efficient Java data structure for searching triples of strings用于搜索字符串三元组的最有效的 Java 数据结构
【发布时间】:2011-10-31 13:04:41
【问题描述】:

假设我有一个字符串三元组的大列表(大约 10,000 个条目):

car    noun    yes
dog    noun    no
effect noun    yes
effect verb    no

假设我看到一个字符串 double - 例如,(effect, verb) - 我需要快速查看列表以查看该对是否出现,如果出现,它的值是 yes 还是 no。 (对于这个例子,双精度确实出现了,值为“否”。)

Java 中存储列表的最佳数据结构和执行搜索的最有效方式是什么?我正在运行数十万次此类搜索,因此速度至关重要。

谢谢!

【问题讨论】:

    标签: java search


    【解决方案1】:

    您可以考虑使用HashMap<YourDouble, String>。搜索将是 O(1)。

    您可以创建一个对象 YourDouble 来保存前两个值,或者将一个附加到另一个(如果值仍然是唯一的)并使用HashMap<String, String>

    【讨论】:

    • 您好,您的意思是我应该连接前两个字符串来生成密钥吗?
    • 我说这可能是你的一个选择。如果您可以保证生成的密钥仍然是唯一的。这实际上取决于您的数据。使用 String 只是允许您避免创建 YourDouble 对象。
    • 所有答案都有帮助并建议使用 HashMap。我将使用 HashMap.
    【解决方案2】:

    我会为您想要的每种搜索类型创建一个HashMultimap,例如“所有三个”、“每对”和“每个字段”。构建列表时,填充所有不同的地图,然后您可以从适合您查询的地图中获取。

    (缺点是您至少需要为每个 arity 指定一个类型,例如,仅将 String 用于“单字段”映射,但 Pair 用于双字段映射,Triple 用于三场地图。)

    【讨论】:

    • 我只需要在第一对上进行搜索,所以我想带有 Pair 的 HashMap 是最简单的解决方案。
    【解决方案3】:

    您可以使用HashMap,其中键是前两个字符串的串联,您将用于查找,值是布尔值,表示yesno 字符串。

    另外,第二列中的单词似乎会更少,因为它们代表类别。你可以有一个HashMap<String, HashMap<String, Boolean>>,你首先在其中索引,例如“名词”,“动词”等,然后您按例如索引“汽车”、“狗”、“效果”,得到你的布尔值。这可能会更节省空间。

    【讨论】:

    • 为什么不简单地使用 HashMap,其键包含前两个字符串并重新定义 equals 和 hashCode(即一个 Pair)?这比连接和地图的地图要好得多。
    • 串联可能是个坏主意,你是对的。但是地图的地图可能有它的好处如果,正如我所说,他在第二列中没有很多不同的字符串。
    • 是的,第二列只有 5 种可能性
    • 在这种情况下,如果适用的话,我几乎很想建议第二列使用枚举而不是字符串。显然,您甚至可以使用一个名为 EnumMap 的类,我假设它会使用一个简单的数组而不是哈希表。
    【解决方案4】:

    10k 对我来说似乎并不大。你试过数据库吗?

    寻找此类信息的地方是Semantic Web。许多项目都在这种类型的Triple Stores 上工作。在 Triple Store 实现页面的底部有一个列表。

    就 java 而言,您的算法几乎肯定会依赖于语言,如果您发现用 C 实现的好的算法,它的 java 端口也会很快。

    另外,您的数据集是什么样的?是否有很多 2 匹配使得主语和动词经常相同?您希望获得多少场比赛? MapReduce 可以很好地在 10k 中查找一个匹配项,但在返回 8k of 10k 的查询中无法很好地进行分区。

    也有专门针对这个问题的查询语言:SPARQLbigdata blog 有一些很好的见解,尽管 10k 似乎也没那么大。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 2012-11-23
      • 2012-12-18
      • 2018-03-20
      • 2012-02-18
      相关资源
      最近更新 更多