【问题标题】:What's the most efficient way to hash a collection without caring about order?在不关心顺序的情况下散列集合的最有效方法是什么?
【发布时间】:2019-03-21 18:24:31
【问题描述】:

我有很多字符串,我需要检查有多少对包含相同的字符。

目前,我的策略是创建一个 int[128] 字符,并为字符串中的每个字符增加字符数。因此,最后,chars 将是一个 128 大小的数组,每个索引都映射到一个字符编号,而值则是它的计数。

然后我会使用 Java 的 Arrays.hashCode() 函数对字符进行哈希处理。

有没有更有效的方法来解决这个问题?我尝试在第一个循环中对字符串中的每个字符进行异或运算(连同构建字符),这很有效(但在我的分配测试用例中速度非常慢;我怀疑它们旨在破坏一个简单的异或哈希函数)。有没有有效的哈希函数?

【问题讨论】:

  • 您能否提供一些示例输入,以及您希望针对该输入看到的确切输出?
  • 据我了解您的问题,您的 hash-function 必须是可交换的。您是否尝试过对每个 String 进行哈希处理并将单个哈希值相加?
  • @TimBiegeleisen 我无权访问某些测试用例,但要求规定每一行都是任意长度的 ASCII 字符(不包括换行符)。
  • @Turing85 除了我添加而不是 XOR 之外,这与我对每个字符的 XOR 不一样吗?
  • @Fabian 我不知道。我不知道你的代码。最简单的方法是进行性能分析(假设您确实存在性能问题)。

标签: java arrays string hash


【解决方案1】:

对每个字符串中的字符进行排序。也就是说,你先销毁所有的订单信息。之后,一个标准的HashMap 就足够了。

【讨论】:

  • 这适用于较短到中等长度的字符串,对于非常长的字符串,int[128] 可能是最好的。
  • 这需要多次通过排序(例如使用计数排序),再通过一次哈希,所以它会比我目前只需要一次通过的方法慢。
猜你喜欢
  • 1970-01-01
  • 2016-09-05
  • 2017-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多