ÿþ//+------------------------------------------------------------------+
//| bts.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp."
#property link "http://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart(){
long bsum=0;
long tsum=0;
long bres=0;
long tres=0;
Alert("=== =0G0;> ===");
for(int f=0;f<30;f++){
Alert("===> "+IntegerToString(f+1)+"/30");
int Size=10000000;
long start;
int r;
int a[];
ArrayResize(a,Size);
for(int i=1;i<Size;i++){
a[i]=a[i-1]+MathRand()%10+1;
}
int v=a[MathRand()%Size];
start=GetTickCount();
for(int c=0;c<1000000;c++){
r=bsearch(v,a);
}
bres=GetTickCount()-start;
Alert("b: "+IntegerToString(bres));
start=GetTickCount();
for(int c=0;c<1000000;c++){
r=tsearch(v,a);
}
tres=GetTickCount()-start;
Alert("t: "+IntegerToString(tres));
bsum+=bres;
tsum+=tres;
if(ArrayBsearch(a,v)!=tsearch(v,a) || ArrayBsearch(a,v)!=tsearch(v,a)){
Alert("Error!");
return;
}
}
Alert("bsum="+IntegerToString(bsum)+" tsum="+IntegerToString(tsum));
if(bsum<tsum){
Alert("The binary searching is faster the ternary searching in "+DoubleToString(((double)tsum)/bsum,4)+" times");
}
else if(tsum<bsum){
Alert("The ternary searching is faster the binary searching in "+DoubleToString(((double)bsum)/tsum,4)+" times");
}
else{
Alert("Searching speed is equal");
}
Alert("=== The End ===");
}
//+------------------------------------------------------------------+
// Ternary searching. s - sought value, a - array |
//+------------------------------------------------------------------+
int tsearch(int s,int & a[]){
int n=ArraySize(a);
if(n==0)return(-1);
if(s<a[0])return(0);
int r=n-1;
if(s>a[r])return(r);
int m[2];
int mp[2]={-1,-1};
int l=0;
int t=(r-l)/3;
m[0]=l+t;
m[1]=r-t;
while(m[0]!=mp[0] || m[1]!=mp[1]){
if(s<a[m[0]]){
r=m[0];
}
else if(s>a[m[1]]){
l=m[1];
}
else{
l=m[0];
r=m[1];
}
mp[0]=m[0];
mp[1]=m[1];
t=(r-l)/3;
m[0]=l+t;
m[1]=r-t;
}
int rv=-2;
for(int i=m[1];i>=m[0];i--){
if(s>=a[i]){
rv=i;
break;
}
}
for(int i=rv-1;i>=0;i--){
if(a[i]!=a[rv]){
break;
}
rv=i;
}
return(rv);
}
//+------------------------------------------------------------------+
// Binary searching. s - sought value, a - array |
//+------------------------------------------------------------------+
int bsearch(int s,int & a[]){
int n=ArraySize(a);
if(n==0)return(-1);
if(s<a[0])return(0);
int r=n-1;
if(s>a[r])return(r);
int l=0;
int m;
int pm=-1;
m=(l+r)/2;
while(m!=pm){
if(s<a[m]){
r=m;
}
else if(s>a[m]){
l=m;
}
pm=m;
m=(l+r)/2;
}
int rv=-2;
for(int i=r;i>=l;i--){
if(s>=a[i]){
rv=i;
break;
}
}
for(int i=rv-1;i>=0;i--){
if(a[i]!=a[rv]){
break;
}
rv=i;
}
return(rv);
}
Comments