Digamos que temos uma matriz 5x5, preenchida com 0s.
myMatrix <- matrix(rep(0, 25), ncol = 5)
Agora, vamos escolher um trio de números inteiros entre 1 e 5.
triplet <- c(1,2,3)
Para todas as combinações desse trio, agora adicionamos 1 na matriz, com esta função:
addCombinationsToMatrix <- function(.matrix, .triplet){
indexesToChange <- as.matrix(expand.grid(.triplet, .triplet))
.matrix[indexesToChange] <- .matrix[indexesToChange] + 1
.matrix
}
Usando a função, passamos de
myMatrix
[,1] [,2] [,3] [,4] [,5]
[1,] 0 0 0 0 0
[2,] 0 0 0 0 0
[3,] 0 0 0 0 0
[4,] 0 0 0 0 0
[5,] 0 0 0 0 0
para
myMatrix <- addCombinationsToMatrix(myMatrix, triplet)
myMatrix
[,1] [,2] [,3] [,4] [,5]
[1,] 1 1 1 0 0
[2,] 1 1 1 0 0
[3,] 1 1 1 0 0
[4,] 0 0 0 0 0
[5,] 0 0 0 0 0
Se escolhermos outro trigêmeo, passaremos para
nextTriplet <- 2:4
myMatrix <- addCombinationsToMatrix(myMatrix, nextTriplet)
myMatrix
[,1] [,2] [,3] [,4] [,5]
[1,] 1 1 1 0 0
[2,] 1 2 2 1 0
[3,] 1 2 2 1 0
[4,] 0 1 1 1 0
[5,] 0 0 0 0 0
Portanto, combinações de linhas e colunas representam a frequência com que dois números inteiros foram mostrados juntos em um trigêmeo: 3 e 4 foram mostrados juntos uma vez, 2 e 3 foram mostrados juntos duas vezes.
Pergunta : Como se pode escolher trigêmeos, de modo que todas as combinações (1-2, 1-3, 1-4 ...) foram escolhidas pelo menos uma vez e o número de trigêmeos é minimizado.
Estou procurando um algoritmo aqui que escolhe o próximo trigêmeo.
Idealmente, pode ser estendido para
- matrizes arbitrariamente grandes (10x10, 100x100 ...)
- vetores arbitrariamente grandes (quadrupletos, quintupletos, n-tupletos)
- um número arbitrário de vezes que uma combinação deve ter sido escolhida pelo menos
Exemplo:
myMatrix
myMatrix <- addCombinationsToMatrix(myMatrix, 1:3)
myMatrix
myMatrix <- addCombinationsToMatrix(myMatrix, 3:5)
myMatrix
myMatrix <- addCombinationsToMatrix(myMatrix, c(1,4,5))
myMatrix
myMatrix <- addCombinationsToMatrix(myMatrix, c(2,4,5))
myMatrix
EDIT : Apenas para ter certeza: a resposta não precisa ser R
código. Pode ser também algum outro idioma ou mesmo pseudo-código.
EDIÇÃO 2 : Ocorreu-me agora que existem diferentes maneiras de medir a eficiência. Na verdade, eu quis dizer que o algoritmo deve ter o mínimo de iterações possível. O algoritmo que é rápido também é muito legal, mas não é o objetivo principal aqui.