我有一个字符串数组,我想从中找到前 10 个最常出现的字符串。
这样做的一种原始方法当然是遍历数组一次,获取所有不同字符串的堆栈/队列,将这些不同的字符串存储在一个数组中,然后检查这个新数组中每个字符串在原始数组,最后将值存储在“n”个不同的整数中,其中 n 是不同字符串的数量。
显然,就时间效率而言,这是一种可怕的方法,所以我想知道是否有更好的方法来做到这一点。
我有一个字符串数组,我想从中找到前 10 个最常出现的字符串。
这样做的一种原始方法当然是遍历数组一次,获取所有不同字符串的堆栈/队列,将这些不同的字符串存储在一个数组中,然后检查这个新数组中每个字符串在原始数组,最后将值存储在“n”个不同的整数中,其中 n 是不同字符串的数量。
显然,就时间效率而言,这是一种可怕的方法,所以我想知道是否有更好的方法来做到这一点。
如果您不关心内存,则可以构建一个包含每个字符串的计数的哈希映射:您循环遍历所有字符串并为您执行的每个字符串
myhash[mystring] += 1
如果字符串已经存在于哈希中,或者
myhash[mystring] = 1
除此以外。
如果您认为在哈希映射中查找值是在恒定时间内进行的(这不可能是真的),那么这个算法是“唯一的” O(n)
(但它会占用大量内存)。
如果您关心内存,您可以对数组进行排序,然后轻松计算每个字符串出现的次数(每个字符串将首先出现在位置 i、i+1、i+2、...、i+k 和其他位置) .
排序将花费 O(n log n),而不是 O(n) 来计算字符串的出现次数。
您可以使用Guava Multiset添加所有字符串,然后Multisets.copyHighestCountFirst()
仅查看前 10 个字符串
请参阅此问题以获取示例