10
votes

Sélectionner uniformément n éléments de tableau

J'ai besoin de uniformément SELECT N d'un tableau. Je suppose que la meilleure façon d'expliquer est par exemple.

dire que j'ai:

Array [0,1,2,3,4] Et j'ai besoin de sélectionner 3 numéros .. 0,2, 4.

Bien sûr, si la longueur de la matrice <= n , j'ai juste besoin de retourner tout le tableau.

Je suis à peu près sûr qu'il y a une algorithme défini pour cela, essayé de chercher, et j'ai examiné Introduction aux algorithmes mais je n'ai trouvé rien qui a répondu à mes besoins (probablement négligés)

Le problème J'ai eu, c'est que je ne peux pas comprendre un moyen d'éviminer cela jusqu'à n'importe quel tableau [p..q], en sélectionnant n des éléments uniflysement.

Remarque: je ne peux pas simplement sélectionner le même éléments de l'exemple ci-dessus ..

Quelques autres exemples;

Array [0,1,2,3,4,5,6], 3 éléments; J'ai besoin d'obtenir 0,3,6 de
Array [0,1,2,3,4,5], 3 éléments; J'ai besoin d'obtenir 0, 2 ou 3, et 5

EDIT:

Plus d'exemples:

Array [0,1,2], 2 elems: 0,2
Array [0,1,2,3,4,5,6,7], 5 elems: 0,2, 3 ou 4, 5,7

et oui, j'aimerais inclure Premiers et derniers éléments toujours.

EDIT 2:

Ce que je pensais était quelque chose comme .. premier + dernier élément, puis travaillez mon chemin en utilisant la valeur médiane. Bien que je sois coincé / confus quand j'essayais de le faire.

Je vais regarder l'algo que vous postez. Merci!

EDIT 3:

Voici une version superbe de incrédiman solution avec PHP. Fonctionne également avec des tableaux associatifs, tout en conservant les clés. xxx

Vous pouvez probablement mettre en place un Itérateur Mais je n'ai pas besoin de le prendre si loin.


3 commentaires

Quels sont les numéros selon vous? Soyez plus précis sur votre motif.


Je pense que vous avez besoin de plus d'exemples, car je ne comprends toujours pas ce que vous essayez de faire. Qu'en est-il des réparations plus longues et un nombre différent d'éléments à sélectionner?


Si je lis cela correctement, l'OP souhaite sélectionner un certain nombre d'éléments de tableau dont les indices suivent un modèle régulier. Je pense que la réponse de Rex Kerr pourrait mieux expliquer ce qui se demande ici.


5 Réponses :


1
votes

Votre taille de pas est (Arraysize-1) / (N-1).
Il suffit d'ajouter la taille de l'étape à un accumulateur de point flottant et arrondissez l'accumulateur pour obtenir l'index de la matrice. Répéter jusqu'à ce que l'accumulateur> Taille du tableau.


0 commentaires

3
votes

let n + 1 Soyez le nombre d'éléments que vous souhaitez, déjà limité à la longueur de la matrice.

alors vous voulez des éléments aux indices 0 / n , 1/1 , ..., n / n du chemin vers le fin de la matrice.

let m + 1 est la longueur de la matrice. Ensuite, vos indices sont rond (m * i / n) (avec la division effectuée avec un point flottant).


3 commentaires

Ceci est une erreur. Avec un 0 -indexé de longueur m , le dernier index doit être M-1 pas M , donc Les indices doivent être rond ((M-1) * I / N) (division en virage flottant, comme indiqué).


J'apprécierais que si vous ajoutez un pseudo-code structuré .. Je pense que vous pourriez être sur la bonne voie, mais je ne vous suivez pas à 100%.


@Clurs: whoops. Fixé à m + 1 comme la longueur de la matrice. C'est ce que j'essayais de taper (comme avec le n + 1 ).



1
votes

On dirait que vous souhaitez inclure les premier et les derniers éléments de votre liste.

Si vous souhaitez tirer des éléments X de votre liste d'éléments N, votre taille d'étape sera (N-1) / (x-1). Just arrondi, mais vous voulez que vous sortez chacun.


0 commentaires

17
votes

profiter! (Pseudo-code):

<?

    function Algorithm($N,$A){

        $step=(sizeof($A)-1)/($N-1);
        for ($i=0;$i<$N;$i++)
            echo $A[round($step*$i)]." ";
        echo "\n";
    }

    //some of your test cases:
    Algorithm(3,array(1,2,3));
    Algorithm(5,array(0,1,2,3,4,5,6,7));
    Algorithm(2,array(0,1,2));
    Algorithm(3,array(0,1,2,3,4,5,6));
?>

Outputs:
1 2 3 
0 2 4 5 7 
0 2 
0 3 6 


4 commentaires

Où est "pas" utilisé? Je ne vois que sa déclaration.


@ Nin, - TYPO. Devrait avoir plus de sens maintenant.


Damn mec, vérifié le lien CodpePad, en fonction de l'entrée => sortie, exactement ce que je cherchais. Je vais regarder dans la fonction demain et l'ajuster un peu, car maintenant, il est trop tard dans la nuit. Bravo Mate!


yo, a ajouté ma propre implémentation si vous êtes intéressé de jeter un coup d'œil;)



1
votes

basé sur la réponse de @ rex . pseudocode ! Ou certains pourraient même dire que c'est js xxx


0 commentaires