Cos'è questo algoritmo?

1

Vorrei implementare un algoritmo, ma suppongo che sia un problema ben noto ed è stato ancora implementato, ma non riesco a verificarlo senza il suo nome.

Ecco cosa sono disposto a fare:

  • Ho una lista di asserzioni che possono essere vere o false
  • Ho un "oracle" che può dirmi quante asserzioni sono vere in un elenco specificato, ma che non è in grado di dire esplicitamente quali sono validi o meno
  • Il mio obiettivo è sapere per ogni asserzione se è vero o falso
  • "oracle" può solo controllare le liste con almeno un numero enorme di asserzioni (non è possibile testare ciascuna asserzione una per una)

Il mio approccio è quello di lavorare su sottoinsiemi (la dicotomia sembra essere il modo più efficace) nel mio elenco di asserzioni per dividerlo in due parti e inviare entrambe le parti all '"oracolo". Dopo di ciò, cambierei il modo in cui la mia lista di asserzioni è divisa e faccio un altro test e così via ...

Per coloro che conoscono il gioco Mastermind questa è in qualche modo l'idea.

Bene, c'è un nome "ufficiale" per questo problema e il metodo noto per risolverlo?

    
posta ibi0tux 20.11.2015 - 16:17
fonte

2 risposte

4

Lo farei in questo modo:

  1. chiedi all'oracolo la lista di tutte le asserzioni. Di quanto sai quanti sono false
  2. Quindi fai una specie di ricerca binaria per trovare ognuna delle asserzioni fallite. Segui ogni partizione in cui è ancora presente almeno una dichiarazione fallita finché non hai ristretto ogni asserzione fallita.

Esempio: 10 assertion

  • Oracle (0,1,2,3,4,5,6,7,8,9) = 3 affermazioni fallite
  • Oracle (0,1,2,3,4) = 2 | Oracle (5,6,7,8,9) = 1
  • Oracle (0,1) = 0 | Oracle (2,3,4) = 2 | Oracle (5,6) = 1 | Oracle (7,8,9) = 0
  • Oracle (2) = 1 | Oracle (3,4) = 1 | Oracle (5) = 0 | Oracle (6) = 1
  • Oracle (3) = 0 | Oracle (4) = 1

Quindi sappiamo che l'asserzione 2,4,6 sono le asserzioni fallite

Se è richiesta una dimensione minima per l'elenco, è possibile richiedere i sottoinsiemi passando da un elemento fino a quando il numero cambia. Se aumenta, hai aggiunto un'asserzione errata. Ma come primo passo seguirò l'approccio sopra finché non avrai raggiunto la dimensione minima richiesta della richiesta.

    
risposta data 20.11.2015 - 17:10
fonte
3

Rispondendo, presumo che quando dici che "l'oracolo" non può dirti se una singola asserzione è vera o falsa, conosce ancora il suo valore di verità (ad es. valori di verità generati casualmente per asserzioni generiche) .

Lascia che A sia l'insieme delle tue asserzioni. Se A contiene elementi n , la sua cardinalità è: | A | = n . Per prima cosa chiedi all'oracolo quante affermazioni nel set di partenza A sono vere:

  • true ( A ) = true ( a 1 , a < sub> 2 , ..., a n ) = c .

Ora calcoli ogni sottoinsieme di cardinalità n - 1 , quindi quei sottoinsiemi contenenti solo elementi n - 1 ; ogni sottoinsieme può essere definito come segue:

  • A k = { a 1 , a 2 , ..., un k-1 , un k + 1 , ..., un n-1 , un n }.

Il numero di sottoinsiemi che ottieni è n perché di tanto in tanto rimuovi un elemento da n .
Di nuovo, chiedi all'oracolo come possono essere vere le asserzioni in ogni sottoinsieme:

  • true ( A 1 ) = c 1 ;
  • true ( A 2 ) = c 2 ;
  • ...
  • true ( A n ) = c n .

E infine, l'ultima operazione è ... Sottrazione. Calcoli la differenza tra c e ogni c k che hai, e scopri quali asserzioni sono vere e quali false.

Esempio: Diciamo che il set A ha 10 elementi e vero ( A ) = 5. Metà delle affermazioni sono vere, l'altra metà false. Ora apriamo la prima affermazione a 1 da A ottenendo il sottoinsieme A 1 , quindi chiedi all'oracolo il valore di true ( A 1 ).

  • Se vero ( A 1 ) = 5, significa che nessuna vera asserzione è stata rimossa dall'avvio del set A : a 1 è falso;
  • Se vero ( A 1 ) = 4, manca una vera asserzione rispetto a prima: a 1 è vero.

Proseguendo con A 2 , A 3 , ..., A n e sottraendo c a ogni c k ti dirà quali asserzioni sono vere e quali false.

Note: sto assumendo che la funzione true () sia lineare, perché dipende solo dalla dimensione dell'input: se la dimensione dell'argomento è di 50 valori, lì saranno solo 50 operazioni di lettura. È possibile implementare la funzione in modo che il suo argomento sia una struttura dati invece di scrivere ogni singola variabile - ciò è vantaggioso per la scalabilità dell'input.
La matematica che ho usato è molto semplice e la struttura dei dati di cui hai bisogno può essere qualsiasi cosa tu ritenga opportuno.
Inoltre, sei stato costretto a chiedere all'Oracle un gran numero di asserzioni per volta: il set più piccolo con cui ho a che fare contiene n - 1 elementi, che è molto vicino al numero totale di asserzioni di cui tu hai valore voglio capire.

    
risposta data 20.11.2015 - 17:34
fonte

Leggi altre domande sui tag