【发布时间】:2015-08-23 08:23:57
【问题描述】:
所以,基本上我有这个算法,它使用算术编码对单词进行编码。带有百分比(String[][] tabelaProbs 和单词 (String 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。它看起来很小,但会影响最终结果