Peço desculpas pelo título longo, mas realmente não sabia como escrevê-lo de maneira diferente, sem a falta de informações sobre o conteúdo.
Recentemente, fiz um exame universitário sobre algoritmos paralelos. Um exercício me pediu para escrever um algoritmo para determinar se os elementos de uma matriz, vamos chamá-lo A
, foram repetidos um número igual de vezes.
Por exemplo:
1) A = 1 8 8 1 8 1 1 8
: a resposta é sim, todo número é repetido 2 vezes.
2) A = 7 8 8 5 5 4 7 8
: a resposta é não.
Eu tive que escrever o algoritmo para um modelo específico de computação paralela, uma PRAM: o modelo exigia que eu usasse algumas técnicas para evitar conflitos de leitura / gravação e outros problemas, mas isso não é relevante. O que acabei com foi uma nova matriz, vamos chamá-la B
, que eu posso definir da seguinte maneira:Given the array A, B[i] contains the number of repetitions of the element A[i] within A.
Por exemplo:
1) A = 1 8 8 1 8 1 1 8
B = 4 4 4 4 4 4 4 4
2)A = 7 8 8 5 5 4 7 8
B = 2 3 3 2 2 1 2 3
Como você pode pensar e esperar, a única coisa que resta a fazer é verificar se cada elemento de B
é igual ao outro, mas ... acontece que eu sou masoquista e a pressão do exame (mais eu tive um pouco temperatura) me levou a seguir outro caminho. Além disso, a comparação de elementos de uma matriz não é imediata usando este modelo de computação.
Portanto, para verificar se todos os elementos de B
são iguais, somai todos eles e dividi o resultado pelo número de elementos de B
: se o resultado foi igual a um elemento de B (por exemplo, o primeiro B[0]
), o algoritmo retornou true
( false
caso contrário).
Tomando o exemplo acima:
1) sum = 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 = 32
-> 32 / 8 = 4 = B[0]
-> Sim.
2) sum = 2 + 3 + 3 + 2 + 2 + 1 + 2 + 3 = 18
-> 18 / 8 ≠ 2 = B[0]
-> Não.
Eu sei que é um absurdo, mas foi o que eu vim.
Eu verifiquei essa abordagem com várias combinações diferentes de matrizes / números, e parece funcionar. O problema é que estou tendo dificuldade em encontrar uma prova (matemática) de que o algoritmo está correto. Além do resultado do exame, que ainda não conheço, estou muito interessado em saber se há alguma prova / explicação matemática que indique que essa abordagem está correta ou não, e é por isso que preciso de ajuda.
Espero ter postado a pergunta no site StackExchange certo. Caso contrário, redirecione-me para o site certo.
Agradeço antecipadamente.