J'ai actuellement la structure des données suivantes:la recherche d'une structure de données pour effectuer la mise à jour des éléments de gamme efficacement
class DataStructure {
public:
DataStructure(int n) : m_data(n, 0) {
}
void update(int i, int j, int value) {
for (int k = i; k <= j; ++k) {
m_data[k] = max(m_data[k], value);
}
}
void reset(int i) {
m_data[i] = 0;
}
int query(int i) {
return m_data[i];
}
private:
vector<int> m_data;
};
donc ce qu'il fait est assez simple:
- Dans un premier temps, il est un vecteur de n entiers initialisés à zéro. La mise à jour (i, j, valeur) met à jour les éléments dans la plage [i, j] pour qu'ils soient le maximum de la valeur donnée et de leur valeur actuelle respective. La valeur donnée est dans la plage de [0, n]. Reset (i) réinitialise la valeur à l'index i à 0.
- La requête (i) renvoie la valeur à l'index i.
J'ai besoin d'effectuer n mises à jour, n réinitialisations et n opérations de requête. Actuellement, ce code prend l'heure O (n * n), en raison de l'opération de mise à jour étant O (n) en général. Je me demande s'il y a des façons intelligentes d'améliorer ce temps O (n * log n) (ou mieux) pour n mises à jour, n réinitialisations et n opérations de requête, tout en conservant la complexité de l'espace O (n)?
Le deuxième point n'est pas clair, toutes les valeurs de [L, R] seraient-elles mises à jour au maximum dans {A [L] ... A [R]}? – marvel308
@ marvel308 lire la fonction de mise à jour dans le code ... il semble que cela devrait être fait sur la base de l'élément individuel – Suparshva
Avez-vous besoin d'un algorithme en ligne ou vous connaissez toutes les questions à l'avance? – DAle