Ez az első három post sorozat. A harmadik cikk a Big – O formális meghatározásáról szól.
A Big-O jelölés nagyon ijesztő fogalom volt számomra. Arra gondoltam, hogy így beszéltek a” valódi ” programozók a kódjukról. Mindez azért volt ijesztő, mert a tudományos leírások (például a Wikipédia) nagyon kevés értelmet adtak nekem. Ez frusztráló, mert az alulértékeltfogalmak valójában nem olyan nehézek.,
egyszerűen fogalmazva, Big-O jelölés hogyan programozók beszélnialgorithms. Az algoritmusok egy másik ijesztő téma, amelyet be fogok fedniegy másik bejegyzés, de a mi céljainkhoz tegyük fel, hogy az” algoritmus ” azt jelenti, hogy afunction a programban (ami nem túl messze van). A függvény nagy Onotációját az határozza meg, hogy hogyan reagál a különböző bemenetekre. Hogyansokkal lassabb, ha 1000 dolog listáját adjuk meg, amelyen dolgozni kellaz 1 dolog listája helyett?
fontolja meg ezt a kódot:
def item_in_list(to_check, the_list): for item in the_list: if to_check == item: return True return False
tehát ha ezt a funkciót úgy hívjuk, mint a item_in_list(2, )
, akkor elég gyorsnak kell lennie., A lista minden egyes elemét átnézzük, és ha megtaláljuk az első érvünket a funkciónkra, akkor visszatérünk a True-ra. Ha elérjük a végetés nem találtuk meg, vissza hamis.
ennek a függvénynek a “bonyolultsága” O(n)
. Egy pillanat alatt elmagyarázom, hogy ez mit jelent, de bontsuk le ezt a matematikát. O(n)
” N”sorrendje olvasható, mert a O
függvény szintén rendelési függvényként ismert. Azt hiszem, ez azért van, mert mi csináljukmegközelítés, amely “nagyságrendekkel”foglalkozik.,
a”nagyságrendek” egy újabb matematikai kifejezés, amely alapvetően a számok osztályai közötti különbséget mutatja. Szerintem a különbség 10 és 100 között van. Ha 10 közeli barátodat és 100 embert képzelsz el, az nagy különbség. Hasonlóképpen, az 1000 és 10 000 közötti különbség elég nagy (valójában ez a különbség egy junker autó és egy enyhén használt autó között). Kiderült, hogy a közelítés, amíg te egy nagyságrenddel, te elég közel., Ha kitalálná az amachine-ban lévő gumballok számát, akkor nagyságrendben lenne, ha azt mondaná, hogy 200gumballs. 10,000 gumballs messze lenne.
1.ábra: gumball gép, amelynek gumballjai száma valószínűleg 200 nagyságrendben van.
vissza a dissectingO(n)
– hoz, ez azt mondja, hogy ha meg akarjuk ábrázolni az időt, hogy ezt a funkciót különböző méretű bemenetekkel futtassuk (például 1 elem, 2 elem, 3 elem stb.anarray), azt látjuk, hogy ezkörülbelül megfelel a tömb elemeinek számának., Ez egy lineáris gráf. Ez azt jelenti, hogy a vonal alapvetően egyenesha grafizálni kellett volna.
lehet, hogy néhányan észrevették, hogy ha a fenti kódmintában a ouritem mindig a lista első eleme volt, kódunk valóban gyors lenne! Ez igaz, de Big-O szól a hozzávetőleges legrosszabb esetbenteljesítménye csinál valamit. A fenti kód legrosszabb esetehogy a keresett dolog egyáltalán nem szerepel a listán. (Megjegyzés:a matematikai kifejezés erre a “felső határ”, ami azt jelenti, hogy beszél a matematikai határ awfulness).,
ha grafikont szeretne látni ezekhez a függvényekhez, akkor figyelmen kívül hagyja a O()
függvényt, és megváltoztatja a n
változót x
. Ezután írja be ezt azinto Wolfram Alpha-t “plot x” – ként, amely átlósan mutat. Az ok, amiért swap ki N x, hogy a grafikus programwants x
, mint a változó neve, mert megfelel a xaxis. Az X-tengely egyre nagyobb balról jobbra megfelel a nagyobb és nagyobb tömbök a függvény., Az y-axis az időt jelenti, így minél magasabb a vonal, annál lassabb.
2. ábra: Az O (n) függvény futásidejű jellemzői
tehát mi más példa erre?
fontolja meg ezt a funkciót:
def is_none(item): return item is None
Ez egy kicsit buta példa, de légy velem. Ezt a függvényt O(1)
– nek hívják, amelyet “állandó idő” – nek hívnak. Ez azt jelenti, hogy nomatter milyen nagy a bemenetünk, mindig ugyanannyi időt vesz igénybe a dolgok kiszámításához., Ha visszamész a Wolfram-hoz és , látni fogod, hogy mindig ugyanaz marad, függetlenül attól, hogy milyen messzire megyünk. Ha egy 1 millió egész számból álló listán szerepel, akkor nagyjából ugyanannyi időbe telik, mint ha egy 1 egész számból álló listát akarna átadni. Állandó időa függvény legjobb forgatókönyvének tekintik.
3.ábra: Az O(1) függvény futásidejű jellemzői
fontolja meg ezt a funkciót:
Az alábbiakban összehasonlítjuk az egyes grafikonokat referenciaként., Láthatjuk, hogy egy O(n^2)
függvény nagyon gyorsan lelassul, ahol valami, ami állandó időben működik, sokkal jobb lesz. Ez különösen akkor hasznos, amikor az adatstruktúrákról van szó, amelyeket hamarosan közzéteszek.
4.ábra: Az O(n2) vs O(n) vs O(1) funkciók összehasonlítása
Ez egy nagyon magas szintű áttekintés A Big-O jelölésről, de reménytelismerkedik a témával., Van egy tanfolyam, amelymeg lehet adni egy alaposabb képet ebben a témában, de figyelmeztetni kell, hogyez ugrik be matematikai jelölés nagyon gyorsan. Ha valami itt nincs értelme, küldjön egy e-mailt.
frissítés: arról is írtam, hogyan kell kiszámítani a Big-O.
arra gondolok, hogy könyvet írok erről a témáról. Ha ez valami, amit látni szeretne, kérjük, fejezze ki érdeklődését itt.