Hm...: ich hab laufzeit...

Beitrag lesen

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...