从无限大的List / Array中的短List / Array中查找char的出现次数

时间:2013-01-25 16:08:53

标签: algorithm data-structures

我一直在研究一种实际情况,我需要一种算法,从而产生了一般性问题。考虑到有两个阵列: -

来源[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并在散列列表中进行查找。人们可以评论/验证方法。

2 个答案:

答案 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更容易,但它确实需要使用第三方库。