Optimized anagrams count computation

unmanaged
Inga 🏳‍🌈 8 years ago
parent 5584ea843d
commit 55d721ffae
  1. 37
      dotnet/WhiteRabbit/PrecomputedPermutationsGenerator.cs
  2. 16
      dotnet/WhiteRabbit/StringsProcessor.cs

@ -5,22 +5,13 @@
internal static class PrecomputedPermutationsGenerator
{
private static PermutationsGenerator.Permutation[][] Permutations { get; } = new[]
{
GeneratePermutations(0),
GeneratePermutations(1),
GeneratePermutations(2),
GeneratePermutations(3),
GeneratePermutations(4),
GeneratePermutations(5),
GeneratePermutations(6),
GeneratePermutations(7),
};
public static PermutationsGenerator.Permutation[] HamiltonianPermutations(int n)
{
return Permutations[n];
}
private static PermutationsGenerator.Permutation[][] Permutations { get; } = Enumerable.Range(0, 8).Select(GeneratePermutations).ToArray();
private static long[] PermutationsNumbers { get; } = GeneratePermutationsNumbers().Take(19).ToArray();
public static PermutationsGenerator.Permutation[] HamiltonianPermutations(int n) => Permutations[n];
public static long GetPermutationsNumber(int n) => PermutationsNumbers[n];
private static PermutationsGenerator.Permutation[] GeneratePermutations(int n)
{
@ -32,5 +23,19 @@
return result.Concat(Enumerable.Repeat(result[0], Constants.PhrasesPerSet - (result.Length % Constants.PhrasesPerSet))).ToArray();
}
private static IEnumerable<long> GeneratePermutationsNumbers()
{
long result = 1;
yield return result;
var i = 1;
while (true)
{
result *= i;
yield return result;
i++;
}
}
}
}

@ -68,9 +68,8 @@
public long GetPhrasesCount()
{
return this.VectorsProcessor.GenerateSequences()
.Select(this.ConvertVectorsToWords)
.SelectMany(Flattener.Flatten)
.Sum(words => (long)PrecomputedPermutationsGenerator.HamiltonianPermutations(words.Length).Count());
.Select(this.ConvertVectorsToWordsNumber)
.Sum(tuple => tuple.Item2 * PrecomputedPermutationsGenerator.GetPermutationsNumber(tuple.Item1));
}
private byte[][][] ConvertVectorsToWords(int[] vectors)
@ -85,6 +84,17 @@
return words;
}
private Tuple<int, long> ConvertVectorsToWordsNumber(int[] vectors)
{
long result = 1;
for (var i = 0; i < vectors.Length; i++)
{
result *= this.WordsDictionary[vectors[i]].Length;
}
return Tuple.Create(vectors.Length, result);
}
private IEnumerable<PhraseSet> ConvertWordsToPhrases(byte[][] words)
{
var permutations = PrecomputedPermutationsGenerator.HamiltonianPermutations(words.Length);

Loading…
Cancel
Save