Struttura dei dati basata sul confronto per la ricerca di elementi


34

Esiste una struttura di dati che accetta una matrice non ordinata di n elementi, esegue la preelaborazione in O(n) e risponde alle query: c'è qualche elemento x nell'elenco, ogni query nel peggior tempo O(logn) ?

Penso davvero che non ci sia, quindi una prova del fatto che non ce n'è nessuno è anche benvenuta.


3
(1) Non so perché tu possa dire "Certo che considero il tempo previsto", perché non dichiari affatto "previsto" nella tua domanda. Per favore, prova a porre la tua domanda in modo più preciso prima di dire "ovviamente". (2) Per favore, definisci "non-hashable".
Tsuyoshi Ito

2
(1) vedo. Grazie per la spiegazione. Se qualcuno chiedesse "Ti interessa il tempo di esecuzione?", La risposta sarebbe effettivamente "ovviamente". :) (2) Penso che "L'unica azione consentita è confrontare due valori nell'elenco" è molto più preciso oltre a dichiarare "non hash". Puoi modificare la domanda in modo che le persone non debbano leggere i commenti per capire cosa significhi "non hash"?
Tsuyoshi Ito,

3
A proposito, se non puoi provarlo, perché sai che è impossibile? Se si tratta di un esercizio in un libro di testo o in una classe, lo stai chiedendo su un sito Web sbagliato.
Tsuyoshi Ito,

6
È questa la tua domanda: esiste una struttura di dati che accetta una matrice non ordinata di n elementi, esegue la preelaborazione in O (n) e risponde alle domande: c'è qualche elemento x nell'elenco, ogni query nel peggior tempo O (registro n)?
sdcvvc,

2
@Filip: è facile da vedere? Se è vero, sono d'accordo che risolve la domanda.
Tsuyoshi Ito,

Risposte:


30

Ecco una prova che è impossibile. Supponiamo che tu possa costruire una tale struttura di dati. Costruiscilo. Quindi scegli elementi a caso dall'elenco, aggiungi ϵ a ciascuno di essi, dove ϵ è inferiore alla differenza tra due elementi qualsiasi nell'elenco, ed esegui le query per verificare se uno qualsiasi degli elementi risultanti è nella elenco. Finora hai eseguito O ( n ) query.n/lognϵϵO(n)

Vorrei affermare che i confronti effettuati sono sufficienti per stabilire se un elemento nell'elenco originale è più piccolo o più grande di qualsiasi nuovo elemento b . Supponi di non poterlo dire. Quindi, poiché si tratta di un modello basato sul confronto, non si saprebbe se a fosse uguale a b , una contraddizione del presupposto che la struttura dei dati funzioni.abab

Ora, dato che elementi scelti sono casuali, i tuoi confronti hanno dato con alta probabilità informazioni sufficienti per dividere l'elenco originale in n / log n elenchi ciascuno di dimensioni O ( log n ) . Ordinando ciascuno di questi elenchi, si ottiene un algoritmo di ordinamento randomizzato O ( n log log n ) basato esclusivamente su confronti, una contraddizione.n/lognn/lognO(logn)O(nloglogn)


Alcuni suggerimenti per aiutare a comprendere la prova (supponendo che io la capisca correttamente da solo ovviamente): gli elementi devono essere compilati dagli elementi dopo che ϵ è stato aggiunto a loro; il modello di confronto garantisce di sapere quale dei casi vale a b e a b ; le liste n / log n sono in 'ordine crescente': ogni elemento in una lista superiore è più alto di ogni elemento in una lista inferiore; dopo le query originali hai abbastanza informazioni per fare le liste intorno agli oggetti che hai scelto casualmente,bϵababn/logn
Alex ten Brink

(continua) tieni presente che non devi nemmeno essere in grado di costruire esplicitamente l'elenco nei tempi previsti perché la prova sia valida.
Alex ten Brink,

Non ho capito bene questa prova. La contraddizione finale è "algoritmo basato esclusivamente sui confronti", ma nei primi passi del nostro algoritmo abbiamo aggiunto a ciascun elemento (inoltre, "dove ϵ è inferiore alla differenza tra due elementi nell'elenco"). Perché siamo ancora giustificati che il nostro algoritmo sia ancora basato sul confronto solo se assumiamo che i nostri articoli abbiano un ordine totale non discreto su di essi? ϵϵ
Artem Kaznatcheev

5
@Artem: Il vostro contributo originale è costituito da elementi . Quindi costruisci un nuovo set X = X × { 0 , 1 } ; rappresenti una x X originale come ( x , 0 ) X e una x + ϵ modificata come ( x , 1 ) X . Ora usi l'algoritmo black box; l'algoritmo confronta gli elementi di X xXX=X×{0,1}xX(x,0)Xx+ϵ(x,1)XXl'un l'altro; per rispondere a tali domande, devi solo confrontare un numero costante di elementi di tra loro. Quindi tutto dovrebbe essere fattibile nel modello di confronto, con un sovraccarico costante. X
Jukka Suomela,

1
@Aryabhata: lo fa. Cos'è l' algoritmo ? O(log2n)
Peter Shor,

24

Credo che qui sia una prova diversa, che dimostra l'impossibilità di una struttura temporale della query , con pre-elaborazione O ( n ) .O(logkn)O(n)

Supponiamo che nella pre-elaborazione tu faccia confronti, portando a un ordine parziale.O(n)

Consideriamo ora la dimensione dell'antichain più grande in questo. Poiché questi elementi non sono comparabili, per noi avere un algoritmo di query O ( log k n ) , dobbiamo avere A = O ( log k n ) .AO(logkn)A=O(logkn)

Ora secondo il teorema di Dilworth, c'è una divisione della dimensione , in catene.A

Ora possiamo integrare l'algoritmo per determinare le catene nella partizione. Possiamo determinare se due elementi sono comparabili creando un grafico diretto di confronti e facendo un'analisi di raggiungibilità. Questo può essere fatto senza ulteriori confronti. Ora basta forzare ogni possibile partizione della dimensione per determinare se si tratta di una partizione di catene.A

Una volta che abbiamo le catene, possiamo unirle per dare un algoritmo di confronto per ordinare l'intero elenco.O(nloglogn)


1
Questa è una bella idea E se potessi mostrare che la partizione a catena deve essere nota all'algoritmo, allora potresti usare mergesort per mostrare che ci vorrebbe solo un ulteriore confronto O (n log log n) per ordinare l'intero input, piuttosto che usare Jensen. Ma c'è un problema: perché l'algoritmo di preelaborazione deve costruire una partizione a catena? Deve esistere una partizione a catena, sì, ma è molto diversa dalla sua conoscenza dell'algoritmo.
David Eppstein,

8
Ok, ora credo a questa prova. E mostra più fortemente che per ottenere il tempo di interrogazione del polilogo è necessario utilizzare una serie di confronti all'interno di un additivo dell'ordinamento. Bello. A proposito, la partizione a catena può essere trovata in tempo polinomiale dall'insieme di confronti già eseguiti, piuttosto che richiedere una ricerca della forza bruta, ma questo non fa alcuna differenza per il tuo argomento. O(nloglogn)
David Eppstein,

6
Le prove dimostrano che è necessario disporre di preelaborazione o Ω ( n ) per ogni query. Naturalmente entrambi sono stretti. Ciò dimostra che la ricerca binaria e la ricerca lineare sono gli unici algoritmi di ricerca "interessanti" (almeno nel mondo classico). Ω(nlogn)Ω(n)
Yuval Filmus,

1
@Yuval: forse dovresti scrivere questa osservazione come una risposta effettiva, perché mi sembra che devi fare una moderata quantità di lavoro per ottenere il risultato di cui sopra dalle prove nelle risposte.
Peter Shor,

1
@Yuval: pensando alle prove, vedo solo che devi avere preelaborazione o Ω ( n 1 - ϵ ) tempo di interrogazione per tutti ϵ . E 'possibile avere o ( n log n ) il tempo pre-elaborazione e O ( n / log n ) tempo di risposta. Si può dividere l'elenco in log n elenchi di dimensioni n / log n ciascuno nel tempo θ ( nΩ(nlogn)Ω(n1ϵ)ϵo(nlogn)O(n/logn)lognn/logn utilizzando ripetute rilevazioni mediane. θ(nloglogn)
Peter Shor,

0

Come osserva la risposta di Peter Shor, per escludere l'appartenenza a un modello basato sul confronto, dobbiamo sapere come l'elemento si confronta con ogni membro. Quindi, usando query casuali (il numero di membri inferiore al non membro interrogato è casuale), otteniamo Θ ( n log k ) informazioni relative ad avere n valori non ordinati. Pertanto, per alcune costanti c > 0 , usando ck<nΘ(nlogk)nc>0 preprocesssing, non possiamo avereccnlogk costo query. Questo è ottimale fino a un fattore costante poiché possiamo ordinare i dati in k = k / log k n / log n bucket approssimativamente uguali (ogni bucket non ordinato) in O ( n log k ) = O ( n log k ) tempo, che consente ilcosto della query O ( n / k ) .cnlogk/kk=k/logkn/lognO(nlogk)=O(nlogk)O(n/k)

In particolare, utilizzando la pre - elaborazione , non è possibile avere un costo di query o ( n ) . Inoltre, la preelaborazione di o ( n log n ) corrisponde a k in O ( n ε ) per ogni costo di query ε > 0 e quindi Ω ( n 1 - ε ) .O(n)o(n)o(nlogn)kO(nε)ε>0Ω(n1ε)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.