{"id":54389,"date":"2019-12-25T00:00:00","date_gmt":"2019-12-24T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/indeksiruemoe-binarnoe-derevo"},"modified":"2020-02-18T14:02:23","modified_gmt":"2020-02-18T11:02:23","slug":"indeksiruemoe-binarnoe-derevo","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/indeksiruemoe-binarnoe-derevo","title":{"rendered":"\u00c1rvore bin\u00e1ria index\u00e1vel","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"\u00c1rvore bin\u00e1ria index\u00e1vel\" src=\"\/wp-content\/uploads\/2019\/12\/8ceb987e007db02de04d29f33185e8ec.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Eu consegui uma tarefa do seguinte tipo. \u00c9 necess\u00e1rio implementar um cont\u00eainer de armazenamento de dados que ofere\u00e7a a seguinte funcionalidade: <\/p>\n<p><\/p>\n<ul>\n<li>inserir um novo elemento<\/li>\n<li>remover um elemento pelo n\u00famero da ordem<\/li>\n<li>obter um elemento pelo n\u00famero da ordem<\/li>\n<li>os dados s\u00e3o armazenados de forma ordenada<\/li>\n<\/ul>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Os dados s\u00e3o constantemente adicionados e removidos, a estrutura deve garantir alta velocidade de opera\u00e7\u00e3o. Primeiro, tentei implementar algo assim usando os cont\u00eaineres padr\u00e3o de <strong>std<\/strong>. Esse caminho n\u00e3o teve sucesso, e veio a compreens\u00e3o de que eu precisava implementar algo por conta pr\u00f3pria. A \u00fanica coisa que me veio \u00e0 mente foi usar uma \u00e1rvore bin\u00e1ria de busca. Pois ela atende ao requisito de inser\u00e7\u00e3o r\u00e1pida, remo\u00e7\u00e3o e armazenamento de dados de forma ordenada. Resta apenas descobrir como indexar todos os elementos e recalcular os \u00edndices quando a \u00e1rvore mudar.<\/p>\n<p><\/p>\n<pre><code class=\"cpp\">struct node_s {    \n    data_t data;\n\n    uint64_t weight; \/\/ peso do n\u00f3\n\n    node_t *left;\n    node_t *right;\n\n    node_t *parent;\n};<\/code><\/pre>\n<p><\/p>\n<p>O artigo ter\u00e1 mais imagens e teoria do que c\u00f3digo. O c\u00f3digo pode ser visto pelo link abaixo.<\/p>\n<p><\/p>\n<h2 id=\"ves\">Peso<\/h2>\n<p><\/p>\n<p>Para isso, a \u00e1rvore passou por uma pequena modifica\u00e7\u00e3o, foi adicionada uma informa\u00e7\u00e3o adicional sobre <strong>o peso<\/strong> do n\u00f3. O peso do n\u00f3 \u00e9 <strong>o n\u00famero de descendentes deste n\u00f3<\/strong> + <strong>1<\/strong> (peso de um \u00fanico elemento).<\/p>\n<p><\/p>\n<p>Fun\u00e7\u00e3o para obter o peso do n\u00f3:<\/p>\n<p><\/p>\n<pre><code class=\"cpp\">uint64_t bntree::get_child_weight(node_t *node) {\n    if (node) {\n        return node-&gt;weight;\n    }\n\n    return 0;\n}<\/code><\/pre>\n<p><\/p>\n<p>O peso de uma folha, portanto, \u00e9 <strong>0<\/strong>.<\/p>\n<p><\/p>\n<p>Agora vamos passar para uma representa\u00e7\u00e3o visual de um exemplo dessa \u00e1rvore. <strong>Na cor preta<\/strong> ser\u00e1 mostrado a chave do n\u00f3 (o valor n\u00e3o ser\u00e1 mostrado, pois n\u00e3o h\u00e1 necessidade disso), <strong>em vermelho<\/strong> \u2014 o peso do n\u00f3, <strong>em verde<\/strong> \u2014 o \u00edndice do n\u00f3.<\/p>\n<p><\/p>\n<p>Quando a \u00e1rvore est\u00e1 vazia, seu peso \u00e9 0. Vamos adicionar o elemento raiz a ela:<\/p>\n<p>\n<img decoding=\"async\" alt=\"\u00c1rvore bin\u00e1ria index\u00e1vel\" src=\"\/wp-content\/uploads\/2019\/12\/2d4145039daee26582910556a40d2a5c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>O peso da \u00e1rvore torna-se 1, o peso do elemento raiz 1. O peso do elemento raiz \u00e9 o peso da \u00e1rvore.<\/p>\n<p><\/p>\n<p>Vamos adicionar mais alguns elementos:<\/p>\n<p>\n<img decoding=\"async\" alt=\"\u00c1rvore bin\u00e1ria index\u00e1vel\" src=\"\/wp-content\/uploads\/2019\/12\/803cc4a65aa3d8a2fcb20fe325351cfa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"\u00c1rvore bin\u00e1ria index\u00e1vel\" src=\"\/wp-content\/uploads\/2019\/12\/0aa12f41b822b4bb1e9fadb7564dc461.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"\u00c1rvore bin\u00e1ria index\u00e1vel\" src=\"\/wp-content\/uploads\/2019\/12\/8566df9404037e92f53b315bc3304016.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"\u00c1rvore bin\u00e1ria index\u00e1vel\" src=\"\/wp-content\/uploads\/2019\/12\/1847e6ddffdb28d0a6d9a4949ebb5f80.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Cada vez que um novo elemento \u00e9 adicionado, descemos pelos n\u00f3s e aumentamos o contador de peso de cada n\u00f3 percorrido. Ao criar um novo n\u00f3, define-se seu peso <strong>1<\/strong>. Se um n\u00f3 com essa chave j\u00e1 existir, ent\u00e3o sobrescrevemos o valor e retornamos ao raiz, anulando as altera\u00e7\u00f5es nos pesos de todos os n\u00f3s que passamos.<br \/>\nSe houver a remo\u00e7\u00e3o de um n\u00f3, descemos e decrementamos os pesos dos n\u00f3s percorridos. <\/p>\n<p><\/p>\n<h2 id=\"indeksy\">\u00cdndices<\/h2>\n<p><\/p>\n<p>Agora vamos falar sobre como indexar os n\u00f3s. Os n\u00f3s n\u00e3o armazenam explicitamente seu \u00edndice; ele \u00e9 calculado com base no peso dos n\u00f3s. Se eles armazenassem seu \u00edndice, levaria <strong>O(n)<\/strong> mais tempo para atualizar os \u00edndices de todos os n\u00f3s ap\u00f3s cada altera\u00e7\u00e3o na \u00e1rvore.<br \/>\nVamos para uma representa\u00e7\u00e3o visual. Nossa \u00e1rvore est\u00e1 vazia; vamos adicionar o primeiro n\u00f3:<\/p>\n<p>\n<img decoding=\"async\" alt=\"\u00c1rvore bin\u00e1ria index\u00e1vel\" src=\"\/wp-content\/uploads\/2019\/12\/8a3b176f318cd077b1cf50ddf232e0da.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>O primeiro n\u00f3 tem um \u00edndice <strong>0<\/strong>, e agora podem ocorrer dois casos. No primeiro, o \u00edndice do elemento raiz mudar\u00e1; no segundo, n\u00e3o mudar\u00e1.<\/p>\n<p>\n<img decoding=\"async\" alt=\"\u00c1rvore bin\u00e1ria index\u00e1vel\" src=\"\/wp-content\/uploads\/2019\/12\/cb863be8f42385d3bbb2f46700a8cff3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Na raiz, a sub\u00e1rvore esquerda pesa 1.<\/p>\n<p><\/p>\n<p>Segundo caso:<\/p>\n<p>\n<img decoding=\"async\" alt=\"\u00c1rvore bin\u00e1ria index\u00e1vel\" src=\"\/wp-content\/uploads\/2019\/12\/35eec59a81fc8b056c7e91daa3ee508e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>O \u00edndice da raiz n\u00e3o mudou, pois o peso de sua sub\u00e1rvore esquerda permaneceu 0.<\/p>\n<p><\/p>\n<p>Como o \u00edndice do n\u00f3 \u00e9 calculado, \u00e9 o peso de sua sub\u00e1rvore esquerda + o n\u00famero passado pelo pai. Que n\u00famero \u00e9 esse? \u00c9 o contador de \u00edndices, que inicialmente \u00e9 <strong>0<\/strong>, j\u00e1 que a raiz n\u00e3o tem pai. A partir da\u00ed, tudo depende de para onde descemos: para o filho esquerdo ou para o direito. Se for para o esquerdo, o contador n\u00e3o aumenta. Se for para o direito, adicionamos o \u00edndice do n\u00f3 atual.<\/p>\n<p>\n<img decoding=\"async\" alt=\"\u00c1rvore bin\u00e1ria index\u00e1vel\" src=\"\/wp-content\/uploads\/2019\/12\/d328174370ef52c646d8689cce977302.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Por exemplo, como \u00e9 calculado o \u00edndice do elemento com a chave 8 (filho direito da raiz). Isso \u00e9 \"\u00cdndice da raiz\" + \"peso da sub\u00e1rvore esquerda do n\u00f3 com a chave 8\" + \"1\" == 3 + 2 + 1 == <strong>6<\/strong><br \/>\nO \u00edndice do elemento com a chave 6 ser\u00e1 \"\u00cdndice da raiz\" + 1 == 3 + 1 == <strong>4<\/strong><\/p>\n<p><\/p>\n<p>Portanto, para obter ou remover um elemento pelo \u00edndice, leva <strong>O(log n)<\/strong>, pois para obter o elemento desejado, primeiro precisamos encontr\u00e1-lo (descer da raiz at\u00e9 esse elemento).<\/p>\n<p><\/p>\n<h2 id=\"glubina\">Profundidade<\/h2>\n<p><\/p>\n<p>Com base no peso, tamb\u00e9m \u00e9 poss\u00edvel calcular a profundidade da \u00e1rvore. Isso \u00e9 necess\u00e1rio para o balanceamento.<br \/>\nPara isso, o peso do n\u00f3 atual deve ser arredondado para o primeiro n\u00famero em pot\u00eancia de 2 que \u00e9 maior ou igual ao peso dado e tirar seu logaritmo bin\u00e1rio. Assim, obteremos a profundidade da \u00e1rvore, desde que ela esteja balanceada. A \u00e1rvore \u00e9 balanceada ap\u00f3s a inser\u00e7\u00e3o de um novo elemento. N\u00e3o vou discutir a teoria sobre como balancear \u00e1rvores. A fun\u00e7\u00e3o de balanceamento est\u00e1 apresentada nos c\u00f3digos-fonte.<\/p>\n<p><\/p>\n<p>C\u00f3digo para converter peso em profundidade.<\/p>\n<p><\/p>\n<pre><code class=\"cpp\">\/*\n * \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0435\u0440\u0432\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0432 \u0441\u0442\u0435\u043f\u0435\u043d\u0438 2, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043b\u0438 \u0440\u043e\u0432\u043d\u043e x\n *\/\nuint64_t bntree::cpl2(uint64_t x) {\n    x = x - 1;\n    x = x | (x &gt;&gt; 1);\n    x = x | (x &gt;&gt; 2);\n    x = x | (x &gt;&gt; 4);\n    x = x | (x &gt;&gt; 8);\n    x = x | (x &gt;&gt; 16);\n    x = x | (x &gt;&gt; 32);\n\n    return x + 1;\n}\n\n\/*\n * \u0414\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u043b\u043e\u0433\u0430\u0440\u0438\u0444\u043c \u043e\u0442 \u0447\u0438\u0441\u043b\u0430\n *\/\nlong bntree::ilog2(long d) {\n    int result;\n    std::frexp(d, &amp;result);\n    return result - 1;\n}\n\n\/*\n * \u0412\u0435\u0441 \u043a \u0433\u043b\u0443\u0431\u0438\u043d\u0435\n *\/\nuint64_t bntree::weight_to_depth(node_t *p) {\n    if (p == NULL) {\n        return 0;\n    }\n\n    if (p-&gt;weight == 1) {\n        return 1;\n    } else if (p-&gt;weight == 2) {\n        return 2;\n    }\n\n    return this-&gt;ilog2(this-&gt;cpl2(p-&gt;weight));\n}<\/code><\/pre>\n<p><\/p>\n<h2 id=\"itogi\">Resultados<\/h2>\n<p><\/p>\n<ul>\n<li>a inser\u00e7\u00e3o de um novo elemento ocorre em <strong>O(log n)<\/strong><\/li>\n<li>a remo\u00e7\u00e3o de um elemento pelo n\u00famero ordinal ocorre em <strong>O(log n)<\/strong><\/li>\n<li>a obten\u00e7\u00e3o de um elemento pelo n\u00famero ordinal ocorre em <strong>O(log n)<\/strong><\/li>\n<\/ul>\n<p><\/p>\n<p>A velocidade <strong>O(log n)<\/strong> pagamos pelo fato de que todos os dados s\u00e3o armazenados em ordem classificada. <\/p>\n<p><\/p>\n<p>N\u00e3o sei onde essa estrutura pode ser \u00fatil. \u00c9 apenas um exerc\u00edcio para entender melhor como funcionam as \u00e1rvores. Obrigado pela aten\u00e7\u00e3o.<\/p>\n<p><\/p>\n<h2 id=\"ssylki\">Links<\/h2>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dvjdjvu\/bntree\">C\u00f3digo-fonte da \u00e1rvore<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<p>O projeto cont\u00e9m dados de teste para verificar a velocidade de opera\u00e7\u00e3o. A \u00e1rvore \u00e9 preenchida <strong>1000000<\/strong> de elementos. E ocorre a remo\u00e7\u00e3o, inser\u00e7\u00e3o e obten\u00e7\u00e3o sequencial de elementos <strong>1000000<\/strong> vezes. Ou seja, <strong>3000000<\/strong> opera\u00e7\u00f5es. O resultado foi bastante bom ~ 8 segundos.<\/p>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/481372\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u043e\u043f\u0430\u043b\u0430\u0441\u044c \u043c\u043d\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b: \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u043e\u043c\u0443 \u043d\u043e\u043c\u0435\u0440\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u043e\u043c\u0443 \u043d\u043e\u043c\u0435\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0435 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435 \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438 \u0443\u0434\u0430\u043b\u044f\u044e\u0442\u0441\u044f, \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0443\u044e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0432\u0435\u0449\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0438\u0437 std. \u042d\u0442\u043e\u0442 \u043f\u0443\u0442\u044c \u043d\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-54389","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u043e\u043f\u0430\u043b\u0430\u0441\u044c \u043c\u043d\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/indeksiruemoe-binarnoe-derevo\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0418\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u0435\u043c\u043e\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u043e\u043f\u0430\u043b\u0430\u0441\u044c \u043c\u043d\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/indeksiruemoe-binarnoe-derevo\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-12-24T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:02:23+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47\u00c1rvore bin\u00e1ria index\u00e1vel | ProHoster","description":"Encontrei uma tarefa do seguinte tipo.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/indeksiruemoe-binarnoe-derevo","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0418\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u0443\u0435\u043c\u043e\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0435 \u0434\u0435\u0440\u0435\u0432\u043e | ProHoster","og:description":"\u041f\u043e\u043f\u0430\u043b\u0430\u0441\u044c \u043c\u043d\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430.","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/indeksiruemoe-binarnoe-derevo","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-12-24T21:00:00+00:00","article:modified_time":"2020-02-18T11:02:23+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"54389","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 11:11:41","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:07:24","updated":"2026-01-24 11:11:41","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/54389","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=54389"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/54389\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=54389"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=54389"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=54389"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}