所以,基本上我有这种算法,使用算术编码对单词进行编码。用百分比(字符串[] [] tabelaProbs和字(字符串palavra)矩阵如下:添加双打问题。算术编码
矩阵:
String tabelaProbs[][] = {{"A", "E", "I", "O", "U", "!"},{"0.2", "0.3", "0.1", "0.2", "0.1", "0.1"}};
字:
String palavra = "EAII!"; (in lower case: " e a i i ! ")
的事情是,它的给我错误的结果,因为与双打的一些款项给出了错误的结果,这也影响最终结果也 最终结果(credencialCodificada)预计为:0.23354
任何人都可以帮忙吗?
public static double codificarCredenciaisAcesso(String[][] tabelaProbs, String palavra) {
double aux = 0;
String letra, palavraAux = "";
int indice = 0;
double[] probabilidadesAux = new double[tabelaProbs[1].length + 2];
probabilidadesAux[0] = 0;
for (int i = 0; i < tabelaProbs[1].length; i++) {
aux += Double.parseDouble(tabelaProbs[1][i].trim());
probabilidadesAux[i + 1] = aux;
}
probabilidadesAux[probabilidadesAux.length - 1] = 1;
for (int indiceLetra = 0; indiceLetra < palavra.length(); indiceLetra++) {
letra = palavra.charAt(indiceLetra) + "";
palavraAux += letra;
for (int iProb = 0; iProb < tabelaProbs[0].length; iProb++) {
if (letra.equalsIgnoreCase(tabelaProbs[0][iProb])) {
indice = iProb;
break;
}
}
double intervaloProb = probabilidadesAux[indice + 1] - probabilidadesAux[indice];
for (int i = 0; i < probabilidadesAux.length; i++) {
if (indice == i) {
probabilidadesAux[0] = probabilidadesAux[indice];
probabilidadesAux[probabilidadesAux.length - 1] = probabilidadesAux[indice + 1];
aux = probabilidadesAux[0];
for (int j = 1; j < probabilidadesAux.length - 1; j++) {
double probabilidadeX = Double.parseDouble(tabelaProbs[1][j - 1]);
probabilidadesAux[j] = aux + (probabilidadeX * intervaloProb);
aux = probabilidadesAux[j];
}
break;
}
}
}
double credencialCodificada = probabilidadesAux[indice];
return credencialCodificada;
}
您的调试器显示了什么? –
,在某些情况下,它会给出错误的结果。例如,如果总和为0.1 + 0.2,结果不会是0.3,而是0.30000004。它看起来很小,但它会影响最后的结果 –