Il più grande problema di progettazione che vedo qui è il requisito di chiusura: abbiamo bisogno di tornare tutti gli articoli breve distanza N di un dato vettore, per arbitraria N. Lo spazio dati è scarso: "miliardi" è nell'ordine di 2^33, ma abbiamo 512 bit di informazione, quindi c'è solo una voce per 2^(512-33) possibilità. Per chiavi distribuite casualmente, la distanza prevista tra due nodi qualsiasi è 256; la distanza attesa dal vicino più vicino è circa 180.
Questo mi porta ad aspettarmi che la tua ricerca dipenda da cluster di dati non casuali, e che la tua ricerca sarà facilitata dal riconoscimento di tale clustering. Questo sarà un passo di pre-elaborazione piuttosto doloroso sui dati iniziali, ma dovrebbe valere la pena.
Il mio approccio generale a questo è identificare i cluster in un modo generalmente veloce. Inizia con una funzione di hashing che restituisce una metrica di distanza molto generale. Ad esempio, per qualsiasi vettore, calcola le distanze da ognuno di un insieme di vettori di riferimento ortogonali. Per 16 bit, si può prendere il seguente set (elencato in hex): 0000, 00FF, 0F0F, 3333, 5555, una successiva "grana" di bit alternati. "Restituire questo hash come una semplice tupla le distanze a 4 bit, un totale di 20 bit (ci sono risparmi effettivi per i vettori lunghi, dato che una delle dimensioni è 2^(2^N))
Ora, questa tupla di hash ti consente di ottenere una stima approssimativa della distanza di hamming, in modo tale da possono raggruppare i vettori più facilmente: vettori che sono simili must hanno valori hash simili
da ciascun cluster, per un elemento centrale, e quindi caratterizzare ogni elemento del cluster dalla sua distanza da detto centro Per maggiore velocità.. , dai a ciascun nodo un elenco dei suoi vicini più vicini con le distanze, tutti all'interno di t lui cluster. Questo ti dà un grafico per ogni cluster.
Analogamente, connettere tutti i centri del cluster, fornendo bordi diretti ai centri del cluster più vicini. Se i tuoi dati sono ragionevolmente suscettibili alla ricerca, saremo in grado di garantire che, per ogni due nodi A, B con centri cluster Ac e Bc, avremo d (A, Ac) + d (B, Bc) < d (A, B). Ogni cluster è un quartiere topologico.
Il processo di query è ora un po 'più veloce. Per un vettore di destinazione V, trova il valore di hash. Trova centri di aggregazione abbastanza vicini da poter abbinare qualcosa nel loro vicinato ([distanza effettiva] - [intervallo di query] - [raggio di cluster]). Ciò ti consentirà di eliminare immediatamente interi cluster e potrebbe darti un intero gruppo di "colpi". Per ogni cluster marginale (alcuni, ma non tutti i nodi sono qualificati), dovrai trovare un nodo che funzioni in base a qualcosa di simile alla forza bruta (iniziare nel mezzo dell'intervallo di distanze percorribili dal centro del cluster), e poi fare una ricerca in ampiezza dei vicini di ogni nodo.
Mi aspetto che questo ti dia qualcosa di paragonabile a una prestazione ottimale. Inoltre, si adatta in modo decente alle aggiunte e alle eliminazioni, a condizione che non siano abbastanza frequenti da modificare l'appartenenza al cluster per altri nodi.
L'insieme di vettori è semplice. Scrivi i modelli di bit per il caso a 16 bit:
0000 0000 0000 0000 16 0s
0000 0000 1111 1111 8 0s, 8 1s
0000 1111 0000 1111 4 0s, 4 1s, repeat
0011 0011 0011 0011 2 0s, 2 1s, repeat
0101 0101 0101 0101 1 0s, 1 1s, repeat
Si prega di chiarire le esigenze. Questo set di risultati deve contenere * tutti * i nodi entro una determinata distanza? Ci sono limiti superiori e inferiori alla distanza? Riesci a sostenere un ampio overhead per indicizzare e organizzare i dati? Ci saranno inserimenti o cancellazioni? – Prune
Hello Prune, yes il set di risultati dovrebbe contenere tutti i nodi che si trovano sotto un limite superiore di distanza. Un limite inferiore non esiste. L'inserimento e le eliminazioni sarebbero piacevoli, ma posso anche ricostruire il grafico. –
Qual è il rapporto tra query e modifiche? La progettazione del database potrebbe dipendere dalla frequenza relativa delle modifiche (aggiunte e cancellazioni). – Prune