Table des matières
Exemple
Méthode 2
Algorithme
Sortie
Maison développement back-end C++ Utilisez la file d'attente prioritaire pour trouver les K points les plus proches de l'origine

Utilisez la file d'attente prioritaire pour trouver les K points les plus proches de l'origine

Sep 14, 2023 pm 09:01 PM
优先队列 origine Rapprochez-vous

Utilisez la file dattente prioritaire pour trouver les K points les plus proches de lorigine

Dans ce problème, nous trouverons les K points les plus proches de l'origine dans le plan 2D à partir des N points donnés.

Nous pouvons utiliser la formule de distance euclidienne standard pour calculer la distance entre l'origine et chaque point donné. Après cela, nous pouvons stocker les points avec distance dans un tableau, trier le tableau en fonction de la distance et prendre les K premiers points.

Cependant, nous pouvons également utiliser une file d'attente prioritaire pour stocker les points 2D en fonction de leur distance par rapport à l'origine. Ensuite, nous pouvons retirer K fois de la file d’attente.

Énoncé du problème− On nous donne N points sur un plan bidimensionnel. Nous devons trouver les points K les plus proches de l’origine du plan.

REMARQUE- Considérez la distance euclidienne comme la distance entre l'origine et un point donné sur le plan.

Exemple

Entrez

points = {{2, -2}, {-5, 1}, {2, 1}, {0, 3}, {6, 0}, {5, 5}, {4, 9}}, K = 4
Copier après la connexion

Sortie

{2,1} {2,-2} {0,3} {-5,1}
Copier après la connexion

Explication − Voici la distance euclidienne de chaque point à l'origine.

  • (2, −2) −> sqrt(8)

  • (−5, 1) −> sqrt(26)

  • (2, 1) -> sqrt(5)

  • (0, 3) −> sqrt(9)

  • (6, 0) -> carré(36)

  • (5, 5) -> carré(50)

  • (4, 9) -> sqrt(97)

Ainsi, les 4 points les plus proches sont {2,1} {2,−2} {0,3} {−5,1}.

Entrez

points = {{1, 2}, {2, 1}, {-2, 1}, {1, -2}} K = 2
Copier après la connexion

Sortie

{1, 2}, {2, 1}
Copier après la connexion

Explication − La distance de tous les points à l'origine est la même. Par conséquent, nous pouvons imprimer 2 points en sortie.

Entrez

points = {{1, 3}, {6, 7}, {1, 1}, {1, 0}} K = 4
Copier après la connexion

Sortie

{1, 0}, {1, 1}, {1, 3}, {6, 7}
Copier après la connexion

Explication− K est égal au point donné. Par conséquent, nous devons imprimer tous les points.

Méthode 1

Dans cette méthode, nous trierons le tableau à l'aide de la méthode sort(). De plus, nous utiliserons une fonction de comparaison pour trier les points en fonction de leur distance par rapport à l'origine. Après cela, nous imprimons les K premiers éléments du tableau trié.

Algorithme

Étape 1 − Utilisez la méthode sort() pour trier la liste et transmettez la fonction distComparator() comme troisième paramètre.

Étape 2− Définissez la fonction distComparator() pour comparer la distance d'un point donné. Cette fonction prend comme paramètres une paire de p et q.

Étape 2.1 − Obtenez la distance du point p à l'origine et stockez-la dans dist_p.

Étape 2.2 − Stockez la distance du point q à l'origine dans la variable dist_q.

Étape 2.3 − Si dist_p est inférieur à dist_q, retournez vrai. Sinon, renvoie faux.

Étape 3- Parcourez le tableau et imprimez les K premiers points du tableau.

Exemple

#include <bits/stdc++.h>
using namespace std;

bool distComparator(const pair<int, int> &p, const pair<int, int> &q) {
    int dist_p = p.first * p.first + p.second * p.second;
    int dist_q = q.first * q.first + q.second * q.second;
    return dist_p < dist_q;
}
vector<pair<int, int>> findKPoints(vector<pair<int, int>> points, int n, int k) {
    vector<pair<int, int>> res_points;
    sort(points.begin(), points.end(), distComparator);
    // Get the first K points
    for (int p = 0; p < k; p++)     {
        res_points.push_back({points[p].first, points[p].second});
    }
    return res_points;
}
int main() {
    int k = 4, n = 7;
    vector<pair<int, int>> points{{2, -2}, {-5, 1}, {2, 1}, {0, 3}, {6, 0}, {5, 5}, {4, 9}};
    vector<pair<int, int>> res = findKPoints(points, n, k);
    cout << "The " << k << " closest points from origin are - ";
    for (int p = 0; p < k; p++) {
        cout << "{" << res[p].first << "," << res[p].second << "} ";
    }
    return 0;
}
Copier après la connexion

Sortie

The 4 closest points from origin are - {2,1} {2,-2} {0,3} {-5,1}
Copier après la connexion
Copier après la connexion

Complexité temporelle - La complexité temporelle du tri d'un tableau est O(NlogN).

Complexité spatiale - O(N) pour trier un tableau.

Méthode 2

Dans cette méthode, nous utiliserons la file d'attente prioritaire pour insérer des points. De plus, nous utiliserons une fonction de comparaison et une file d'attente prioritaire pour stocker les points en fonction de leur distance la plus courte depuis l'origine.

Algorithme

Étape 1 − Définissez la liste 'res_points' pour stocker les K points les plus proches.

Étape 2- Définir la file d'attente prioritaire. Ici, « paire » signifie utiliser une file d’attente prioritaire pour stocker des paires entières. « vecteur> » signifie utiliser des vecteurs pour stocker des paires. De plus, nous avons utilisé la fonction "cmp" avec une file d'attente prioritaire.

Étape 3− Définissez la fonction cmp() pour comparer la distance euclidienne de deux points à l'origine.

Étape 3.1 - Renvoie une valeur booléenne basée sur la distance du point a à l'origine étant supérieure à la distance du point b à l'origine.

Étape 4- Insérez chaque élément du tableau dans la file d'attente prioritaire.

Étape 5− Extrayez les K premiers éléments de la file d'attente et stockez-les dans la liste res_points.

Étape 6− Renvoie la liste de points res_points.

Exemple

#include <bits/stdc++.h>
using namespace std;

vector<pair<int, int>> findKPoints(vector<pair<int, int>> points, int n, int k) {
    vector<pair<int, int>> res_points;
    // Custom comparator to compare points based on their distance from the origin
    auto cmp = [](const pair<int, int>& a, const pair<int, int>& b) {
        return (a.first * a.first + a.second * a.second) > (b.first * b.first + b.second * b.second);
    };
    // Use the custom comparator in the priority_queue
    priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)> p_que(cmp);
    for (int p = 0; p < n; p++) {
        // Inserting points in a queue
        p_que.push(points[p]);
    }
    // Get first K points
    while (k--) {
        auto temp = p_que.top();
        res_points.push_back(temp);
        p_que.pop();
    }
    return res_points;
}
int main() {
    int k = 4, n = 7;
    vector<pair<int, int>> points{{2, -2}, {-5, 1}, {2, 1}, {0, 3}, {6, 0}, {5, 5}, {4, 9}};
    vector<pair<int, int>> res = findKPoints(points, n, k);
    cout << "The " << k << " closest points from origin are - ";
    for (int p = 0; p < k; p++) {
        cout << "{" << res[p].first << "," << res[p].second << "} ";
    }
    return 0;
}
Copier après la connexion

Sortie

The 4 closest points from origin are - {2,1} {2,-2} {0,3} {-5,1}
Copier après la connexion
Copier après la connexion

Complexité temporelle - O(N*logN) Insertion de N éléments dans la file d'attente prioritaire. Ici, N est le nombre total de points.

Complexité spatiale - O(N) pour stocker les points dans la file d'attente prioritaire.

La file d'attente prioritaire utilise une structure de données de tas. Par conséquent, l’insertion et la suppression d’éléments ne prennent que du temps O(logN). Les deux méthodes nécessitent la même mémoire et le même temps. Cependant, la deuxième méthode est plus efficace car elle utilise la structure de données tas.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Explication détaillée de l'implémentation de la file d'attente prioritaire dans Redis Explication détaillée de l'implémentation de la file d'attente prioritaire dans Redis Jun 20, 2023 am 08:31 AM

Explication détaillée de l'implémentation Redis de la file d'attente prioritaire La file d'attente prioritaire est une structure de données commune qui peut trier les éléments selon certaines règles et maintenir cet ordre pendant les opérations de file d'attente, de sorte que les éléments retirés de la file d'attente suivent toujours le comportement prioritaire prédéfini. En tant que base de données en mémoire, Redis présente également des avantages dans la mise en œuvre de files d'attente prioritaires en raison de ses capacités d'accès aux données rapides et efficaces. Cet article présentera en détail la méthode et l'application de Redis pour implémenter la file d'attente prioritaire. 1. Principes de base de la mise en œuvre de Redis Principes de base de la mise en œuvre de Redis de la file d'attente prioritaire

Tas et file d'attente prioritaire en C++ Tas et file d'attente prioritaire en C++ Aug 22, 2023 pm 04:16 PM

Le tas et la file d'attente prioritaire sont des structures de données couramment utilisées en C++, et elles ont toutes deux une valeur applicative importante. Cet article présentera et analysera respectivement le tas et la file d'attente prioritaire pour aider les lecteurs à mieux les comprendre et les utiliser. 1. Heap est une structure de données arborescente spéciale qui peut être utilisée pour implémenter des files d'attente prioritaires. Dans le tas, chaque nœud satisfait aux propriétés suivantes : sa valeur n'est pas inférieure (ou pas supérieure) à la valeur de son nœud parent. Ses sous-arbres gauche et droit constituent également un tas. Nous appelons un tas qui n'est pas plus petit que son nœud parent un « tas min » et un tas qui n'est pas plus grand que son nœud parent un « tas max ».

Quels sont les scénarios d'utilisation du tas et de la file d'attente prioritaire en Python ? Quels sont les scénarios d'utilisation du tas et de la file d'attente prioritaire en Python ? Oct 28, 2023 am 08:56 AM

Quels sont les scénarios d'utilisation du tas et de la file d'attente prioritaire en Python ? Le tas est une structure arborescente binaire spéciale qui est souvent utilisée pour maintenir efficacement une collection dynamique. Le module heapq en Python fournit une implémentation de tas et peut facilement effectuer des opérations sur le tas. Une file d'attente prioritaire est également une structure de données spéciale Contrairement à une file d'attente ordinaire, chaque élément de celle-ci est associé à une priorité. L'élément ayant la priorité la plus élevée est supprimé en premier. Le module heapq en Python peut également implémenter la fonction de file d'attente prioritaire. Ci-dessous, nous présentons quelques-uns

Utilisation de la technologie de mise en cache Memcache en PHP pour améliorer l'efficacité des files d'attente prioritaires Utilisation de la technologie de mise en cache Memcache en PHP pour améliorer l'efficacité des files d'attente prioritaires May 17, 2023 pm 03:31 PM

Avec le développement continu de la société, les exigences des gens en matière de technologie informatique sont de plus en plus élevées. Dans les ordinateurs, les files d’attente constituent une structure de données très importante qui peut nous aider à résoudre efficacement de nombreux problèmes. Cependant, dans les processus d'application réels, l'efficacité de la file d'attente est souvent limitée par certains facteurs, tels que le retard du réseau, la vitesse des requêtes de la base de données, etc. Nous allons donc présenter aujourd'hui un moyen de résoudre ce problème : utiliser la technologie de mise en cache Memcache en PHP pour améliorer l'efficacité de la file d'attente prioritaire. 1. Qu'est-ce qu'une file d'attente prioritaire ?

Utilisez la file d'attente prioritaire pour trouver les K points les plus proches de l'origine Utilisez la file d'attente prioritaire pour trouver les K points les plus proches de l'origine Sep 14, 2023 pm 09:01 PM

Dans ce problème, nous trouverons les K points dans le plan 2D les plus proches de l’origine à partir des N points donnés. Nous pouvons utiliser la formule de distance euclidienne standard pour calculer la distance entre l’origine et chaque point donné. Après cela, nous pouvons stocker les points avec distance dans un tableau, trier le tableau en fonction de la distance et prendre les K premiers points. Cependant, nous pouvons également utiliser une file d'attente prioritaire pour stocker des points 2D en fonction de leur distance par rapport à l'origine. Ensuite, nous pouvons retirer K fois de la file d’attente. Énoncé du problème - On nous donne N points sur un plan bidimensionnel. Nous devons trouver les points K les plus proches de l’origine du plan. Remarque - Considérez la distance euclidienne comme la distance entre l'origine et un point donné sur le plan. Exemple de points d'entrée ={{2,-2},{-5,1},{2,1},{

Structure de données PHP : application de file d'attente prioritaire, contrôlant l'acquisition des éléments ordonnés Structure de données PHP : application de file d'attente prioritaire, contrôlant l'acquisition des éléments ordonnés Jun 01, 2024 pm 05:55 PM

Les files d'attente prioritaires permettent de stocker et d'accéder aux éléments par priorité, en définissant des priorités basées sur des critères comparables tels que la valeur, l'horodatage ou la logique personnalisée. Les méthodes d'implémentation en PHP incluent la classe SplPriorityQueue et le tas Min/Max. Le cas pratique montre comment utiliser la classe SplPriorityQueue pour créer une file d'attente prioritaire et obtenir des éléments par priorité.

Comment le tas et la file d'attente prioritaire sont-ils implémentés en Python ? Comment le tas et la file d'attente prioritaire sont-ils implémentés en Python ? Oct 18, 2023 am 10:22 AM

Comment le tas et la file d'attente prioritaire sont-ils implémentés en Python ? Les tas et les files d'attente prioritaires sont des structures de données couramment utilisées en informatique. En Python, nous pouvons utiliser le module heapq pour implémenter des tas et des files d'attente prioritaires. Un tas est un type particulier d'arbre binaire complet. Dans le tas, la valeur de chaque nœud parent est inférieure (ou supérieure) à la valeur de son nœud enfant. Un tel tas est appelé petit tas racine (ou grand tas racine). . En Python, un tas peut être représenté par une liste. Le module heapq de Python fournit quelques méthodes pour manipuler le tas. d'abord

Vérifie s'il est possible d'atteindre n'importe quel point de la circonférence d'un cercle donné depuis l'origine Vérifie s'il est possible d'atteindre n'importe quel point de la circonférence d'un cercle donné depuis l'origine Aug 29, 2023 pm 09:13 PM

La circonférence d'un cercle peut être définie comme la limite extérieure du cercle. C'est la circonférence du cercle. Chaque point autour d'un cercle suit certaines propriétés comme suit - Le point (x, y) se trouve à l'intérieur du cercle tel que $\mathrm{x^2+y^2R^2}$ où R=rayon du cercle. Énoncé du problème Étant donné une chaîne S représentant une séquence de mouvements (L, R, U, D) et un entier R représentant le rayon d'un cercle. Vérifiez si un point sur la circonférence d'un cercle de rayon R avec l'origine peut être atteint en sélectionnant n'importe quelle sous-séquence de mouvements à partir de S. Le fonctionnement de chaque mouvement est le suivant, L = Diminuer la coordonnée x R = Incrémenter la coordonnée x U = Incrémenter la coordonnée y D = Diminuer la coordonnée y Exemple 1 Entrée S = "RURDLR" R = 2 Sortie Oui Description Sélectionner la sous-séquence "RR "-initiale ,(

See all articles