Perché posso guardare un grafico e trovare immediatamente il punto più vicino a un altro punto, ma mi ci vuole O (n) tempo attraverso la programmazione?


122

Vorrei chiarire:

Dato un diagramma a dispersione di un determinato numero di punti n, se voglio trovare mentalmente il punto più vicino a qualsiasi punto della trama, posso immediatamente ignorare la maggior parte dei punti nel grafico, restringendo le mie scelte a un piccolo numero costante di punti nelle vicinanze .

Tuttavia, nella programmazione, dato un insieme di punti n, al fine di trovare il punto più vicino a nessuno, è necessario controllare ogni altro punto, che è tempo.O(n)

Immagino che la vista visiva di un grafico sia probabilmente l'equivalente di una struttura di dati che non sono in grado di comprendere; perché con la programmazione, convertendo i punti in un metodo più strutturato come un quadrifoglio, si possono trovare i punti più vicini ai punti in n in k ⋅ tempo log ( n ) o tempo O ( log n ) ammortizzato .knklog(n)O(logn)

Ma non esistono ancora algoritmi ammortizzati noti (che posso trovare) per la ricerca di punti dopo la ristrutturazione dei dati.O(1)

Quindi perché questo sembra possibile con una semplice ispezione visiva?


36
Sei a conoscenza di tutti i punti già e approssimativamente dove si trovano; i "driver software" per i tuoi occhi hanno già fatto il duro lavoro per te di interpretare l'immagine. Nella tua analogia stai considerando questo lavoro "libero", quando in realtà non lo è. Se avessi già una struttura di dati che ha suddiviso le posizioni dei punti in una sorta di rappresentazione di ottotree, potresti fare molto meglio di O (n). Molte pre-elaborazioni avvengono nella parte subconscia del cervello prima che le informazioni raggiungano anche la parte cosciente; non dimenticarlo mai in questo tipo di analogie.
Richard Tingle,

20
Penso che almeno una delle tue ipotesi non valga in generale. assume tutti i punti disposti su un cerchio con perturbazioni "piccole" e 1 punto aggiuntivo P è il centro del cerchio. Se si desidera trovare il punto più vicino a P, non è possibile ignorare nessuno degli altri punti nel grafico.
collapsar

4
Perché il nostro cervello è davvero fantastico! Sembra una risposta economica ma è vera. In realtà non sappiamo molto su come funziona la nostra elaborazione di immagini (apparentemente massicciamente parallela).
Carl Witthoft,

7
Bene, fondamentalmente, il tuo cervello usa il partizionamento dello spazio senza che te ne accorga. Il fatto che questo appaia davvero veloce non significa che sia un tempo costante: stai lavorando con una risoluzione limitata e il tuo software di elaborazione delle immagini è progettato per questo (e potrebbe persino gestirlo tutto in parallelo). Il fatto che stai usando un centinaio di milioni di piccole CPU per eseguire la preelaborazione non ti mette in - fa solo l'operazione complicata su molti piccoli processori. E non dimenticare la trama del foglio 2D, che deve essere almeno O ( n ) . O(1)O(n)
Luaan,

9
Non sono sicuro che sia già stato menzionato, ma il cervello umano funziona in modo molto diverso da un sistema informatico di tipo SISD von Neumann. Particolarmente rilevante qui è che, come ho capito, il cervello umano è intrinsecamente parallelo e specialmente così quando si tratta di elaborare stimoli sensoriali: puoi sentire, vedere e sentire più cose contemporaneamente ed essere (approssimativamente, comunque) consapevole di tutti contemporaneamente. Mi sto concentrando sullo scrivere un commento, ma vedo la mia scrivania, una lattina di soda, la mia giacca appesa alla porta, la penna sulla mia scrivania, ecc. Il tuo cervello può controllare molti punti contemporaneamente.
Patrick87,

Risposte:


115

Il tuo modello di ciò che fai mentalmente non è corretto. In effetti, operi in due passaggi:

  1. Elimina tutti i punti che sono troppo lontani, in tempo.O(1)
  2. Misurare le punti che sono circa il più vicino, in Θ ( m ) tempo.mΘ(m)

Se hai giocato a giochi come bocce (bocce) o curling, questo dovrebbe essere familiare - non è necessario esaminare gli oggetti che sono molto lontani dal bersaglio, ma potrebbe essere necessario misurare i contendenti più vicini.

Per illustrare questo punto, quale punto verde è il più vicino al punto rosso? (Solo di poco più di 1 pixel, ma ce n'è uno più vicino.) Per semplificare le cose, i punti sono stati persino codificati a colori in base alla distanza.

una nuvola di punti

Questa immagine contiene punti che sono quasi su un cerchio e n 10 punti verdi in totale. Il passaggio 1 consente di eliminare quasi tutti i punti m , ma il passaggio 2 richiede il controllo di ciascuno dei punti m . Non esiste un limite a priori per m .m=10n10mmm

Un'osservazione fisica consente di ridurre la dimensione del problema dall'intero set di punti a un set candidato ristretto di mnm punti. Questo passaggio non è un calcolo come comunemente inteso, perché si basa su un processo continuo. I processi continui non sono soggetti alle usuali intuizioni sulla complessità computazionale e in particolare all'analisi asintotica.

Ora, potresti chiederti, perché un processo continuo non può risolvere completamente il problema? Come si arriva a questi punti , perché non possiamo affinare il processo per ottenere m = 1 ?mm=1

mnm

(x,y)(x,y)(x0,y0)m. Questo modello rispetta alcune proprietà chiave del modello umano:

  • m
  • L'efficienza pratica dipende dall'aver selezionato una scala che corrisponde ai dati (ad es. Non risparmierai nulla se i tuoi punti sono su un pezzo di carta e le tue celle sono larghe 1 km).

9
Inoltre, non tutti i grafici possono essere proiettati nella pianura in modo che le distanze di Euklidian corrispondano alle distanze nel grafico (ad es. Se i pesi del bordo non formano una metrica).
Raffaello

5
@Raphael Ho capito che la domanda riguardava la geometria computazionale piuttosto che la teoria dei grafi, ma in effetti questa è un'ulteriore complicazione.
Gilles,

2
@Gilles Done . Ho appena imparato il termine geometria computazionale .
Gerrit,

2
Questo potrebbe essere un pignolo, posso capire cosa stai cercando di mostrare, ma come uno che è daltonico "scegli il verde più vicino al rosso" porta a un sacco di grattacapi su quali punti sono quali. Solo qualcosa a cui pensare in futuro: scegli qualsiasi altra combinazione di colori oltre al rosso / verde!
tpg2114,

3
@ tpg2114 Non dimenticare che il rosso / verde non è l'unico tipo di daltonismo. Mostrarlo con una forma (o qualsiasi attributo diverso dal colore) sarebbe ancora più inclusivo di "qualsiasi altra combinazione di colori oltre al rosso / verde".
Jonathan Van Matre,

42

Il motivo è che i dati sono stati inseriti in una "struttura di dati" ottimizzata per questa query e che il tempo di preelaborazione nella preparazione del grafico dovrebbe essere incluso nei tempi misurati, che è proporzionale al numero di punti, dando una O (n) complessità proprio lì.

Se metti le coordinate in una tabella che elenca le coordinate X e Y di ciascun punto, ti occorrerebbe uno sforzo mentale molto più grande per calcolare le distanze tra i punti, ordinare l'elenco delle distanze e scegliere il più piccolo.

Come esempio di una query che non funziona bene visivamente, sarebbe guardare il cielo notturno e - in base solo alla tua vista e una tabella di coordinate di ogni stella - individuare la stella più vicina alla Terra o quale segno astrologico ha la distanza più piccola tra le stelle di cui è composta. Qui avresti bisogno di un modello 3D zoomabile e ruotabile per determinarlo visivamente, dove un computer lo considererebbe essenzialmente lo stesso problema dell'originale.


2
+1 - Stavo scorrendo verso il basso cercando qualcuno che esponesse esattamente questo punto. La rappresentazione di un dato in arrivo è importante: prova a trovare la mediana di un elenco ordinato rispetto a un elenco non ordinato!
cloudfeet

21

O(1)O(1)


8
Immagina di posizionare un miliardo di punti lungo un cerchio, ma tutti leggermente disturbati un po ', quindi i tuoi punti formano un anello sfocato. Per trovare il punto più vicino al centro a occhio, non vedo come si possa fare molto meglio che controllare tutti i punti uno per uno.
Nick Alger,

4
@NickAlger Quindi è più simile O(numberOfPointsAboutTheSameDistanceFromTheTargetPointAsTheClosestPoint), che non è necessariamente correlato n. Ad ogni modo, penso che una risposta a ciò dovrebbe presentare possibili strutture di dati in termini di come la mente umana la percepisce e la interroga. Dire semplicemente che non è O (1) sembra ... pigro? inadeguata?
Dukeling,

5
@Dukeling O (qualcosa) si riferisce al caso peggiore. Se ci sono schemi in cui il cervello umano non può farlo in tempo costante, allora sicuramente non è O (1). Se c'è qualche limite X in cui il cervello umano può elaborare i punti X in tempo costante, ma non può affatto elaborare i punti X * 2 - allora non è O (1).
Peteris,

3
@Dukeling È neccessariamente dipendente da n, poiché nel caso peggiore è uguale a n, e se hai assegnato n punti arbitrari devi aspettarti che potrebbe essere impossibile farlo più velocemente delle operazioni C * n.
Peteris,

2
@Peteris Suppongo che non siamo d'accordo su cosa significhi essere "necessariamente dipendenti da n" e su come determinare il limite superiore più vicino.
Dukeling,

15

La superiorità dell'ispezione visiva dipende da premesse cruciali che non possono essere garantite in generale:

  • O(n)

  • conteggio : (cfr. il commento di Nick Alger sulla risposta data da DW) si assume un conteggio dei punti superiore al numero delle cellule della retina - non si identificheranno nemmeno tutti i punti coinvolti.

  • varianza : (vedi il commento di Nick Alger sulla risposta data da DW) presuppone che una serie di punti su una griglia regolare (es. esagonale) sia soggetta a piccole perturbazioni casuali. se queste perturbazioni diventano inferiori alla risoluzione della tua retina (o di qualsiasi altra griglia sovrapposta), non sarai solo forzato a rilevare la distanza minima effettiva, ma sceglierai coppie di punti sbagliate con un'alta probabilità.

O(n)O(1)


1
O(n)O(log(n))

O(n)nO(nlogn)n

15
  1. Il computer sta risolvendo un problema diverso. Prende un elenco di punti, non un'immagine rasterizzata di punti. La conversione da un elenco a un'immagine, ovvero "la stampa" dei punti, richiede O(n)tempo.

    Presto! Qual è il più vicino a (1,2):

    • (9, 9)
    • (5, 2)
    • (3, -2)
    • (4, 3)
    • (0, 4)
    • (1, 9)

    Molto più difficile, vero? Scommetto che se avessi fatto la lista il doppio del tempo avresti dovuto fare il doppio del lavoro.

  2. Non sei consapevole di quanto lavoro sta facendo il tuo cervello. Non "sai" quale punto è più vicino. Il tuo cervello sta facendo un lavoro computazionale per capire quella risposta e renderla disponibile. Il cervello lavora su ogni punto in parallelo, quindi il tempo per finire rimane più o meno lo stesso, ma la quantità di lavoro richiesto aumenta ancora con il numero di punti.


13

Per lo stesso motivo quando guardi un triangolo e sai che è un triangolo, stai dimenticando i molti milioni di calcoli che fai senza accorgertene.

Reti neurali

In effetti sei una rete neurale che è stata addestrata e caricata con masse su masse di dati.

Prendi ad esempio il gioco di smistamento delle forme infantili:

inserisci qui la descrizione dell'immagine

Quando un bambino interagisce per la prima volta con questo, è probabile che tenterà di inserire forme nei buchi sbagliati, questo perché non hanno ancora allenato il loro cervello o incontrato abbastanza dati per costruire reti. Non possono fare ipotesi su bordi, dimensioni, ecc. Per determinare quale forma si adatta al foro.

Questo ti sembra ovvio (spero) perché hai creato queste connessioni, potresti persino pensare che sia intuitivo e non devi romperlo, ad esempio sai solo che il triangolo si adatta al triangolo e non è necessario approssimare la dimensione , contare i bordi, .etc. Questo non è vero, hai fatto tutto ciò nel tuo subconscio, l'unico pensiero cosciente che avevi era che era un triangolo. Molti milioni di calcoli sono avvenuti prendendo una rappresentazione visiva, capendo cosa rappresentava, comprendendo quali fossero i singoli elementi e quindi stimando le loro distanze, il fatto che tu avessi un ampio database di informazioni su cui sondare rendeva più semplice.

Il tuo cervello non è binario

I dati su cui lavora il tuo cervello non sono binari (per quanto ne sappiamo), non sono veri o falsi, contengono molti stati che usiamo per interpretare i dati, spesso sbagliamo spesso, anche quando seguiamo il corretto processo, questo perché i dati cambiano spesso. Immagino che il nostro cervello funzioni molto più come un computer quantistico in cui i bit sono in uno stato approssimativo fino alla lettura. Cioè, se il nostro cervello funziona come un computer, in realtà non è noto.

Quindi un algoritmo per lavorare con i dati binari non funzionerà allo stesso modo. Non puoi confrontare i due. Nella tua testa stai usando concetti per eseguire, tipi di dati ricchi che contengono molte più informazioni, hai la capacità di creare collegamenti dove non sono esplicitamente definiti; vedendo un triangolo potresti pensare al lato oscuro della copertura lunare di Pink Floyd.

inserisci qui la descrizione dell'immagine

Tornando al grafico a dispersione, non vi è alcun motivo per cui non è possibile farlo su un computer utilizzando una bitmap e misurando la distanza da un punto in raggi crescenti fino a quando non si incontra un altro punto. È forse il più vicino possibile all'approssimazione di un essere umano. È probabile che sia molto più lento a causa della limitazione dei dati e perché i nostri cervelli non si preoccupano necessariamente della complessità del calcolo e prendono una strada complessa per fare le cose.

Non sarebbe O (1), o addirittura O (n) se n è il numero di punti, invece la sua complessità ora dipende dalla massima distanza lineare dal punto selezionato a un limite dell'immagine.

tl; dr

Il tuo cervello non è un computer binario.



8

stai dimenticando un passaggio importante: tracciare tutti quei punti sul grafico che stai guardando.

questa è necessariamente un'operazione O (n).

successivamente un computer può utilizzare un software di riconoscimento delle immagini per trovare i punti approssimativi più vicini al centro esattamente come fa l'occhio umano. Si tratta del caso peggiore di un'operazione O (sizeOfImage).

affinché un essere umano faccia lo stesso del computer, ricorda che il computer ottiene un elenco di coordinate e può guardarne solo una alla volta.


1
Se si sceglie una "risoluzione" costante, si può usare un algoritmo che è il tempo O (log (risoluzione)) per punto per tracciarli e identificare tutti i punti che sono "vicini" al punto di interesse. La O (log (risoluzione)) è vagamente analoga al fatto che ci vuole più tempo per tracciare i punti con precisione sulla carta che per farlo in modo meno preciso. Si noti inoltre che l'aumento della risoluzione aumenterà il costo per tutti i punti degli algoritmi per eliminare i punti non candidati, ma ridurrà il numero di punti non più vicini per sopravvivere all'eliminazione.
supercat

7

La mia interpretazione della domanda:

Non credo che questa domanda debba essere presa in modo semplicistico come un problema di complessità della geometria computazionale. Dovrebbe essere meglio compreso come dire: percepiamo la capacità di trovare la risposta in tempo costante, quando possiamo. Ciò che spiega questa percezione, e fino a questa spiegazione e ai limiti umani, può fare anche un computer.

O(1)O(log(n))

Ciò può essere rafforzato dalle leggi di Weber-Fechner , secondo cui la nostra percezione deve essere misurata su una scala logaritmica della misura fisica effettiva. In altre parole, percepiamo variazioni relative piuttosto che variazioni assolute. Questo è ad esempio il motivo per cui l'intensità del suono è misurata in decibel.

O(log(n))Oψ(log(log(n)))Oψ

Oψ(log(log(n))) che a tutti gli effetti pratici è probabilmente percettibilmente indistinguibile da una costante, e c'è necessariamente un tempo costante ad esso aggiunto per avviare il processo di riconoscimento e riconoscere il risultato.

Tenendo conto dei limiti fisiologici

La conclusione di cui sopra è ulteriormente sostenuta quando si considerano i passaggi di acquisizione dell'immagine.

L'OP è stato attento a separare la costruzione di un'adeguata struttura di dati, "come un quadrifoglio", che è ammortizzata su diverse query.

Questo non funziona per la maggior parte delle persone che non memorizzano l'immagine. Penso che l'immagine venga scansionata per ogni query, ma ciò non implica la scansione di tutti i punti: non la prima volta e non per le query successive.

TscanTscan

mOψ(log(log(m)))

227log2(27)

Senza conoscere le unità effettive da utilizzare, ciò dimostra semplicemente che la variazione per l'elaborazione è nella peggiore delle ipotesi nello stesso ordine delle altre operazioni a tempo costante. Pertanto, è del tutto naturale che il tempo percepito per trovare il punto più vicino sia costante. . . se determiniamo il punto più vicino o solo un insieme di punti più vicini.

Informazioni sui contro-esempi e una possibile soluzione

Naturalmente è facile costruire contro-esempi che rendono molto difficile la determinazione degli occhi del punto più vicino in una piccola raccolta di punti più vicini. Questo è il motivo per cui l'OP sta effettivamente richiedendo un algoritmo che elimina rapidamente la maggior parte dei punti, ad eccezione di quelli più vicini. Questo problema della possibile difficoltà di scegliere tra diversi punti vicini è affrontato in molte risposte, con l'esempio paradigmatico di punti più vicini che si trovano quasi su un cerchio attorno al punto di riferimento. In genere le leggi di Weber-Fechner precludono la possibilità di distinguere piccole variazioni di distanza su distanze sufficientemente lunghe. Questo effetto può effettivamente essere aumentato dalla presenza di altri punti che, sebbene eliminati, possono distorcere la percezione delle distanze. Quindi cercare di identificare il punto più vicino sarà un compito più difficile, e potrebbe richiedere specifiche fasi di esame, come l'uso di strumenti, che distruggeranno completamente la sensazione di tempo costante. Ma sembra chiaramente al di fuori della gamma di esperimenti considerati dal PO, quindi non molto rilevante.

La domanda a cui rispondere , che è la domanda effettivamente posta dal PO, è se esiste un modo per eliminare la maggior parte dei punti, tranne forse per i restanti pochi che sembrano avere distanze molto simili al punto di riferimento.

O(log(n))

Il rifiuto del costo ammortizzato non consente una soluzione informatica, poiché tutti i punti devono essere esaminati. Ciò sottolinea una grande differenza nella potenza di calcolo del cervello e della percezione umana: può usare il calcolo analogico con proprietà piuttosto diverse dal calcolo digitale . Questo è in genere il caso in cui miliardi di punti non sono distinguibili dall'occhio, che non ha la risoluzione di vedere altro che una grande nuvola con varie sfumature di buio. Ma l'occhio può quindi concentrarsi sulla parte più piccola rilevante e vedere un numero limitato di punti, contenente quelli pertinenti. Non deve conoscere tutti i punti individualmente. Affinché un computer faccia lo stesso, dovresti dargli un sensore simile, piuttosto che le coordinate numeriche precise di ciascun punto. È un problema molto diverso.

"La semplice ispezione visiva" è per alcuni aspetti molto più potente del calcolo digitale. Ed è dovuto anche alla fisica dei sensori, non solo a una potenza di calcolo del cervello forse maggiore.


O(1)O(logn) O(1)O(1)O(logn)quando si risolve un'attività oltre il semplice riconoscimento percettivo, ad es. localizzare un determinato numero in una rappresentazione grafica di un heap binario bilanciato con nodi etichettati. si noti che le restrizioni percettive non contano poiché si controlla solo la grafica a livello locale.
collapsar

n

Oψ(log(log(n)))

4

Avevamo studenti in esami che, quando gli veniva chiesto quanto velocemente si potesse ordinare un array, avrebbero affermato che i computer sono stupidi e che necessitano di n * log (n) (o peggio), mentre gli umani possono farlo più velocemente.

La risposta del mio professore è stata sempre: fornirò un elenco di 10.000 articoli. Vediamo se riesci a trovare un metodo più veloce di quello che farebbe un computer.

E poi: quanti core di elaborazione sono coinvolti quando si tenta di trovare il punto più vicino? Non sei una macchina a singolo processore, hai una rete neurale, che ha una certa flessibilità quando si tratta di attività come questa.


1
Inoltre i vari aspetti di ciò che sai sui dati e quali risorse hai a disposizione quando devi ordinare. Ad esempio, se i tuoi compagni di studio hanno bisogno di ordinare qualcosa che non si adatta perfettamente alla stanza in cui si trovano.
Thorbjørn Ravn Andersen,

@ ThorbjørnRavnAndersen: questa è una buona idea per capire quanto sia importante la complessità dello spazio "qualcosa che non può rientrare completamente nella stanza" 8 ^)
Zane

3

Credo che @ Patrick87 ti abbia dato la chiave: i tuoi occhi e il tuo cervello sono una macchina di calcolo massicciamente parallela. Alcuni hanno sostenuto che ciò non spiega il problema, perché per problemi arbitrariamente grandi un numero finito di processori paralleli non fa differenza.

Ma qui: come suggerito da molti, i tuoi occhi (e il tuo cervello) hanno una capacità limitata di risolvere questo problema; e questo perché non si può inserire nessun numero di punti all'interno di un normale sguardo umano. I tuoi occhi devono essere in grado di distinguerli per cominciare, e se ce ne sono troppi, allora saranno così vicini che i tuoi occhi non noteranno la differenza. In conclusione: è veloce per punti abbastanza bene che si adattano alla vista normale, cioè molto pochi. In altri casi fallirà.

Quindi, puoi risolvere questo problema in O (1) per casi piccoli e semplici che il tuo cervello può elaborare in un attimo. Oltre a ciò, non può e quindi non è nemmeno O ( niente ) perché molto probabilmente fallisce.


1

Nessuno ha menzionato che questo problema può essere risolto molto rapidamente su un computer con un indice spaziale. Questo equivale a tracciare i punti in un'immagine affinché i tuoi occhi possano scansionare rapidamente ed eliminare la maggior parte dei punti.

Esiste un ottimo algoritmo di indicizzazione utilizzato da Google e altri per trovare i punti più vicini chiamati Geohash. http://en.wikipedia.org/wiki/Geohash .

Penso che questo aumenterà anche il concorso a favore del computer. Non sono rimasto colpito da alcune delle risposte che hanno utilizzato il pensiero lineare.


Θ(n) Θ(lgn)

Il punto è che un indice spaziale lo rende all'incirca facile come lo è per un essere umano che guarda uno schermo disseminato di punti.
reinierpost,

1

Se consideriamo il caso di trovare i vicini più vicini in un insieme di punti di n-dimensioni nello spazio euclideo, la complessità è generalmente limitata dal numero di dimensioni man mano che aumenta (ovvero più grande della dimensione del set di dati).

O(logd2n)

Il problema di trovare un punto più vicino a un nodo in un grafico ha un'espressione euclidea ogni volta che il grafico può essere incorporato nello spazio euclideo con una distorsione abbastanza piccola. E usando un elenco di adiacenza con pesi, dobbiamo ancora costruire l'elenco di adiacenza.

O(1)


-1

altre risposte sono buone, ma che ne dite di una contro domanda zen che estende il ragionamento / premessa di base della domanda originale agli estremi per mostrare un po 'di difettosità [ma è anche il paradosso al centro della ricerca dell'IA ]:

se riesco a pensare con intelligenza umana, perché non posso creare un computer che pensi oltre che un essere umano?

ci sono molti modi per rispondere alla tua domanda, ma fondamentalmente, i nostri processi di pensiero e le capacità percettive del cervello non sono necessariamente accessibili all'introspezione e l'introspezione che applichiamo a loro può essere fuorviante. per esempio, possiamo riconoscere gli oggetti ma non abbiamo modo di percepire / spiegare il processo quasi algoritmico che procede per consentirlo. inoltre ci sono molti esperimenti di psicologia che mostrano che ci sono sottili distorsioni nelle nostre percezioni della realtà e in particolare la percezione del tempo, vedi ad esempio la percezione del tempo .

è generalmente ipotizzato / congetturato dagli scienziati che il cervello umano impieghi effettivamente algoritmi ma funzionino in modo diverso da quelli computerizzati, e c'è anche una grande quantità di elaborazione parallela nel cervello attraverso reti neurali che non può essere paragonata sensibilmente a algoritmi sequenziali per computer. nei mammiferi, una percentuale significativa dell'intero volume del cervello è dedicata all'elaborazione visiva.

in altre parole, i cervelli umani sono in molti modi computer visivi altamente ottimizzati, e in effetti in molti modi hanno una capacità che supera attualmente i più grandi supercomputer del mondo, come nel riconoscimento degli oggetti, eccetera, e che è dovuta a carenze (in confronto) nel software / hardware costruito dall'uomo rispetto alla biologia che è stata ottimizzata / evoluta / ottimizzata nel corso di milioni di anni.


O(f(n))

-2

In generale, stai risolvendo due problemi diversi e se gareggi nella stessa competizione, la complessità sarà O (1) per entrambi. Perché? Rendiamo la situazione un po 'più semplice - supponiamo che tu abbia una linea con un punto rosso e n punti verdi. Il tuo compito è trovare il punto verde più vicino al punto rosso. Tutto è nel grafico. Ora quello che fai e quello che stai programmando è sostanzialmente lo stesso - basta "allontanarsi" (in entrambe le direzioni) dal punto rosso e verificare se il pixel che stai guardando è bianco / nero (sfondo) o verde. Ora la complessità è O (1).

La cosa interessante è che alcuni metodi di presentazione dei dati danno immediatamente risposte ad alcune domande (O (1)). L'esempio di base è estremamente semplice: basta contare i pixel bianchi sull'immagine nera (ogni valore di pixel è 0 = nero o 1 = bianco). Quello che devi fare è solo aggiungere tutti i valori dei pixel - la complessità è la stessa per 1 pixel bianco e per 1000, ma dipende dalla dimensione dell'immagine - O (m), m = image.width * image.height. È possibile farlo più velocemente? Ovviamente, tutto ciò che dobbiamo fare è usare un metodo diverso di memorizzazione delle immagini che è immagine integrale : inserisci qui la descrizione dell'immagine ora il calcolo del risultato è O (1) (se hai già un'immagine integrale calcolata). Un altro modo è semplicemente memorizzare tutti i pixel bianchi in array / vettore / elenco / ... e contarlo semplicemente - O (1).


O(1)O(1)

@FrankW - quindi qual è la complessità di "andare via"? Non sto cercando di dire che ti sbagli, voglio solo sapere. Conteggio delle dimensioni di array / vettore / elenco - in genere le dimensioni dell'array sono costanti, quindi non è necessario contarle, vettore - non sono sicuro, direi che dipende dall'implementazione (ma molto probabilmente nella maggior parte delle implementazioni è solo del campo di un oggetto quindi non c'è bisogno di contarlo), elenca - hai ragione, non è O (1) - il mio errore.
Cyriel,

kkO(#pixels)
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.