我有一个字符串数组,我想从中找到前10个最常出现的字符串。
这样做的一种原始方法当然是遍历数组一次,得到所有不同字符串的堆栈/队列,将这些不同的字符串存储在一个数组中,然后检查这个新数组中每个字符串的次数发生在原始数组中,最后将值存储在'n'个不同的整数中,其中n是不同字符串的数量。
显然,在时间效率方面,这是一种可怕的方法,所以我想知道是否有更好的方法来做到这一点。
答案 0 :(得分:4)
如果您不关心内存,可以构建一个包含每个字符串计数的哈希映射:遍历所有字符串以及每个字符串
myhash[mystring] += 1
如果字符串已经存在于哈希中,或者
myhash[mystring] = 1
否则。
如果你认为在一个哈希映射中查找一个值是在恒定时间内进行的(这可能不是真的)那么这个算法只是“{”O(n)
(但它占用了大量的内存)。
答案 1 :(得分:2)
如果您关心内存,可以对数组进行排序,然后计算每个字符串容易出现的次数(每个字符串首先出现在位置i,i + 1,i + 2,...,i + k和在其他地方)。
排序将采用O(n log n),而不是O(n)来计算字符串的出现次数。
答案 2 :(得分:1)
您可以使用Guava Multiset添加所有字符串,然后仅查看前10个<{1}}
请参阅this question以获取示例