C-Datenstruktur zur Nachahmung der C # -Liste <Liste <int >>?

Ich versuche, eine c # -Methode in eine c-Funktion umzuwandeln, um eine gewisse Geschwindigkeit zu erreichen, und rufe dann die c dll in c # auf, damit mein Programm die Funktionalität nutzen kann.

Zurzeit nimmt die c # -Methode eine Liste von ganzen Zahlen und gibt eine Liste von Listen von ganzen Zahlen zurück. Die Methode berechnete die Potenzmenge der ganzen Zahlen, sodass eine Eingabe von 3 Zoll die folgende Ausgabe ergibt (in diesem Stadium sind die Werte der Zoll nicht wichtig, da sie als interner Gewichtungswert verwendet werden).

1
2
3
1,2
1,3
2,3
1,2,3

Wo jede Zeile eine Liste von ganzen Zahlen darstellt. Die Ausgabe gibt den Index (mit einem Offset von 1) der ersten Liste an, nicht den Wert. 1,2 bedeutet also, dass das Element bei Index 0 und 1 ein Element der Potenzmenge ist.

Ich bin mit c nicht vertraut. Was sind meine besten Optionen für Datenstrukturen, mit denen das c # auf die zurückgegebenen Daten zugreifen kann?

Danke im Vorau

Aktualisiere

Ich danke Ihnen allen für Ihre Kommentare. Hier ist ein kleiner Hintergrund für die Art des Problems.

Die iterative Methode zur Berechnung der Potenzmenge einer Menge ist ziemlich einfach. Zwei Loops und ein bisschen Manipulation sind alles, was es wirklich zu tun gibt. Es wird einfach nur angerufen ... eine Menge (in der Tat Milliarden Mal, wenn die Größe des Sets groß genug ist).

Meine Meinung zur Verwendung von c (c ++, wie bereits erwähnt) ist, dass es mehr Spielraum für die Leistungsoptimierung bietet. Ein direkter Port bietet zwar keine Steigerung, eröffnet jedoch den Weg für aufwendigere Methoden, um etwas mehr Geschwindigkeit herauszuholen. Selbst eine geringe Zunahme pro Iteration würde einer messbaren Zunahme entspreche

Meine Idee war es, eine direkte Version zu portieren und diese dann zu erweitern. Und dann über die Zeit umgestalten (mit Hilfe von allen hier bei SO).

Update 2

Ein weiterer fairer Punkt von Jalf, ich muss keine Liste oder Äquivalent verwenden. Wenn es einen besseren Weg gibt, bin ich offen für Vorschläge. Der einzige Grund für die Liste war, dass nicht alle Ergebnismengen gleich groß sind.

Der Code bisher ...

public List<List<int>> powerset(List<int> currentGroupList)
{
    _currentGroupList = currentGroupList;
    int max;
    int count;

    //Count the objects in the group
    count = _currentGroupList.Count;
    max = (int)Math.Pow(2, count);

    //outer loop
    for (int i = 0; i < max; i++)
    {
        _currentSet = new List<int>();

        //inner loop
        for (int j = 0; j < count; j++)
        {              
            if ((i & (1 << j)) == 0)
            {
                _currentSetList.Add(_currentGroupList.ElementAt(j));                          
            }
        }
        outputList.Add(_currentSetList);
    }   
    return outputList;
}

ie Sie sehen können, nicht viel dazu. Es geht einfach um und um viel!

Ich akzeptiere, dass das Erstellen und Erstellen von Listen möglicherweise nicht die effizienteste Methode ist, aber ich benötige eine Methode, um die Ergebnisse auf eine überschaubare Weise wiederzugeben.

Update 2

ielen Dank für alle Input- und Implementierungsarbeiten. Nur um ein paar Punkte zu verdeutlichen: Ich brauche keine Ausgabe in "natürlicher Reihenfolge", und ich bin auch nicht so sehr daran interessiert, dass das leere Set zurückgegeben wird.

ie Implementierung von @hughdbrown ist interessant, aber ich denke, dass ich die Ergebnisse (oder zumindest eine Teilmenge davon) irgendwann speichern muss. Es hört sich so an, als würden Speicherbeschränkungen lange vor dem eigentlichen Problem der Laufzeit auftreten. Zum Teil aus diesem Grund denke ich, dass ich mit der Verwendung von Bytes anstelle von Ganzzahlen davonkommen kann, was mehr potenziellen Speicher ergibt.

Die Frage ist dann wirklich: Haben wir die maximale Geschwindigkeit für diese Berechnung in C # erreicht? Bietet die Option für nicht verwalteten Code mehr Spielraum? Ich weiß in vielerlei Hinsicht, dass die Antwort vergeblich ist, denn selbst wenn wir die Zeit für die Ausführung verkürzen würden, würden nur zusätzliche Werte in der ursprünglichen Menge zugelassen.

Antworten auf die Frage(20)

Ihre Antwort auf die Frage