Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
td { color:red } и #id { color:red } имеют в принципе одну и ту же сложность. Если представить что DOM элемент внутри выглядит как-то так:struct Element {
symbol_t tag;
symbol_t id;
...
}getElementByID().body.mode1 #one { color:red }
body.mode2 #one { color:green }
body.mode1 a { color:blue }
body.mode2 a { color:orange }#one, но и т.д. до #forty-two, правильно? А составление индекса и S обращений к нему (с перебором предков или без такового) — совсем не то же, что S полных переборов (которые подразумевает Ваша формула для общего случая с N*S).<div #n0>0</div> <div #n1>1</div> <div #n2>2</div> <div #n3>3</div> ... <div #n9>9</div>
div { background:gold; }
#n1 { color:red; }
td { color:red }
#id { color:red } .cls1 { color:red } имеют одинаковую сложность (у меня это сравнение двух int).
(частично отвечает на вопрос).Представим себе HTML документ который после парсера превратился в DOM дерево состоящее из N элементов. Система стилей данного документя состоит из S CSS правил. Тогда вычислительная сложность процедуры назначения стилей всем элементам DOM выражается так:
O( N * S * D )
Где D это метрика «глубины» (depth) дерева и используемых селекторов.
O( N * (S*0.5) * D ) что c точки зрения теории равно всё тем же O( N * S * D ). Если есть сомнения то вот en.wikipedia.org/wiki/Big_O_notationbody:has(a.cool) { color:red } body:has(a.cool) отличается от body a.cool?O(N*S*D*N) -> O(N2). <div>
<div>
<div>
<a>...</a>
</div>
</div>
</div>
div:has(a) { color:red }
#id {color:red}
.cls {color:blue}
.super #id {color:red}
.super .cls {color:blue}
Про вычислительную сложность алгоритмов HTML и CSS