C structure de données pour imiter de C#List<List<int>>?

Je suis à la recherche de refactoriser une méthode c# dans une fonction c dans une tentative de gagner un peu de vitesse, et ensuite appeler la dll c en c# pour permettre à mon programme pour utiliser la fonctionnalité.

Actuellement la méthode c# prend une liste d'entiers et qui renvoie une liste de listes de nombres entiers. La méthode calculé la puissance des entiers donc, une entrée de 3 ints d'obtenir le résultat suivant (à ce stade, les valeurs de l'ints est pas importante car elle est utilisée en interne d'une valeur de pondération)

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

Où chaque ligne représente une liste d'entiers. La sortie indique l'index (avec un décalage de 1) de la première liste, non pas la valeur. Donc 1,2 indique que l'élément à l'indice 0 et 1 sont un élément de la puissance.

Je suis pas familier avec le c, donc ce sont mes meilleures options pour les structures de données qui va permettre à la c# pour accéder aux données renvoyées?

Merci d'avance

Mise à jour

Merci à tous pour vos commentaires jusqu'à présent. Ici, c'est un peu un arrière-plan à la nature du problème.

La méthode itérative pour le calcul de la puissance d'un ensemble est assez simple. Deux boucles et un peu de manipulation de bits est tout là est à lui vraiment. Il a juste appelé..beaucoup (en fait des milliards de fois, si la taille de l'ensemble est assez grand).

Thoughs autour de l'aide de c (c++ comme les gens l'ont souligné) sont qu'il donne plus de portée pour l'optimisation des performances. Un port direct ne peuvent pas offrir toute augmentation, mais elle ouvre la voie pour plus porté sur les méthodes pour obtenir un peu plus de vitesse hors de lui. Même une petite augmentation par itération équivaudrait à une augmentation mesurable.

Mon idée était de port direct version et ensuite travailler pour l'augmenter. Et puis à refactoriser au fil du temps (avec l'aide de tout le monde ici, DONC).

Mise à jour 2

Juste un autre point de jalf.com, je n'ai pas à utiliser la liste ou equivelent. Si il ya une meilleure façon, alors je suis ouvert aux suggestions. La seule raison pour laquelle la liste a été que chaque ensemble de résultats n'est pas de la même taille.

Le code pour l'instant...

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;
}

Comme vous pouvez le voir, pas beaucoup à elle. Il va rond et rond beaucoup!

J'accepte que la création et la construction de listes peut ne pas être le moyen le plus efficace, mais j'ai besoin d'un moyen de fournir les résultats dans une manière gérable.

Mise à jour 2

Merci pour tous les commentaires et la mise en œuvre des travaux. Juste pour clarifier quelques points soulevés: je n'ai pas besoin de la sortie pour être en "ordre naturel", et aussi je ne suis pas intéressé par l'ensemble vide est retournée.

hughdbrown de la mise en œuvre est intesting mais je pense que j'ai besoin de stocker les résultats (ou au moins une partie d'entre eux) à un certain point. Cela ressemble à de la mémoire limitiations appliquera à long avant d'exécuter le temps devient un réel problème.
En partie à cause de cela, je pense que je peux m'en sortir avec l'aide octets au lieu de nombres entiers, de donner plus de potentiel de stockage.

La véritable question est donc la suivante: Avons-nous atteint la vitesse maximale pour cette calcualtion en C#? L'option de code non managé fournir plus de portée. Je sais que dans de nombreux égards, la réponse est futile, car même si nous havled le temps de courir, il ne ferait que permettre un supplément de valeurs dans le jeu original.

  • int** une liste à une liste de int.
  • non, il a juste des points à un pointeur vers un int. Le montant de la simplification conduira à de nombreuses heures de débogage de la douleur pour nos chers jxh00u
  • Cela dépend vraiment de ce que vous faites avec elle 🙂
  • L'interopérabilité va tuer tous les gains de performance. Afficher votre C# et demander un meilleur algorithme, ou peu sûres de manipulation du pointeur conseils.
  • Wouldnt l'interopérabilité ralentir seulement se produire que lorsque l'appel a été fait?
  • Il sera toujours plus facile, plus sûre et plus facile à maintenir si vous optimisé le C#.
  • Re: à l'aide d'octets au lieu de nombres entiers, de donner plus de potentiel de stockage des Entiers de quatre fois la taille d'octets. Cela signifie que vous pourriez gérer un powerset avec plus de deux éléments. Est-ce vraiment utile? À l'aide de taux de retour pour ne conserver qu'un seul set en mémoire donne un véritable coup de fouet.
  • Re: je pense que j'ai besoin de stocker les résultats (ou au moins une partie d'entre eux), Vous allez déterminer au moment de l'exécution que certains sous-ensemble est intéressant/utile? Pouvez-vous nous dire quel type d'application que vous construisez? Et combien d'éléments dont vous avez besoin pour powerset à la fois?
  • Je suppose que je suis en train d'essayer de trouver la limite théorique de choses que je pourrais powerset. L'application powerset certains objecs qui peuvent être regroupés pour fournir une sauvegarde (c'est à dire faire deux choses en même temps est mieux que de faire les deux choses independtntly). Je sais que c'est une implémentation naïve...
  • suite...et devinez ce qu'une certaine dynamique ou heuristical méthode pourrait se rapprocher pour moins d'effort. Les valeurs dans l'entrée sera un "coût". En additionnant les valeurs de chaque powerset de retour (ou de conserver un total en cours d'exécution dans la boucle) permettra de déterminer si l'ensemble est "valable". Je suis d'accord que le rendement de retour est utile.

InformationsquelleAutor jheppinstall | 2008-12-05