我一直在研究一种实际情况,我需要一种算法,从而产生了一般性问题。考虑到有两个阵列: -
来源[10] = {'a','v','l','r','p','s','x','d','q','o',' g','m'}
目标[N] = {'a','v','l','r','p','s','x','d','q','o',' g','m','','v','l','r','p','','v','l','r','p',a',
'v','l','r','p','','v','l','r','p','','v','l',' r','p','','v','l','r','p','','v','l','r','p',a','v ',
'l','r','p','','v','l','r','p',....}
我们需要一个有效的算法来查找来自Target中的Source的出现频率。
我想过散列完整的Target列表,然后遍历Source并在散列列表中进行查找。人们可以评论/验证方法。
答案 0 :(得分:2)
如果您的字符集合理受限,则可以使用字符代码作为计数数组的索引。假设你有16位字符。你可以这样做:
int[] counts = new int[65536];
foreach (char c in Target)
counts[c]++;
使用counts
数组,您可以通过查找Source
数组中counts
的代码轻松找到频率。
这个解决方案渐渐地尽可能快地获得,但它可能不是最节省内存的解决方案。
答案 1 :(得分:0)
我不知道什么是散列表,所以我不能对此发表评论。为了提高效率,我建议将目标数组转换为多重集。 Guava有一个很好的实现(尽管Java Collections Framework没有)。 Apache Commons也是如此(它被称为Bag
)。然后,您可以简单地遍历源并查找多集中每个元素的频率。正如this thread中所述,使用多集合比从元素到频率使用HashMap
更容易,但它确实需要使用第三方库。