Počítače Windows Internet

Čo znamená zložitosť? Čo je to ťažba? Použitie bitcoinu ako príkladu. O(n) - lineárna zložitosť

Čo je to ťažba? Použitie bitcoinu ako príkladu.

Ťažba kryptomien môže byť veľmi výhodnou investíciou. Aby ste však zarobili peniaze na ťažbe meny, musíte dobre rozumieť nuansám tohto odvetvia. Jedným z najdôležitejších pojmov pre každého baníka je náročnosť ťažby. Príjem priamo závisí od náročnosti ťažby. Tento článok podrobne popisuje, aká je ťažobná obtiažnosť, ako sa tvorí a na čom závisí.

Čo znamená pojem „ťažba ťažby“?

Ťažba kryptomien je proces, ktorý zahŕňa generovanie nových blokov blockchainového reťazca a zaznamenávanie transakcií. Baníkov možno prirovnať k účtovníkom, ktorí neustále pracujú na tom, aby mali svoje účtovníctvo aktuálne a zaznamenávali všetky prevody. Ale každá práca musí byť zaplatená. Baníci dostávajú od systému odmenu v podobe mincí vyťaženej meny.

Jednou z vlastností kryptomien je ich deflačný charakter. To znamená, že celkový počet vyťažených mincí nemôže presiahnuť počet určený kódom programu. Napríklad maximálny počet bitcoinov je 21 miliónov mincí. Navyše, posledný bitcoin bude vyťažený až v roku 2140. Napriek množstvu minerov sa každých 10 minút vyťaží len 12,5 BTC. Tieto mince sa rozdeľujú medzi baníkov podľa vynaloženého výpočtového výkonu. Odmena za podpísaný blok sa nezvyšuje (a dokonca sa každé 4 roky znižuje o polovicu). A ak sa zvýši počet baníkov, potom sa úmerne zníži príjem každého jednotlivého baníka. S príchodom nových a nových krypto baníkov rastie konkurencia o limitované odmeny.

Na jasnú demonštráciu tejto situácie bol zavedený vypočítaný parameter „obtiažnosti ťažby“ siete kryptomien. Náročnosť ťažby je metrika, ktorá odráža, aké ťažké je vyriešiť matematický problém podpísať blok a získať za to odmenu. Obtiažnosť sa po určitom čase automaticky prepočíta. Pre každú kryptomenu je to iné. Napríklad náročnosť ťažby Bitcoinu sa prepočítava každých 2016 blokov, ktorých ťažba trvá približne 2 týždne. Podľa kódu programu je náročnosť upravená tak, aby hľadanie ďalšieho bloku trvalo približne 10 minút bez ohľadu na počet minerov a celkový hashrate.

Obtiažnosť sa automaticky zvýši, ak hľadanie posledných blokov z roku 2016 trvalo menej ako dva týždne. To naznačuje, že celkový výpočtový výkon ťažobných zariadení sa zvýšil. Naopak signálom na zníženie zložitosti bude spomalenie hľadania blokov 2016, keďže hashrate všetkých zariadení sa znížil. Výsledkom je prísna kontrola nad rýchlosťou vydávania nových mincí.

Kde nájsť obtiažnosť ťažby. Náročnosť ťažby 10 najlepších kryptomien.

Náročnosť ťažby je dynamický ukazovateľ, ktorý sa pravidelne prepočítava. S rastúcim výpočtovým výkonom ťažobných zariadení sa zvyšuje aj zložitosť. Aktuálne informácie o stave náročnosti ťažby kryptomeny je najlepšie hľadať na oficiálnych stránkach mien. To však môže byť ťažké. Odkazy na štatistiky ťažby je niekedy ťažké nájsť aj na oficiálnych stránkach. Na zjednodušenie procesu boli vytvorené webové stránky agregátory štatistických informácií o všetkých kryptomenách. Zhromažďujú, spracúvajú a zverejňujú aktuálne dáta nielen o náročnosti ťažby, ale aj niekoľko desiatok ďalších ukazovateľov: cena, kapitalizácia, hashrate, ziskovosť, počet transakcií a pod.

Aktuálne informácie o viac ako 100 kryptomenách nájdete na týchto webových stránkach:

  • https://www.coinwarz.com/charts/difficulty-charts
  • https://bitinfocharts.com/ru/
Názov kryptomenyVeľké písmená (11/12/2017Odkaz na tabuľku obtiažnosti*
Bitcoin$102 337 870 442 https://blockchain.info/ru/charts/difficulty

https://bitinfocharts.com/ru/comparison/difficulty-btc-nmc.html

https://www.coinwarz.com/difficulty-charts/bitcoin-difficulty-chart

Bitcoin Cash $29 402 898 569 https://bitinfocharts.com/ru/comparison/bitcoin%20cash-difficulty.html

https://www.coinwarz.com/difficulty-charts/bitcoincash-difficulty-chart

Ethereum$28 727 632 599 https://bitinfocharts.com/ru/comparison/ethereum-difficulty.html

https://www.coinwarz.com/difficulty-charts/ethereum-difficulty-chart

Vlnenie$7 559 040 243 Ťažba nie je k dispozícii**
Litecoin$3 143 298 761 https://bitinfocharts.com/ru/comparison/litecoin-difficulty.html

https://www.coinwarz.com/difficulty-charts/litecoin-difficulty-chart

Pomlčka$2 603 868 832 https://bitinfocharts.com/ru/comparison/dash-difficulty.html

https://www.coinwarz.com/difficulty-charts/dash-difficulty-chart

Ethereum Classic$1 867 386 337 https://bitinfocharts.com/ru/comparison/ethereum%20classic-difficulty.html

https://www.coinwarz.com/difficulty-charts/ethereum-classic-difficulty-chart

Monero$1 745 200 256 https://bitinfocharts.com/ru/comparison/monero-difficulty.html

https://www.coinwarz.com/difficulty-charts/monero-difficulty-chart

NEO$1 703 832 000 Ťažba nie je k dispozícii**
NEM$1 595 538 000 Ťažba nie je k dispozícii**

* Upozorňujeme, že obtiažnosť ťažby sa časom mení, takže rôzne stránky môžu poskytovať rôzne údaje o náročnosti. Niekedy rozdiel dosahuje 10-20% podľa meny na dvoch rôznych agregátoroch. Ak hľadáte ukazovateľ obtiažnosti ťažby nielen na uspokojenie zvedavosti, ale aj na praktické účely, zamerajte sa na priemerné čísla. Napríklad, ak robíte prognózu zmien v obtiažnosti ťažby v budúcnosti na základe historickej dynamiky, potom je zmysluplnejšie brať údaje za posledných šesť mesiacov až rok, ako za dva až štyri týždne.

** Niektoré kryptomeny nemožno ťažiť v tradičnom zmysle. Niektorí používajú ťažbu na POS, pri ktorej sa pravidelne hromadia úroky z mincí v peňaženke. Na ťažbu POS nie je potrebné kupovať špecializované vybavenie ani míňať peniaze za elektrinu. Ostatné kryptomeny (napríklad Ripple) sú už plne vyťažené a sú len prerozdeľované medzi vlastníkov.

Ťažkosti ťažby: čo ovplyvňuje a prečo rastie.

Obtiažnosť ťažby určuje príjem baníka. Počet vyťažených mincí je nepriamo úmerný náročnosti ťažby. Ak sa náročnosť siete zvýši o 20 %, potom sa príjem z kryptomeny každého jednotlivého ťažiara zníži o 20 %.

Napríklad ASIC pre bitcoin mining antminer s7 v polovici roka 2017 (presnejšie s ťažkosťami od 1. júla 2017) vyťažil 0,06 BTC mesačne. Zložitosť bitcoinovej siete však neustále rastie. Od 1. novembra 2017 bude rovnaké zariadenie produkovať už 0,026 BTC mesačne. Príjem baníka klesol len za 4 mesiace o viac ako polovicu.

Ale ani týždenné znižovanie príjmov neznižuje atraktívnosť banských investícií. Výnosy z kryptomeny sú čiastočne kompenzované zvýšením výmenného kurzu k fiat. V našom príklade bol 1. júla kurz bitcoinu 2 400 USD a 1. novembra sa kotácie zvýšili na takmer 6 700 USD. Ukazuje sa, že príjmy fiat minerov sa zvýšili aj napriek rýchlemu nárastu náročnosti ťažby.

Toto je logika tvorcov kryptomien s dynamickou komplexnosťou. A hoci neexistuje priamy vzťah medzi cenou meny a tým, ako ťažko sa ťaží, stále existuje nepriama úmera. Predpokladá sa, že nárast zložitosti znamená zvýšenie popularity kryptomeny medzi bežnou populáciou. Niekto, kto sa dozvie o decentralizovaných menách, sa pokúsi ťažiť. To povedie k zvýšenej zložitosti. Zároveň je však vysoko pravdepodobné, že sa zvýši dopyt, a teda aj výmenný kurz. Ukazuje sa, že rastúci záujem v spoločnosti stimuluje tak rast výmenného kurzu, ako aj zvyšovanie náročnosti ťažby.

Z technického hľadiska indikátor obtiažnosti ťažby závisí od:

  • sieťový hashrate (počet a výpočtový výkon zariadení všetkých baníkov);
  • rýchlosť ťažby 2016 blokov;

Všetky tri ukazovatele spolu priamo súvisia. Rast sieťového hashrate znamená, že do ťažobného priemyslu vstúpili noví účastníci a konkurencia sa zvýšila. So zvyšujúcim sa počtom baníkov sa znižuje čas strávený hľadaním ďalšieho bloku. Po bloku 2016 sa náročnosť ťažby prepočítava. Zmena indikátora je opísaná nasledujúcim vzorom:

Ťažkosti s ťažbou bitcoínov.

Nárast zložitosti je spôsobený viacerými faktormi, ktoré spolu úzko súvisia:

  • vývoj čipov ASIC a vstup produktívnejších modelov na trh;
  • popularizácia Bitcoinu a prílev nových ťažiarov;
  • vysoká návratnosť investícií do ťažby v dôsledku rýchleho rastu výmenného kurzu Bitcoinu voči doláru;
  • prenos výpočtovej sily z iných mien, ktorých kotácie klesajú alebo rastú pomalšie ako bitcoin;
  • iné faktory;

Náročnosť ťažby Bitcoinu sa od roku 2016 zvýšila 5-6 krát. Rast pokračoval takmer bez prerušenia. Len v auguste 2017 došlo prvýkrát po roku k poklesu ukazovateľa. Možno to ovplyvnil augustový SegWit Bitcoinu, ktorý prinútil niektorých ťažiarov preniesť silu na altcoiny.

6 odpovedí

Zložitosť je vždy špecifikovaná vo vzťahu ku konkrétnej premennej alebo množine premenných. Takže keď norma hovorí o konštantnom vkladaní času, hovoríme o konštantnom čase vzhľadom na počet prvkov v zozname. To znamená, že vkladanie O(1) znamená, že počet prvkov prítomných v zozname neovplyvňuje celkovú zložitosť vkladania. Zoznam môže obsahovať 500 alebo 5 000 000 prvkov a zložitosť operácie vkladania bude rovnaká.

Napríklad std::list má O(1) vloženia a vymazania; počet prvkov v zozname nezávisí od zložitosti vkladania. Zložitosť prideľovania pamäte však môže závisieť od počtu vecí, ktoré už boli pridelené. Ale keďže O(1) hovorí o počte prvkov v zozname, nezahŕňa to. A to sa nepredpokladá, pretože potom by sme merali zložitosť pamäťového alokátora, nie dátovú štruktúru.

Stručne povedané: toto je ďalší rozmer.

To znamená, že môžeme implementovať náš algoritmus tak silno, ako len chceme, vrátane takého, kde čas nie je v skutočnosti konštantný v žiadnom pragmatickom zmysle, ale kde sme rešpektovali počet „operácií“ na obsiahnutých objektoch.

Zložitosť nie je špecifikovaná vo vzťahu k implementáciám. Je špecifikovaný vo vzťahu k algoritmom. Nezáleží na tom, že kontext sa môže prepínať, pretože runtime nie je náročná úloha.

Ako je uvedené vyššie, môžete implementovať std::list s alokátorom pamäte, ktorý je O(log(n)) vzhľadom na vymazania (kde n je počet alokácií). Vymazanie prvku v zozname však bude stále O(1) vzhľadom na počet prvkov v zozname.

Nezamieňajte si zložitosť s celkovým výkonom. Cieľom zložitosti je mať spoločnú metriku pre algoritmy týkajúce sa rôznych premenných. Cieľom programátora, ktorý chce, aby jeho kód bežal rýchlo, je nájsť rozumnú implementáciu algoritmu, ktorý zodpovedá zložitosti potrebnej na dosiahnutie tohto výkonu.

Zložitosť je nástroj na hodnotenie účinnosti algoritmu. Zložitosť neznamená, že môžete prestať myslieť.

Čo presne znamená "odpisy"?

Ako som pochopil, konštantná zložitosť znamená, že operácia je O(1): vopred môžete povedať, koľko atómových operácií (čítanie/zápis, montážne pokyny, čokoľvek) sa vykoná. A tento odhad je spoločnou hranicou pre všetky možné stavy cieľového objektu. Je tu jeden háčik: v prostredí s viacerými vláknami nemôžete predpovedať prepínače toku, takže môžete iba uvažovať o uplynutom čase prevádzky v operačnom systéme v reálnom čase.

O amortizovanej konštantnej zložitosti je to ešte slabšie. Napísaním súhrnu odpovedí to zabezpečí, že vaša operácia v priemere pokračuje. To znamená, že počet elementárnych operácií pre N následných operácií je O(N) . To znamená, že počet elementárnych operácií je približne O(1), ale umožňuje niektoré zriedkavé skoky. Napríklad pridanie prvku na chvost vektora je zvyčajne trvalé, ale niekedy je potrebné ďalšie ťažké zdvíhanie; mať amortizovaný konštantný čas znamená, že dodatočná operácia sa nevykonáva tak často a trvá predvídateľne veľa času, takže celkový čas operácie N je stále O(N) . Samozrejme, rovnaký háčik platí aj tu.

Takže, aby som odpovedal na vaše otázky:

  • Komplexné záruky štandardu sa skutočne vzťahujú len na počet inštrukcií strojového kódu, ktoré sú potrebné na vykonanie operácie, a neznamenajú, že čas vykonania je nejakým spôsobom obmedzený. (V skutočnosti až donedávna C++ nemal ani ukazovateľ témy súvisiacej s jazykom, takže zo štandardnej perspektívy C++ bol v tom čase program spustený na špecializovanom stroji C++.)
  • Odpisy sú „v priemere obmedzené na konštantu“, čo sa zvyčajne vyskytuje v prípade takmer vždy konštantnej obmedzenej doby prevádzky s niektorými pomerne zriedkavými odchýlkami.

Upraviť:
Môžete si pozrieť napríklad sekciu 23.1 štandardu C++:

Všetky požiadavky na zložitosť v tejto časti sú špecifikované výlučne z hľadiska počtu operácií na obsiahnutých objektoch.

keď sa o operácii hovorí, že má „konštantnú zložitosť“, zvyčajne sa to týka predovšetkým časovej zložitosti. Mohol by som sa odvolávať na priestorovú zložitosť, ale ak je to tak, bolo by to výslovne uvedené ako normálne.

Zložitosť operácie teraz znamená, koľko času na dokončenie operácie sa zvýši, keď sa zvýši počet prvkov spracovaných v operácii. Pre operáciu s konštantnou zložitosťou bude funkcia trvať rovnako dlho, či už sa spracuje nula položiek alebo desať miliónov položiek.

    swap() je konštantná zložitosť, pretože bez ohľadu na to, koľko prvkov je vo vektore, operácia bude trvať rovnako dlho.

    kliknite na zoznam. je konštantná zložitosť, pretože aj keď môže pridelenie nového prvku trvať určitý čas, tento čas pridelenia sa nezvyšuje, pretože zoznam obsahuje 10 miliónov prvkov (aspoň nie v zmysle algoritmu – samozrejme, ak sa zväčší voľná pamäť a viac vyčerpané, prideľovanie môže trvať dlhšie, ale z hľadiska algoritmu existuje nekonečné množstvo pamäte).

    push_back() na vektore sa nazýva „amortizovaná“ konštanta, pretože v normálnom prípade, keď by k prerozdeleniu nemalo dôjsť, množstvo času, ktorý operácia zaberie, nesúvisí s tým, koľko prvkov je už vo vektore – rovnaké množstvo čas je potrebný na pridanie nového prvku k vektoru s dĺžkou nula relatívne k vektoru s dĺžkou 10 miliónov. Ak je však potrebné vektor prerozdeliť, bude potrebné mať kópiu existujúcich prvkov, pričom nejde o konštantnú operáciu – ide o lineárnu operáciu. Predpokladá sa však, že vektor je navrhnutý tak, aby k realokáciám dochádzalo zriedkavo, takže ich možno amortizovať mnohými operáciami push_back().

ale robiť push_back na vektore je ešte nepredvídateľnejšie. Väčšinu času to bude veľmi rýchle, ale z času na čas bude potrebné prerozdeliť priestor pre všetky údaje a skopírovať každý prvok na nové miesto. Takže je menej predvídateľný z hľadiska času vykonávania ako samotný list::push_front, ale stále sa nazýva perzistentný (amortizovaný). Pridanie veľkého množstva údajov do vektora bude v priemere vyžadovať zložitosť, ktorá je nezávislá od pridaného množstva, a preto sa nazýva čas „amortizovanej konštanty“. (Správny?)

Zložitosť je O(1) - konštanta (berúc do úvahy časovú zložitosť) znamená, že čas dokončenia algoritmu nesúvisí s veľkosťou problému.

Takže vyhľadávanie hodnoty v hašovanej štruktúre je O(1), pretože čas, ktorý je potrebný na to, je nezávislý od počtu jej hodnôt. To isté však neplatí pre prepojený zoznam, pretože musíme skenovať hodnoty (ktorých počet sa mení so zvyšujúcim sa počtom prvkov), aby sme našli našu hodnotu.

V prípade 3, keď kopíruje každý prvok, nejde o operáciu O(1), ale o operáciu O(N) (väčšinou je to však O(1), takže je zvyčajne konštantná). Amortizácia to zohľadňuje tým, že poznamenáva, že algoritmus sa zvyčajne dokončí v čase O(1) a zriedkavo spadá do tohto prípadu O(N).

Pravdepodobne ste sa viackrát stretli so zápismi ako O(log n) alebo ste počuli frázy ako „logaritmická výpočtová zložitosť“ adresované niektorým algoritmom. A ak stále nerozumiete, čo to znamená, tento článok je pre vás.

Hodnotenie obtiažnosti

Zložitosť algoritmov sa zvyčajne meria časom ich vykonávania alebo využitím pamäte. V oboch prípadoch zložitosť závisí od veľkosti vstupných dát: pole 100 prvkov bude spracované rýchlejšie ako podobné 1000. Málokoho však zaujíma presný čas: závisí od procesora, typu dát , programovací jazyk a mnoho ďalších parametrov. Dôležitá je len asymptotická zložitosť, teda zložitosť, keď veľkosť vstupných údajov smeruje k nekonečnu.

Povedzme, že nejaký algoritmus potrebuje vykonať 4n 3 + 7n podmienených operácií na spracovanie n prvkov vstupných údajov. Ako sa n zvyšuje, konečný prevádzkový čas bude podstatne viac ovplyvnený zvýšením n na kocku ako jeho vynásobením 4 alebo pridaním 7n. Potom hovoria, že časová zložitosť tohto algoritmu je O(n 3), t.j. závisí kubicky od veľkosti vstupných údajov.

Používanie veľkého O (alebo tzv. O-notácie) pochádza z matematiky, kde sa používa na porovnávanie asymptotického správania funkcií. Formálne O(f(n)) znamená, že čas chodu algoritmu (alebo množstvo obsadenej pamäte) rastie v závislosti od veľkosti vstupných dát nie rýchlejšie ako nejaká konštanta vynásobená f(n) .

Príklady

O(n) - lineárna zložitosť

Takúto zložitosť má napríklad algoritmus na nájdenie najväčšieho prvku v nezoradenom poli. Budeme musieť prejsť všetkých n prvkov poľa, aby sme pochopili, ktorý z nich je maximálny.

O(log n) - logaritmická zložitosť

Najjednoduchším príkladom je binárne vyhľadávanie. Ak je pole zoradené, môžeme pomocou metódy halvingu skontrolovať, či obsahuje konkrétnu hodnotu. Skontrolujeme stredný prvok, ak je väčší ako ten, ktorý hľadáme, tak druhú polovicu poľa zahodíme – určite tam nie je. Ak je to menej, tak naopak - počiatočnú polovicu vyhodíme. A tak budeme pokračovať v delení na polovicu a nakoniec skontrolujeme log n prvkov.

O(n 2) - kvadratická zložitosť

Takúto zložitosť má napríklad algoritmus triedenia vkladania. V kanonickej implementácii pozostáva z dvoch vnorených slučiek: jedna na prechádza celým poľom a druhá na nájdenie miesta pre ďalší prvok v už zoradenej časti. Počet operácií bude teda závisieť od veľkosti poľa ako n * n, t.j. n 2.

Existujú aj iné hodnotenia obtiažnosti, ale všetky sú založené na rovnakom princípe.

Stáva sa tiež, že čas chodu algoritmu vôbec nezávisí od veľkosti vstupných údajov. Potom sa zložitosť označí ako O(1) . Ak chcete napríklad určiť hodnotu tretieho prvku poľa, nemusíte si prvky pamätať ani ich mnohokrát prechádzať. Vždy stačí počkať na tretí prvok vo vstupnom dátovom toku a toto bude výsledok, ktorého výpočet pre akékoľvek množstvo dát trvá rovnako dlho.

To isté platí pre hodnotenie pamäte, keď je to dôležité. Algoritmy však môžu pri zvyšovaní veľkosti vstupných údajov využívať podstatne viac pamäte ako iné, no stále bežia rýchlejšie. A naopak. Pomáha to pri výbere najlepších spôsobov riešenia problémov na základe aktuálnych podmienok a požiadaviek.