Witam Forumowiczów,
Czas wykonywania Voida jest zbyt długi i wynosi dla wszystkich ciał voida mniej więcej tyle samo +/- 20.5 sek.
Proszę o pomysł na alternatywne ciała voida, a w szczególności rekurencyjne.
Poniżej przykładowy kod do wywołania funkcji void.
Podaję poniżej przykładowy kod jak wywoływana jest funkcja void. Dane w tabeli Z[] są zawsze rosnące i unikalne, bez powtórzeń.
Napisałem kod do generatora losowego, tak by liczby w tabeli były rosnące, w przykładzie liczby się powtarzają,
co będzie można zobaczyć po kompilacji podanego niżej kodu.
Pierwsze i trzecie ciało działa na tej samej zasadzie, zlicza niepowtarzalne liczby, oraz te powtarzalne,
tak może robić bo w rzeczywistym kodzie jak pisałem wartości są unikalne i rosnące.
Natomiast drugie ciało voida zlicza unikalne wartości w tabeli, co tez jest poprawne , gdy są unikalne wartości w tabeli Z[].
Z kolei zmienna 'q' po każdej iteracji funkcji zlicza zera w tabeli Z[], także na tym przykładzie zmienna q na starcie ma wartość 19 i maleje wraz z ilościa iterowań funkcji.
Zmienna q jest potrzeba w dalszym kodzie do optymalizacji innych iteracji.
include <iostream>
include <cstdlib>
include <time.h>
include <fstream>
include <cmath>
include <random>
include <chrono>
include <iomanip>
using namespace std;
double liczby[]={1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0};
double Z[19];
int tabl[19];
void Zliczanie(double B1[], double B2[], int B3[])
{
int q=0;
for(int S=0;S<=19;S++)
{
for(int s=q; s<=19;s++)
{ double a=(B1[s]-B2[S])/B2[S];
if(a<0){a*=-1;};
if(a<0.000000001){B3[s]+=1;q=s;break;};}
}
}
/*{
//q=0;
int s=-1;
double a;
for(int S=0;S<=19;S++)
{
do
{
++s;
a=(B1[s]-B2[S])/B2[S];
if(a<0){a*=-1;};
}while(a>0.000000001);
++B3[s];
}
//q=s;
}*/
/*{
//q=0;
int s=0;
int S = 0;
while(true)
{
double a=(B1[s]-B2[S])/B2[S];
if(a<0){a*=-1;};
if(a>0.000000001)
{
++s;
}
else
{
++S;
++B3[s];
}
if(S==20)
break;
}
//q=s;
}*/
int main()
{
unsigned seed = static_cast<int> (chrono::system_clock::now().time_since_epoch().count());
mt19937 generator(seed);
uniform_int_distribution<int> distribution(1, 20);
for(int k=0;k<=0;k++) // nie dzialajaca pêtla, by zilustrowac jak jest iterowane wywolanie voida
{ // i zmieniajace siê wartoœci w tablicy Z[] przed kazda iteracji voida
for(int S=0;S<=19;S++)
{
n:
Z[S]=distribution(generator);
if(Z[S]<Z[S-1]){goto n;};
}
Zliczanie(liczby,Z,tabl);
for(int w=0;w<=19;w++)
{
cout<<liczby[w]<<" "<<tabl[w]<<" "<<Z[w]<<endl;
}
}
return 0;
}