Valori comparativi più corrispondenti usando tutti gli elementi dell'array

3

Ho due matrici di oggetti (oggetti) nello stesso identico formato. Ogni elemento rappresenta una scommessa e ogni matrice rappresenta uno dei due risultati per quella scommessa (es: Squadra A contro Squadra B). Entrambi gli array hanno questo aspetto:

  {
    "_id": "55762b3de624f37d80d09b34",
    "value": 803,
    "owner": 923
  },
  {
    "_id": "55762b3dc73fad717a7173ed",
    "value": 1457,
    "owner": 897
  },
  ...

Questi array differiscono in lunghezza. Diciamo che l'array A ha 1200 elementi e l'array B ha 800 elementi con valore di ogni articolo compreso tra 4 e 5.000. Nella produzione ogni array probabilmente comprenderà 1000-200.000 voci, quindi tieni a mente l'efficienza. L'obiettivo è quello di prendere tutti gli elementi nell'array B (puntate perse) e aggiungerli all'array A (puntate vinte) in modo che il valore degli elementi in B sia distribuito uniformemente dalla somma dei valori raggruppati per utente in A. Quindi, se scommetti tre elementi, si otterrà indietro tali elementi più qualsiasi numero di elementi dalla matrice B.

Per prima cosa eseguo l'array A (vincitori) e gestisco il raggruppamento e la somma degli utenti. L'array A è ora l'oggetto A e assomiglia a questo:

  '997': // User ID
   { bet: 15090, // Summed value of all items wagered in the below array
     items: // Original item IDs from their wager
      [ '55762b3dd82338e9683eea9b',
        '55762b3dccd4800148eec868',
        '55762b3de495cbcd594ecc17',
        '55762b3daad995d207c506f0',
        '55762b3d2154c4c0e273fe94' ] },
  '998': 
   { bet: 5196,
     items: [ '55762b3da1e658e5cb37ede6', '55762b3d1fca60c0cdd21a2e' ] },
   ...

Quindi prendi il valore totale di ciascun array e calcola il moltiplicatore da utilizzare per ogni valore di "puntata" (ovvero: calcola le quote). Usando gli stessi dati generati casualmente, questo risulta essere:

A Total Value: 2,439,112 (entire value of items bet on Team A)
B Total Value: 1,608,947 (entire value of items lost on Team B)
0.6596445755668456 value from B for each A

Quindi, ad esempio, la scommessa totale dell'utente di 997 di 15.090 avrebbe bisogno di guadagnare ~ 9.954 di valore dall'array B. Quando gli elementi dall'array B sono usati, vengono rimossi e il campo _id viene aggiunto al campo array "items". Poiché i valori sono associati a singoli elementi e non a una valuta divisibile, non possono essere suddivisi per apportare modifiche perfette . I valori non devono corrispondere esattamente, ma dovrebbero essere relativamente vicini. Ad esempio, se un utente punta 100 e guadagna 65,9, se necessario può ottenere oggetti compresi nell'intervallo 62-68. Ciò significa anche che gli utenti che puntano molto poco possono finire per non ottenere nulla in cambio a seconda delle probabilità, poiché c'è una puntata minima di 4. Es: Se punti 4, le tue vincite sarebbero 2,63, ma il valore più basso per distribuire è 4.

Quale tipo di algoritmo sarebbe più appropriato per questo tipo di attività? Sembra qualcosa uscito da un libro di testo, ma non ho idea di dove iniziare la mia ricerca.

Tutti questi dati saranno eventualmente in mongodb, quindi anche le funzioni specifiche di mongo sono benvenute!

    
posta rannmann 09.06.2015 - 18:17
fonte

1 risposta

1

Hmm immagino che l'ovvio sia:

sort B desc
sort A asc

loop through A
    loop through B 
        if Value(B) <= RemainingValue(A)
           add B to A
           break if RemainingValue(A) == 0 OR you run out of B
    Next B
Next A

ma questo non è veloce

    
risposta data 09.06.2015 - 19:39
fonte

Leggi altre domande sui tag