Pereiti prie turinio

Pagalbos su apskaičiavimu


Rekomenduojami pranešimai

Sveiki, reiktu pagalbos su jQuery(na šeip nemanau, kad čia labai svarbu kokia programavimo kalba, čia tiesiog programavimo logika). Ar yra paprastesnis būdas išrūšiuot šituos duomenis nerašant daug if'ų? Jei yra būtu gerai, kad užvestumėt ant kelio.

 

Jei skaičius yra nuo 0-500 turi išvest 10, jei skaičius yra nuo 501-1000 turi išvest 15 ir t.t.

Redagavo Zimex
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Labai paprastas sprendimo budas pritaikant binary search:

   <script type="text/javascript">
       var rangeRes = [];
       rangeRes[500] = 10;
       rangeRes[1000] = 15;
       rangeRes[1500] = 20;
       rangeRes[2000] = 25;
       rangeRes[2500] = 30;
       rangeRes[2600] = 35;
       rangeRes[2700] = 40;
       rangeRes[2800] = 45;
       rangeRes[5000] = 50;
       rangeRes[5200] = 55;
       rangeRes[5400] = 60;
       rangeRes[5600] = 65;
       rangeRes[5800] = 70;
       rangeRes[10000] = 75;
       rangeRes[10200] = 80;
       rangeRes[10400] = 85;
       rangeRes[10600] = 90;
       rangeRes[10800] = 95;
       rangeRes[11000] = 100;

       var max = [500, 1000, 1500, 2000, 2500, 2600, 2700, 2800, 5000, 5200, 5400, 5600, 5800, 10000, 10200, 10400, 10600, 10800, 11000];

       // Test value
       var value = 2634;

       var result = 0;
       var startIndex = 0,
           stopIndex  = max.length - 1,
           middle     = Math.floor((stopIndex + startIndex) / 2);

       while (result == 0 && startIndex < stopIndex) {
           if (value <= max[middle] && value > max[middle - 1]) {
               result = max[middle];
           } else if (value <= max[middle + 1] && value > max[middle]) {
               result = max[middle + 1];
           }

           if (value < max[middle]) {
               stopIndex = middle - 1;
           } else if (value > max[middle]) {
               startIndex = middle + 1;
           }

           middle = Math.floor((stopIndex + startIndex) / 2);
       }

       console.log(rangeRes[result]);
   </script>

Redagavo Ispirit
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Labai paprastas sprendimo budas pritaikant binary search:

   <script type="text/javascript">
       var rangeRes = [];
       rangeRes[500] = 10;
       rangeRes[1000] = 15;
       rangeRes[1500] = 20;
       rangeRes[2000] = 25;
       rangeRes[2500] = 30;
       rangeRes[2600] = 35;
       rangeRes[2700] = 40;
       rangeRes[2800] = 45;
       rangeRes[5000] = 50;
       rangeRes[5200] = 55;
       rangeRes[5400] = 60;
       rangeRes[5600] = 65;
       rangeRes[5800] = 70;
       rangeRes[10000] = 75;
       rangeRes[10200] = 80;
       rangeRes[10400] = 85;
       rangeRes[10600] = 90;
       rangeRes[10800] = 95;
       rangeRes[11000] = 100;

       var max = [500, 1000, 1500, 2000, 2500, 2600, 2700, 2800, 5000, 5200, 5400, 5600, 5800, 10000, 10200, 10400, 10600, 10800, 11000];

       // Test value
       var value = 2634;

       var result = 0;
       var startIndex = 0,
           stopIndex  = max.length - 1,
           middle     = Math.floor((stopIndex + startIndex) / 2);

       while (result == 0 && startIndex < stopIndex) {
           if (value <= max[middle] && value > max[middle - 1]) {
               result = max[middle];
           } else if (value <= max[middle + 1] && value > max[middle]) {
               result = max[middle + 1];
           }

           if (value < max[middle]) {
               stopIndex = middle - 1;
           } else if (value > max[middle]) {
               startIndex = middle + 1;
           }

           middle = Math.floor((stopIndex + startIndex) / 2);
       }

       console.log(rangeRes[result]);
   </script>

Dėkui labai.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

OP redagavo ir iseme duomenis kurie duoti, ten increment value nera pastovus 500, todel sitas variantas netinka.

 

Tada maniškis variantas netinka. Beje, šiuo atveju būtų užtekę paprastos tiesinės paieškos, binary search šiek tiek jau overkill'as, kai elementų vis labo 19.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tada maniškis variantas netinka. Beje, šiuo atveju būtų užtekę paprastos tiesinės paieškos, binary search šiek tiek jau overkill'as, kai elementų vis labo 19.

 

Elementu ne 19, cia tik as sumazinau, kad nebutu toks ilgas kodas. O siaip tai ne, binary nera overkill nes kodo ilgiu nedaug kuom skirias nuo linear, o ir yra kurkas greiciau su binary O(n/2) negu linear O(n).

Redagavo Ispirit
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Elementu ne 19, cia tik as sumazinau, kad nebutu toks ilgas kodas. O siaip tai ne, binary nera overkill nes kodo ilgiu nedaug kuom skirias nuo linear, o ir yra kurkas greiciau su binary O(n/2) negu linear O(n).

 

Nenoriu per daug ginčytis, nes nežinau, koks buvo pradinis temos autoriaus klausimas, bet binary search turėtų prasmę, jei elementų būtų, sakyčiau, bent 10 tūkst. (o gal net 100 tūkst.), ar tą paiešką reikėtų atlikti tūkstančius kartų. O jeigu pradinių duomenų kiekis mažas, tai tas binary search gali veikti ir ilgiau už tiesinį dėl konstantos faktoriaus.

 

Beje, atlikti tūkstantį veiksmų šen ar ten šiuolaikniam kompiuteriui yra juokas. Tokiu atveju kur kas geriau atsižvelgti į kodo paprastumą.

 

Be to, binary search — O(log n).

 

O tiesinėj paieškoj kodo kur kas mažiau, ir jis kur kas paprastesnis:

 

var i = 0;
while (i < max.length && max[i] < value) {
   i++;
}

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Be to, binary search — O(log n).

 

Tiesa, bus man su tiek mazai miego apie execution time mastyt :D

 

Del to kuris is tikruju butu greitesnis sunku man atsakyt netestavus, nes nesu tikras kaip Javascript dorojasi su tam tikrais dalykais. Teoriskai - binary, taciau viskas siuo atveju priklauso nuo to, kurie dydziai dazniausiai pasikartoja. Na, taip ar taip, panasu, kad OP nelabai supranta programavimo, tad bus gerai pamatyt kaip binary atorodo =]

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tiesa, bus man su tiek mazai miego apie execution time mastyt :D

 

Del to kuris is tikruju butu greitesnis sunku man atsakyt netestavus, nes nesu tikras kaip Javascript dorojasi su tam tikrais dalykais. Teoriskai - binary, taciau viskas siuo atveju priklauso nuo to, kurie dydziai dazniausiai pasikartoja. Na, taip ar taip, panasu, kad OP nelabai supranta programavimo, tad bus gerai pamatyt kaip binary atorodo =]

Mėginau padaryt, kad rašytų ir intervalą kuriame rado. Bet pradeda rodyt nesąmones, gal galėtum pagelbėt?

Mėginau intervalo pradžią gaut su max[middle] o pabaigą su max[middle+1]. Kelis kartus suveikia, o veliau rodo viena pakopa didesnius intervalus.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Mėginau padaryt, kad rašytų ir intervalą kuriame rado. Bet pradeda rodyt nesąmones, gal galėtum pagelbėt?

Mėginau intervalo pradžią gaut su max[middle] o pabaigą su max[middle+1]. Kelis kartus suveikia, o veliau rodo viena pakopa didesnius intervalus.

 

Mano kode, kur daviau 'result' ir yra tas intervalas, na tiksliau to intervalo maximumas.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...