Tema: Re: kalibravimo lent. c#
Autorius: Laimis
Data: 2012-12-18 04:36:33
bala nemate rašė:
> hoj,
>
> prireikė dotnetinę biblioteką pasidaryti talpos t8rio nustatymui.
> formulės nėra, yra 1330 eilučių lenta su išrašytais lygiais ir tūriu prie
> tokio lygio. paduodi lygį, gauni tūrį.
>
> Ar yra efektyvesnis būdas su kokiu C# tai optimaliau pasidaryti, nei daryti
> switch'ą su 1330 elementų?

Iš principo būtų įdomi funkcija (kaip tai atrodo bent jau grafike); 
veikiausiai pavyktų suraityti į polinomą su priimtinomis paklaidomis 
(aproksimuojant keliais segmentais).

Nors kita vertus, jei lygio reikšmės toje lentelėje yra tiesėje (kx + b; 
t.y. kinta vienodu intervalu), tai nieko nebus _sparčiau_, kaip 
paprasčiausias masyvas.
Tuomet lygiui gali pasirašyti funkciją, kuri reikšmę transformuoja į 
masyvo indeksą.

Pvz:

Lygis		Talpa
5		10
7		20	
9		30
11		40
13		60
15		80
....

Funkcija:
lygis = 5 + 2·x; x = (lygis - 5)/2

Masyvas:
talpa[0] = 10
talpa[1] = 20
talpa[2] = 30
talpa[3] = 40
talpa[4] = 60
talpa[5] = 80
....

Pseudokodas:

function GetVolume(level) {
   i = (level - 5)/2

   // patikrinimas ar reikšmė sveikas skaičius ir kt.;
   // interpoliavimas tarp reikšmių

   return talpa[i]
}

O kitais atvejais, ypač kai tingisi galvoti, tai jau minėjo — hashtable 
(Dictionary). Turėtų būti žymiai švariau kode, paprasčiau manipuliuoti, 
_galbūt_ (tai dar didelis klausimas, kai elementų tiek nedaug) ir sparčiau.

Jei switch'e naudojai string'us (case '12': ...), tai kompiliatorius 
tavo ilgesnį switch'ą optimizuodamas ir pats paverčia į Dictionary 
(nieko papildomai ir daryti nereikia). O jei ten int, tai kompiliatorius 
tą switch'ą optimizuoja paversdamas medžiu, tad iš tikrųjų nelabai ką 
daugiau ir optimizuosi. Nebent tik naudodamas masyvą, tačiau labai 
abejoju ar rašai tiek greitaveikai kritišką kodą, kad masyvo 
indeksavimas turėtų ne nykstamai mažą pranašumą prieš paiešką kelių 
tūkstančių elementų medyje.