6
votes

Tableau de filtre pour conserver des lignes avec le plus petit nombre d'éléments et les premier et dernier éléments uniques

Je souhaite supprimer des lignes de mon tableau afin que mon résultat soit un tableau contenant des lignes avec des premiers et des derniers éléments uniques. Si deux lignes (ou plus) ont la même première et dernière valeur, je souhaite conserver la ligne avec le nombre d'éléments le plus bas.

Dites que j'ai le tableau suivant: P>

[
    [1, 3],
    [1, 3, 4]
]


6 commentaires

Avez-vous un cas d'utilisation pour ce que vous essayez de faire? Il peut y avoir une meilleure façon de la mettre en œuvre ...


Je génère toutes les combinaisons de lignes de transport en commun qui relient deux emplacements choisis par l'utilisateur. Dans la matrice de combinaisons de ligne générées ( $ var dans ce cas), je voudrais supprimer ceux qui utilisent une ligne supplémentaire. Donc, si on peut atteindre le deuxième point avec les lignes (1, 3) , pourquoi (1, 2, 3) est-il également affiché? Ici, la ligne 2 est extra, on peut atteindre la destination sans elle.


Peut-être de voyager 1,2,3 prendra moins de temps (parce que vous allez en train) que 1,3 (parce que vous ne pouvez aller qu'en bus directement). Nous pourrions reconstruire le problème: avoir un graphique avec des stations comme nœuds et connexions en tant que bords. Pour chaque deux nœuds n, m vous recherchez maintenant le chemin le plus court qui commence par N et se termine par m. Il y a des tonnes de références sur ce sujet.


Eh bien, si le seul moyen d'atteindre la destination est de la ligne 3, pourquoi devriez-vous prendre la peine de prendre la ligne 2, car vous devez quand même attendre la ligne 3? Vous ne changez que des lignes et payez un billet supplémentaire pour atteindre la même destination. Ou je manque quelque chose? Cette tâche n'est qu'une petite partie de l'algorithme entier, qui découpe une route générée similaire à celle d'une autre ou présente des lignes supplémentaires. Je n'ai pas utilisé les chemins les plus courts parce que je vais "mesurer" mes chemins par des moments de voyage dépendant du moment où un utilisateur interroge mon application. Donc, un chemin plus court sur la distance qu'une autre n'est pas nécessairement meilleure.


Utilisation de Djikstra Meilleur premier chemin ou d'algorithmes * ou similaires.


Je vous ai mal compris. Les chiffres sont en réalité vos lignes (bords). Je pensais à eux comme des stations.


3 Réponses :


2
votes

Utilisez actuel et fin xxx

ops ... vous pouvez itérer (encore) à la fin de Assurez-vous que la matrice de taille déjà réduite peut être supprimée davantage


4 commentaires

Dans cet exemple, (1, 2, 3) existe toujours dans la matrice.


Le code fonctionne bien, mais uniquement si des tableaux à l'intérieur $ var sont triés par nombre d'éléments. Je crois que cela ne serait pas très efficace pour un premier tri $ var par le nombre d'éléments de tableaux, puis exécutez le code que vous avez publié. Ou suis-je trop inquiet pour l'efficacité?


Stocker $ IDX pour la plus petite taille en $ tout ou une autre matrice et ajoutez non défini pour ce $ IDX à l'intérieur de la plus intérieure.


J'ai réussi à obtenir ce travail comme prévu, merci de votre réponse! Malheureusement, il est très difficile de décider quelle réponse à marquer de mieux, en particulier dans ces circonstances. Mon choix a été fait concernant les détails de la réponse, pas du tout par la qualité de la réponse.



1
votes

En général, oui, vous êtes trop inquiet pour l'efficacité (comme vous vous êtes demandé dans un autre commentaire). Bien que PHP n'est pas la langue la plus rapide-rapide, je suggérerais de construire la solution la plus simple et ne vous inquiétez que de l'optimiser ou de le rationaliser s'il existe un problème notable avec le résultat final.

Voici ce que je ferais, Du haut de ma tête. Il est basé sur la réponse d'Ajreal, mais j'espère être plus facile à suivre et attraper des cas de bords qui répondent manqués: xxx


1 commentaires

Avec quelques modifications, j'ai eu ce travail. Merci pour votre aide et pour les détails de votre réponse!



0
votes

Voici comment puis-je regrouper par une clé temporaire (formée en créant une chaîne délimitée à partir de la première et dernière valeur d'une ligne donnée) et appuyez régulièrement des données de qualification dans une matrice de résultat. Lorsque la boucle se termine, extrait la deuxième colonne de la matrice de résultat pour produire un réseau indexé contenant uniquement la plus petite des rangées de qualification. Aucun pré-tri requis.

code: ( démo ) xxx

Code alternatif: ( démo ) xxx < p> sortie: xxx


0 commentaires