hi leute,
ich habe gerade festgestellt, dass eine meiner methoden mehrere sekunden laufzeit in anspruch nimmt. die methode berechnet die silvesterscheSiebformel.
heißt:
input:
p1,p2,p3,... wobei diese p's die jeweiligen wahrscheinlichkeiten sind, dass innerhalb eines tages ein ereignis eintritt
output:
P(alle zeiteinheiten), also die wahrscheinlichkeit, dass dieses ereignis einmal in der gesamten zeiteinheit eintrit.
mein code:
private static Double silvesterscheSiebformel(Double[] probilitys)
{
Double p=0.0;
for(int k=1;k<=probilitys.length;k++)
{
Double z=Math.pow(-1, k-1);
Double n=0.0;
ArrayList<Double> kombis=getKombis(probilitys,k);
for(int i=0;i<kombis.size();i++)
{
n+=kombis.get(i);
}
p+=z*n;
}
return p;
}
/**
* Berechnet die wahrscheinlichkeit einer jeden kombi mit k ereignissen.
* @param probilitys
* @param k
* @return
*/
private static ArrayList<Double> getKombis(Double[] probilitys,int k)
{
ArrayList<Double> list =new ArrayList();
int[] zeiger=new int[k];//zeigen auf die jeweilige kombination
for(int i=0;i<k;i++)
{
zeiger[i]=i;
}
while(1==1)//jeweils eine zul"assige kombination
{
Double p=1.0;
for(int i=0;i<zeiger.length;i++)
{
if(probilitys[zeiger[i]]!=null)
p*=probilitys[zeiger[i]];
else p*=0;
}
list.add(p);
if(zeiger[0]==probilitys.length-k) break; //abbruchbedingung
//verschiebung der eiger f"ur next kombination
//bewege den indize um eins, der abstand von 1 zu next indize hat ODER bewege letzten indize um eins
int c=driveInd(zeiger);
zeiger[c]++;
}
return list;
}
/**
* returnt, welcher indize um eins bewegt werden muss.
* Hierbei wird jener ausgew"ahlt, welcher eine differenz von 1 zu seinem nachfolger hat ODER der letzte indize.
* @param zeiger
* @return
*/
private static int driveInd(int[] zeiger)
{
for(int i=0;i<zeiger.length-1;i++)
{
if(Math.abs(zeiger[i]-zeiger[i+1])>1) return (i);
}
return (zeiger.length-1);
}
verbraucht ziemlich viel laufzeit, habt ihr eventuell ideen wie ich diese laufzeit verringern kann? mir fehlt derzeit noch ein passender ansatz...