/ / Anzahl zu zählen Subsets Frequenz - c #, Algorithmus, Sortieren

Anzahl, um die Häufigkeit der Teilmengen zu ermitteln - c #, Algorithmus, Sortierung

Ich versuche, die Kombination von Zahlen zu finden, die häufig in N Anzahl von Sätzen auftreten (gleiche Größe, keine Duplikate innerhalb eines Satzes).

Für Beispiel:

{3, 5, 2, 4, 6, 11}
{3, 7, 2, 11, 5, 14}
{8, 2, 1, 11, 14, 6}
{9, 1, 12, 8, 17, 4}
{4, 10, 16, 5, 14, 3}

Ich habe einen Zahlenzählungsalgorithmus verwendet, um das Auftreten einzelner Zahlen über die Mengen zu finden.

public static int[] Counting (int []A, int m )
{
int n = A.Length;
int[] count = new int[m+1];
Array.Clear(count, 0, m+1);
for (int k = 0; k < n; k++)
count[A[k]] += 1;
return count;
}

Gibt es einen Algorithmus, um das Gleiche mit a zu tun?Teilmenge. Im obigen Beispiel {2, 11} treten {3,2, 11}, {11, 14} häufiger zusammen auf. Die Ausgabe sollte den Zählwert einer Teilmenge haben, d. H. Für das obige Beispiel {2, 11} Frequenz ist 3.

Antworten:

2 für die Antwort № 1

Funktioniert das für Sie?

Func<IEnumerable<int>, IEnumerable<IEnumerable<int>>> getAllSubsets = null;
getAllSubsets = xs =>
(xs == null || !xs.Any())
? Enumerable.Empty<IEnumerable<int>>()
:  xs.Skip(1).Any()
? getAllSubsets(xs.Skip(1))
.SelectMany(ys => new [] { ys, xs.Take(1).Concat(ys) })
: new [] { Enumerable.Empty<int>(), xs.Take(1) };

var source = new int[][]
{
new [] {3, 5, 2, 4, 6, 11},
new [] {3, 7, 2, 11, 5, 14},
new [] {8, 2, 1, 11, 14, 6},
new [] {9, 1, 12, 8, 17, 4},
new [] {4, 10, 16, 5, 14, 3},
};

var subsets = source.Select(x => getAllSubsets(x).Select(y => new { key = String.Join(",", y), values = y.ToArray() }).ToArray()).ToArray();

var keys = subsets.SelectMany(x => x.Select(y => y.key)).Distinct().ToArray();

var query =
from key in keys
let count = subsets.Where(x => x.Select(y => y.key).Contains(key)).Count()
where count > 1
orderby count descending
select new { key, count, };

Ich bekomme dieses Ergebnis:

Ergebnis

Das erste Ergebnis von 5 ist für den leeren Satz, den jeder Satz enthält.