假设您有一个数字(或字母)列表,例如
1177783777297461145777267337774652113777236237118777
我想在此列表中找到最常见的数字组合:
对于 1 位数字长的组合 - 它是此列表中最常见的数字
对于 2 位数字长的组合 - 可能是“11”
对于 3 位数字长的组合 - 可能是“777”等
对于这样的任务有一些特殊的算法吗?
更新
好吧,我自己编写了以下代码(Java)。看起来执行时间与数据大小乘以模式大小成正比:
public static void main(String[] args)
{
int DATA_SIZE = 10000;
int[] data = new int[DATA_SIZE];
for (int i = 0; i < DATA_SIZE; i++)
{
data[i] = (int) (10 * Math.random()) % 10;
System.out.print(data[i]);
}
int[] pattern1 = new int[]{1, 2, 3};
int[] pattern2 = new int[]{7, 7, 7};
int[] pattern3 = new int[]{7, 7};
System.out.println();
System.out.println(match(data, pattern1));
System.out.println(match(data, pattern2));
System.out.println(match(data, pattern3));
}
static int match(int[] data, int[] pattern)
{
int matches = 0;
int i = 0;
while (i < data.length)
{
matches = isEqual(data, i, pattern) ? matches + 1 : matches;
i++;
}
return matches;
}
static boolean isEqual(int[] a, int startIndex, int[] a2)
{
if (a == a2)
{
return true;
}
if (a == null || a2 == null)
{
return false;
}
for (int i = 0; i < a2.length; i++)
{
if (a[startIndex + i] != a2[i])
{
return false;
}
}
return true;
}
这可以在二次时间内完成,尽管我对更快的方法感到好奇。这个想法是迭代可能的长度值 k=1..N,并在每次迭代中循环遍历字符串以找到长度为 k 的最频繁序列。
内循环可以使用哈希表来有效地计算频率。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)