Questo può essere fatto in O (nlogk) usando una struttura di ricerca bilanciata, in cui per ogni nodo si memorizza anche MIN (nodo) - il valore minimo nella sua sottostruttura, MAX (nodo) - il valore massimo nella sua sottostruttura e DIST (nodo): la differenza assoluta minima di qualsiasi coppia di valori nella relativa sottostruttura. Questi valori possono essere calcolati in modo ricorsivo utilizzando le seguenti equazioni:
MAX(node) = max{node->value, MAX(node->left), MAX(node->right)}
MIN(node) = min{node->value, MIN(node->left), MIN(node->right)}
DIST(node) = min{DIST(node->left), DIST(node->right),
|MAX(node->left) - (node->value)|,
|MIN(node->right) - (node->value)|}
Puoi aggiornare questi valori in O (log k) quando aggiorni l'albero, poiché devi solo aggiornarli sul percorso di ricerca.
Quindi puoi far scorrere una finestra di dimensione k sull'array e controllare se contiene la coppia richiesta usando l'albero come segue:
- Inserisci i primi k elementi (0..k-1) dell'array nell'albero descritto sopra e imposta i = k.
- Se DIST (nodo radice) < = X, restituisce True.
- Se i > = n, restituisci False.
- Rimuovere l'elemento (ik) -th dell'array dall'albero, aggiungere l'elemento i-es dell'array all'albero (durante l'aggiornamento di MIN, MAX e DIST dei nodi sui percorsi di inserimento / rimozione).
- Aumenta di una unità e vai a 2.
Il passo 1 (costruire l'albero) richiede O (nlogk) e il passo 4 (l'aggiornamento dell'albero) richiede O (log k) e viene ripetuto O (n) volte.