{"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\/fr\/blog\/administrirovanie\/indeksiruemoe-binarnoe-derevo","title":{"rendered":"Arbre binaire indexable","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Arbre binaire indexable\" src=\"\/wp-content\/uploads\/2019\/12\/8ceb987e007db02de04d29f33185e8ec.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>J'ai eu une t\u00e2che de ce type. Il est n\u00e9cessaire de r\u00e9aliser un conteneur de stockage de donn\u00e9es offrant la fonctionnalit\u00e9 suivante : <\/p>\n<p><\/p>\n<ul>\n<li>ins\u00e9rer un nouvel \u00e9l\u00e9ment<\/li>\n<li>supprimer un \u00e9l\u00e9ment par son num\u00e9ro d'ordre<\/li>\n<li>obtenir un \u00e9l\u00e9ment par son num\u00e9ro d'ordre<\/li>\n<li>les donn\u00e9es sont stock\u00e9es de mani\u00e8re tri\u00e9e<\/li>\n<\/ul>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Les donn\u00e9es sont constamment ajout\u00e9es et supprim\u00e9es, la structure doit assurer une vitesse de traitement rapide. Au d\u00e9but, j'ai essay\u00e9 de r\u00e9aliser cela en utilisant les conteneurs standards de <strong>std<\/strong>. Ce chemin n'a pas \u00e9t\u00e9 couronn\u00e9 de succ\u00e8s et j'ai compris qu'il fallait que je d\u00e9veloppe quelque chose moi-m\u00eame. La seule chose qui m'est venue \u00e0 l'esprit \u00e9tait d'utiliser un arbre binaire de recherche. Puisqu'il r\u00e9pond \u00e0 l'exigence d'une insertion rapide, d'une suppression et du stockage des donn\u00e9es de mani\u00e8re tri\u00e9e. Il ne reste plus qu'\u00e0 r\u00e9fl\u00e9chir \u00e0 la mani\u00e8re d'indexer tous les \u00e9l\u00e9ments et de recalculer les index lorsque l'arbre change.<\/p>\n<p><\/p>\n<pre><code class=\"cpp\">struct node_s {    \n    data_t data;\n\n    uint64_t weight; \/\/ poids du n\u0153ud\n\n    node_t *left;\n    node_t *right;\n\n    node_t *parent;\n};<\/code><\/pre>\n<p><\/p>\n<p>L'article contiendra plus d'images et de th\u00e9orie que de code. Vous pourrez consulter le code via le lien en bas.<\/p>\n<p><\/p>\n<h2 id=\"ves\">Poids<\/h2>\n<p><\/p>\n<p>Pour cela, l'arbre a subi une l\u00e9g\u00e8re modification, ajoutant des informations suppl\u00e9mentaires sur <strong>le poids<\/strong> du n\u0153ud. Le poids d'un n\u0153ud est <strong>le nombre de descendants de ce n\u0153ud<\/strong> + <strong>1<\/strong> (poids d'un \u00e9l\u00e9ment unique).<\/p>\n<p><\/p>\n<p>La fonction pour obtenir le poids du n\u0153ud :<\/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>Pour une feuille, le poids est donc <strong>0<\/strong>.<\/p>\n<p><\/p>\n<p>Ensuite, passons \u00e0 une repr\u00e9sentation visuelle d'un tel arbre. <strong>En noir<\/strong> la cl\u00e9 du n\u0153ud sera affich\u00e9e (la valeur ne sera pas affich\u00e9e, car cela n'est pas n\u00e9cessaire), <strong>en rouge<\/strong> \u2014 le poids du n\u0153ud, <strong>en vert<\/strong> \u2014 l'indice du n\u0153ud.<\/p>\n<p><\/p>\n<p>Lorsque l'arbre est vide, son poids est \u00e9gal \u00e0 0. Ajoutons-y l'\u00e9l\u00e9ment racine :<\/p>\n<p>\n<img decoding=\"async\" alt=\"Arbre binaire indexable\" src=\"\/wp-content\/uploads\/2019\/12\/2d4145039daee26582910556a40d2a5c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Le poids de l'arbre devient 1, le poids de l'\u00e9l\u00e9ment racine est 1. Le poids de l'\u00e9l\u00e9ment racine est le poids de l'arbre.<\/p>\n<p><\/p>\n<p>Ajoutons quelques \u00e9l\u00e9ments suppl\u00e9mentaires :<\/p>\n<p>\n<img decoding=\"async\" alt=\"Arbre binaire indexable\" src=\"\/wp-content\/uploads\/2019\/12\/803cc4a65aa3d8a2fcb20fe325351cfa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Arbre binaire indexable\" src=\"\/wp-content\/uploads\/2019\/12\/0aa12f41b822b4bb1e9fadb7564dc461.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Arbre binaire indexable\" src=\"\/wp-content\/uploads\/2019\/12\/8566df9404037e92f53b315bc3304016.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Arbre binaire indexable\" src=\"\/wp-content\/uploads\/2019\/12\/1847e6ddffdb28d0a6d9a4949ebb5f80.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Chaque fois qu'un nouvel \u00e9l\u00e9ment est ajout\u00e9, nous descendons dans les n\u0153uds et augmentons le compteur de poids de chaque n\u0153ud parcouru. Lors de la cr\u00e9ation d'un nouveau n\u0153ud, son poids est d\u00e9fini <strong>1<\/strong>. Si un n\u0153ud avec cette cl\u00e9 existe d\u00e9j\u00e0, nous \u00e9craserons la valeur et reviendrons en arri\u00e8re jusqu'\u00e0 la racine, annulant les modifications des poids de tous les n\u0153uds que nous avons travers\u00e9s.<br \/>\nS'il y a suppression d'un n\u0153ud, alors nous descendons et d\u00e9cr\u00e9mentons les poids des n\u0153uds parcourus. <\/p>\n<p><\/p>\n<h2 id=\"indeksy\">Indices<\/h2>\n<p><\/p>\n<p>Nous allons maintenant aborder comment indexer les n\u0153uds. Les n\u0153uds ne stockent pas explicitement leur index, il est calcul\u00e9 en fonction du poids des n\u0153uds. S'ils stockaient leur index, il faudrait du temps <strong>O(n)<\/strong> pour mettre \u00e0 jour les index de tous les n\u0153uds apr\u00e8s chaque modification de l'arbre.<br \/>\nPassons \u00e0 une repr\u00e9sentation visuelle. Notre arbre est vide, ajoutons-y le premier n\u0153ud :<\/p>\n<p>\n<img decoding=\"async\" alt=\"Arbre binaire indexable\" src=\"\/wp-content\/uploads\/2019\/12\/8a3b176f318cd077b1cf50ddf232e0da.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Le premier n\u0153ud a un index <strong>0<\/strong>, et maintenant deux cas sont possibles. Dans le premier, l'index de l'\u00e9l\u00e9ment racine changera, dans le second, il ne changera pas.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Arbre binaire indexable\" src=\"\/wp-content\/uploads\/2019\/12\/cb863be8f42385d3bbb2f46700a8cff3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>La sous-arbre gauche de la racine p\u00e8se 1.<\/p>\n<p><\/p>\n<p>Deuxi\u00e8me cas :<\/p>\n<p>\n<img decoding=\"async\" alt=\"Arbre binaire indexable\" src=\"\/wp-content\/uploads\/2019\/12\/35eec59a81fc8b056c7e91daa3ee508e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>L'index de la racine n'a pas chang\u00e9, car le poids de son sous-arbre gauche est rest\u00e9 \u00e0 0.<\/p>\n<p><\/p>\n<p>Comment l'index d'un n\u0153ud est-il calcul\u00e9 ? C'est le poids de son sous-arbre gauche + le nombre pass\u00e9 par le parent. Quel est ce nombre ? C'est le compteur d'index, qui est initialement <strong>0<\/strong>, car la racine n'a pas de parent. Ensuite, tout d\u00e9pend de la direction o\u00f9 nous descendons, vers l'enfant gauche ou droit. Si vers le gauche, le compteur n'augmente pas. Si vers le droit, nous ajoutons l'index du n\u0153ud actuel.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Arbre binaire indexable\" src=\"\/wp-content\/uploads\/2019\/12\/d328174370ef52c646d8689cce977302.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Par exemple, comment est calcul\u00e9 l'indice de l'\u00e9l\u00e9ment avec la cl\u00e9 8 (l'enfant droit de la racine). C'est \u00ab L'indice de la racine \u00bb + \u00ab le poids du sous-arbre gauche du n\u0153ud avec la cl\u00e9 8 \u00bb + \u00ab 1 \u00bb == 3 + 2 + 1 == <strong>6<\/strong><br \/>\nL'indice de l'\u00e9l\u00e9ment avec la cl\u00e9 6 sera \u00ab L'indice de la racine \u00bb + 1 == 3 + 1 == <strong>4<\/strong><\/p>\n<p><\/p>\n<p>Par cons\u00e9quent, pour obtenir ou supprimer un \u00e9l\u00e9ment par index, il faut du temps <strong>O(log n)<\/strong>, car pour obtenir l'\u00e9l\u00e9ment n\u00e9cessaire, nous devons d'abord le trouver (descendre de la racine jusqu'\u00e0 cet \u00e9l\u00e9ment).<\/p>\n<p><\/p>\n<h2 id=\"glubina\">Profondeur<\/h2>\n<p><\/p>\n<p>Sur la base du poids, il est \u00e9galement possible de calculer la profondeur de l'arbre. N\u00e9cessaire pour l'\u00e9quilibrage.<br \/>\nPour cela, le poids du n\u0153ud actuel doit \u00eatre arrondi au premier nombre de la puissance 2 qui est sup\u00e9rieur ou \u00e9gal au poids donn\u00e9, et nous prenons le logarithme binaire de ce nombre. De cette mani\u00e8re, nous obtiendrons la profondeur de l'arbre, \u00e0 condition qu'il soit \u00e9quilibr\u00e9. L'arbre est \u00e9quilibr\u00e9 apr\u00e8s l'insertion d'un nouvel \u00e9l\u00e9ment. Je ne vais pas expliquer la th\u00e9orie sur comment \u00e9quilibrer les arbres. La fonction d'\u00e9quilibrage est pr\u00e9sent\u00e9e dans le code source.<\/p>\n<p><\/p>\n<p>Code de conversion du poids en profondeur.<\/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\">R\u00e9sultats<\/h2>\n<p><\/p>\n<ul>\n<li>L'insertion d'un nouvel \u00e9l\u00e9ment se fait en <strong>O(log n)<\/strong><\/li>\n<li>La suppression d'un \u00e9l\u00e9ment par son num\u00e9ro se fait en <strong>O(log n)<\/strong><\/li>\n<li>L'obtention d'un \u00e9l\u00e9ment par son num\u00e9ro se fait en <strong>O(log n)<\/strong><\/li>\n<\/ul>\n<p><\/p>\n<p>Vitesse <strong>O(log n)<\/strong> nous payons pour le fait que toutes les donn\u00e9es sont stock\u00e9es sous forme tri\u00e9e. <\/p>\n<p><\/p>\n<p>Je ne sais pas o\u00f9 une telle structure pourrait \u00eatre utile. C'est juste un exercice pour comprendre comment fonctionnent les arbres. Merci pour votre attention.<\/p>\n<p><\/p>\n<h2 id=\"ssylki\">Liens<\/h2>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dvjdjvu\/bntree\">Code source de l'arbre<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<p>Le projet contient des donn\u00e9es de test pour v\u00e9rifier la vitesse de fonctionnement. L'arbre se remplit <strong>1000000<\/strong> d'\u00e9l\u00e9ments. Et il se produit une suppression, une insertion et une r\u00e9cup\u00e9ration d'\u00e9l\u00e9ments successives <strong>1000000<\/strong> fois. C'est-\u00e0-dire <strong>3000000<\/strong> op\u00e9rations. Le r\u00e9sultat s'est av\u00e9r\u00e9 plut\u00f4t bon ~ 8 secondes.<\/p>\n<p>Source : <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.2 - 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\/fr\/blog\/administrirovanie\/indeksiruemoe-binarnoe-derevo\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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\udd47Arbre binaire index\u00e9 | ProHoster","description":"Je suis tomb\u00e9 sur une t\u00e2che de ce genre.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/indeksiruemoe-binarnoe-derevo","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/54389","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=54389"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/54389\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=54389"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=54389"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=54389"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}