AMcoder - javascript, python, java, html, php, sql

Ներկառուցված C-ում բացարձակ արժեքի արդյունավետ շեմի ստուգումներ

Մտածում եմ շեմի ստուգման արդյունավետ միջոցի մասին (ըստ ցանկության հիստերեզի և ուշացման):

Պահանջը/իրավիճակը՝

Ես ուզում եմ ստուգել, ​​օրինակ. ոչ բացասական արժեք (օրինակ՝ բացարձակ ճնշում) վերին և ստորին շեմերի նկատմամբ, ինչը հանգեցնում է համապատասխանաբար գերճնշման սխալի կամ ճնշման տակ սխալի բիտի: Կլինեն մի քանի սահմանված և վերակայման շեմեր: (Ես ուզում եմ կազմակերպել զանգվածով)

Հաշվի առնելով հիստերեզը, պետք է լինեն տարբեր սահմանման և վերակայման արժեքներ, օրինակ. գերճնշման դեպքում սահմանված է p_set ճնշման շեմ (սխալի բիթը սահմանվում է) և վերակայման շեմ՝ p_reset <= p_set: Նույնը վերաբերում է առանց ճնշման, բայց այստեղ p_reset >= p_set, որը ստիպում է համեմատական ​​օպերատորին շրջել.

// Over pressure detection
if (pressure > overPressureSetThld){
  // Over pressure -> set error bit
else if (pressure < overPressureResetThld){
  // Reset over pressure error bit
}

// Under pressure detection
if (pressure < underPressureSetThld){              // Inverted comparison operator
  // Under pressure -> set error bit
else if (pressure > underPressureResetThld){       // Inverted comparison operator
  // Reset under pressure error bit

Այլընտրանքները՝

Մտածելով այս մասին՝ ես տեսնում եմ երկու այլընտրանք.

  1. Իրականացրեք այն ուղիղ դեպի առաջ, ինչպես վերևում -> ավելի մեծ կոդի չափ/«կրկնօրինակ» կոդը (հատկապես հաշվի առնելով ուշացումը)
  2. Համեմատեք հարաբերական արժեքները (հանում և abs, պահանջում է հղման ճնշում) -> կրճատված կոդի չափը, քանի որ անհրաժեշտ է միայն մեկ if-elseif, բայց գործարկման ավելի մեծ բեռ, օրինակ.

    if (abs(pressure - REFRENCE_PRESSURE) > relSetThld){ // Threshold relative to reference and positive // Set over/under pressure error bit else if (abs(pressure - REFRENCE_PRESSURE) < relResetThld){ // Threshold relative to reference and positive // Reset over/under pressure error bit

Հարց.

Ես հակված եմ օգտագործել այլընտրանք 2-ը, բայց ես ինքս ինձ (և ձեզ) հարցնում եմ, թե արդյոք կա դա անելու ավելի լավ միջոց: Առաջարկությունները ողջունելի են:

Լավագույն Քրիստոֆ

27.09.2019

  • Արդյո՞ք կոդի չափը այդքան կարևոր է: Խոսքը +/- 20 բայթի կամ մի բանի մասին է։ Դա չպետք է նշանակություն ունենա բոլոր դիմումների 99%-ում: 27.09.2019
  • Միացրե՞լ եք օպտիմալացումները: Օպտիմալացման նույնիսկ ավելի ցածր մակարդակների ակտիվացումը, հավանաբար, շատ ավելի մեծ ազդեցություն կունենա, եթե հայտարարությունների օպտիմալացման ձեռքով փորձը: 27.09.2019
  • @Lundin. Մի տեսակ այո, քանի որ կարող են լինել մի քանի շեմեր, գումարած բազմաթիվ ճնշումներ: 27.09.2019
  • @user694733. Դուք իրավունք ունեք, բայց ես մտածում էի հենց C ծածկագրի մասին 27.09.2019
  • Հիստերեզի ցիկլերը ենթադրում են հրահրման վիճակի պահպանում, այնպես որ դուք կիրառում եք միայն համապատասխան մակարդակների համեմատությունները, այլ ոչ թե չգործարկվող վիճակին համապատասխանը: 02.10.2019

Պատասխանները:


1

Մի քանի մակարդակների ստուգման նման մի բան իրականացնելու ամենաարդյունավետ միջոցը՝ հաշվի առնելով կատարման արագությունը, տարբեր մակարդակներից «երկուական որոնում»/BST ձևավորելն է։ Ինչը գործնականում նշանակում է գրել եթե-ուրիշ շղթա.

if(val < level_mid)
  if(val < level_low)
    // ...
  else
    // ...
else
  if(val < level_high)
    // ...
  else
    // ...

Դուք իրականում չեք կարող գերազանցել վերը նշվածը կատարողականով և ճյուղերով: Ընթեռնելիության/պահպանման առումով օպտիմալ կոդը ավելի շուտ նման կլինի.

if(val < level_lowest)
  // ...
else if(val < level_low)
  // ...
else if(val < level_mid)
  // ...
else if(val < level_high)
  // ...

Այս կոդը նույնպես բավականին արդյունավետ է, բայց շատ ավելի ընթեռնելի/պահպանելի, քան «երկուական որոնման» այլընտրանքը: Ինչպես միշտ, ապամոնտաժեք և համոզվեք ինքներդ:

Բայց հետո, իհարկե, կոդի ձեռքով օպտիմիզացումը առանց հատուկ համակարգի մտքում այնքան էլ խելամիտ չէ: Ենթադրենք, օրինակ, որ դուք օգտագործում եք 8 կամ 16 բիթանոց պրոցեսոր: Այն ամենը, ինչ կարևոր կլինի կատարողականի առումով, այդ դեպքում ներգրավված ամբողջ թվերի տեսակների չափն է: Նմանապես, առանց FPU-ի MCU-ի վրա լողացող կետի տեսակների օգտագործումը կհանգեցնի խիստ անարդյունավետ կոդի:

Կոդի չափի օպտիմալացման դեպքում դուք պետք է նայեք բոլորովին այլ ասպեկտներ, քան մասնաճյուղերի քանակը: Գրադարանի փքված զանգերից ազատվելը թիվ 1 բանն է (ես նայում եմ քեզ, stdio.h):

Կոդերի չափը նվազեցնելու համար բացարձակ արժեքներ վերցնելը նման բան անելն անիմաստ է. ամենևին էլ ակնհայտ չէ, որ դա կնվազեցնի կոդի չափը: Այն, ինչ այն անպայման կանի, այնուամենայնիվ, բարդության ավելացումն է: Ինչն իր հերթին հակված է հանգեցնել ավելի մեծ կոդի և ավելի շատ սխալների: Կիրառեք KISS սկզբունքը:

27.09.2019
  • Լավ միավորներ! Հաշվի առնելով երկուական որոնումը, սա կիրառելի չի լինի իմ դեպքում, քանի որ կլինեն մի քանի շեմեր, օրինակ. գերճնշման համար, որի արդյունքում պետք է դիտարկվեն 4 անկախ շեմեր: 2-րդ տիրույթի վերակայման շեմը կարող է ավելի փոքր լինել, քան 1-ին տիրույթի վերակայման շեմը: Այսպիսով, ձեր առաջարկած կասկադը այստեղ չի աշխատի: Ինչ վերաբերում է KISS-ին, դուք հավանաբար իրավացի եք ^^ Ես մտածեցի, որ այն կարող է չափազանց մշակված լինել, և արդյունքի տարբերությունը կարող է էական չլինել: Ես պարզապես հետաքրքրված եմ. 27.09.2019
  • @ElvisIsAlive Այնուհետև, ակնհայտորեն, ձեզ անհրաժեշտ կլինի գործարկել տարբեր կոդ 1-ին և 2-րդ տիրույթի համար: Կամ նույն կոդը տարբեր պարամետրերով, եթե կիրառելի է: 27.09.2019
  • Համեմատությունը միայն հինգ հնարավոր արդյունք ունի. (վեց, եթե թույլ տաք, որ միջին շեմերը համընկնեն); երկու բիթերն ունեն միայն երեք հնարավոր վիճակ: Թվարկե՛ք և կառուցե՛ք գործողությունների աղյուսակ (ութ, հնարավոր արդյունքներ) 27.09.2019
  • Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..