{"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\/es\/blog\/administrirovanie\/indeksiruemoe-binarnoe-derevo","title":{"rendered":"\u00c1rbol binario indexado","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"\u00c1rbol binario indexado\" src=\"\/wp-content\/uploads\/2019\/12\/8ceb987e007db02de04d29f33185e8ec.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Me encontr\u00e9 con una tarea del siguiente tipo. Es necesario implementar un contenedor de almacenamiento de datos que brinde la siguiente funcionalidad: <\/p>\n<p><\/p>\n<ul>\n<li>insertar un nuevo elemento<\/li>\n<li>eliminar un elemento por n\u00famero de orden<\/li>\n<li>obtener un elemento por n\u00famero de orden<\/li>\n<li>los datos se almacenan de forma ordenada<\/li>\n<\/ul>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Los datos se agregan y eliminan constantemente, la estructura debe garantizar una velocidad de trabajo r\u00e1pida. Al principio intent\u00e9 implementar algo as\u00ed utilizando los contenedores est\u00e1ndar de <strong>std<\/strong>. Este camino no tuvo \u00e9xito y lleg\u00f3 la comprensi\u00f3n de que necesitaba implementar algo por mi cuenta. Lo \u00fanico que se me ocurri\u00f3 fue usar un \u00e1rbol binario de b\u00fasqueda. Dado que cumple con el requisito de una r\u00e1pida inserci\u00f3n, eliminaci\u00f3n y almacenamiento de datos de forma ordenada. Solo quedaba pensar en c\u00f3mo indexar todos los elementos y recalcular los \u00edndices cuando el \u00e1rbol cambia.<\/p>\n<p><\/p>\n<pre><code class=\"cpp\">struct node_s {    \n    data_t data;\n\n    uint64_t weight; \/\/ peso del nodo\n\n    node_t *left;\n    node_t *right;\n\n    node_t *parent;\n};<\/code><\/pre>\n<p><\/p>\n<p>En el art\u00edculo habr\u00e1 m\u00e1s im\u00e1genes y teor\u00eda que c\u00f3digo. El c\u00f3digo se podr\u00e1 ver en el enlace de abajo.<\/p>\n<p><\/p>\n<h2 id=\"ves\">Peso<\/h2>\n<p><\/p>\n<p>Para esto, el \u00e1rbol sufri\u00f3 una peque\u00f1a modificaci\u00f3n, se agreg\u00f3 informaci\u00f3n adicional sobre <strong>peso<\/strong> del nodo. El peso de un nodo es <strong>el n\u00famero de descendientes de dicho nodo<\/strong> + <strong>1<\/strong> (peso de un elemento unitario).<\/p>\n<p><\/p>\n<p>Funci\u00f3n para obtener el peso del nodo:<\/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>Para una hoja, el peso es igual a <strong>0<\/strong>.<\/p>\n<p><\/p>\n<p>A continuaci\u00f3n, pasemos a la representaci\u00f3n visual de un ejemplo de tal \u00e1rbol. <strong>En negro<\/strong> se mostrar\u00e1 la clave del nodo (no se mostrar\u00e1 el valor, ya que no es necesario), <strong>en rojo<\/strong> \u2014 el peso del nodo, <strong>en verde<\/strong> \u2014 el \u00edndice del nodo.<\/p>\n<p><\/p>\n<p>Cuando el \u00e1rbol est\u00e1 vac\u00edo, su peso es 0. Agreguemos el elemento ra\u00edz:<\/p>\n<p>\n<img decoding=\"async\" alt=\"\u00c1rbol binario indexado\" src=\"\/wp-content\/uploads\/2019\/12\/2d4145039daee26582910556a40d2a5c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>El peso del \u00e1rbol se convierte en 1, el peso del elemento ra\u00edz es 1. El peso del elemento ra\u00edz es el peso del \u00e1rbol.<\/p>\n<p><\/p>\n<p>Agreguemos algunos elementos m\u00e1s:<\/p>\n<p>\n<img decoding=\"async\" alt=\"\u00c1rbol binario indexado\" src=\"\/wp-content\/uploads\/2019\/12\/803cc4a65aa3d8a2fcb20fe325351cfa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"\u00c1rbol binario indexado\" src=\"\/wp-content\/uploads\/2019\/12\/0aa12f41b822b4bb1e9fadb7564dc461.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"\u00c1rbol binario indexado\" src=\"\/wp-content\/uploads\/2019\/12\/8566df9404037e92f53b315bc3304016.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"\u00c1rbol binario indexado\" src=\"\/wp-content\/uploads\/2019\/12\/1847e6ddffdb28d0a6d9a4949ebb5f80.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Cada vez que se agrega un nuevo elemento, descendemos por los nodos y aumentamos el contador de peso de cada nodo atravesado. Al crear un nuevo nodo, se le asigna un peso <strong>1<\/strong>. Si ya existe un nodo con esa clave, sobrescribimos el valor y regresamos hacia arriba hasta la ra\u00edz, cancelando los cambios de pesos en todos los nodos que hemos pasado.<br \/>\nSi se elimina un nodo, descendemos y decrementamos los pesos de los nodos atravesados. <\/p>\n<p><\/p>\n<h2 id=\"indeksy\">\u00cdndices<\/h2>\n<p><\/p>\n<p>Ahora pasemos a c\u00f3mo indexar los nodos. Los nodos no almacenan expl\u00edcitamente su \u00edndice, se calcula en funci\u00f3n del peso de los nodos. Si almacenaran su \u00edndice, se requerir\u00eda <strong>O(n)<\/strong> tiempo para actualizar los \u00edndices de todos los nodos despu\u00e9s de cada modificaci\u00f3n del \u00e1rbol.<br \/>\nPasemos a una representaci\u00f3n visual. Nuestro \u00e1rbol est\u00e1 vac\u00edo, agreguemos el primer nodo:<\/p>\n<p>\n<img decoding=\"async\" alt=\"\u00c1rbol binario indexado\" src=\"\/wp-content\/uploads\/2019\/12\/8a3b176f318cd077b1cf50ddf232e0da.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>El primer nodo tiene un \u00edndice <strong>0<\/strong>, y ahora hay dos casos posibles. En el primero, el \u00edndice del elemento ra\u00edz cambiar\u00e1, en el segundo, no cambiar\u00e1.<\/p>\n<p>\n<img decoding=\"async\" alt=\"\u00c1rbol binario indexado\" src=\"\/wp-content\/uploads\/2019\/12\/cb863be8f42385d3bbb2f46700a8cff3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>La ra\u00edz tiene un sub\u00e1rbol izquierdo que pesa 1.<\/p>\n<p><\/p>\n<p>Segundo caso:<\/p>\n<p>\n<img decoding=\"async\" alt=\"\u00c1rbol binario indexado\" src=\"\/wp-content\/uploads\/2019\/12\/35eec59a81fc8b056c7e91daa3ee508e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>El \u00edndice de la ra\u00edz no ha cambiado, ya que el peso de su sub\u00e1rbol izquierdo se ha mantenido en 0.<\/p>\n<p><\/p>\n<p>C\u00f3mo se calcula el \u00edndice de un nodo, es el peso de su sub\u00e1rbol izquierdo m\u00e1s el n\u00famero que se le pasa desde el padre. \u00bfQu\u00e9 n\u00famero es este?, Es el contador de \u00edndices, que inicialmente es <strong>0<\/strong>, ya que la ra\u00edz no tiene padre. Luego, todo depende de si descendemos al hijo izquierdo o derecho. Si vamos al izquierdo, no se suma nada al contador. Si vamos al derecho, sumamos el \u00edndice del nodo actual.<\/p>\n<p>\n<img decoding=\"async\" alt=\"\u00c1rbol binario indexado\" src=\"\/wp-content\/uploads\/2019\/12\/d328174370ef52c646d8689cce977302.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Por ejemplo, \u00bfc\u00f3mo se calcula el \u00edndice del elemento con clave 8 (hijo derecho de la ra\u00edz)? Es \"\u00cdndice de la ra\u00edz\" + \"peso del sub\u00e1rbol izquierdo del nodo con clave 8\" + \"1\" == 3 + 2 + 1 == <strong>6<\/strong><br \/>\nEl \u00edndice del elemento con clave 6 ser\u00e1 \"\u00cdndice de la ra\u00edz\" + 1 == 3 + 1 == <strong>4<\/strong><\/p>\n<p><\/p>\n<p>Por lo tanto, para obtener o eliminar un elemento por \u00edndice se requiere tiempo <strong>O(log n)<\/strong>, ya que para obtener el elemento necesario primero debemos encontrarlo (descender desde la ra\u00edz hasta este elemento).<\/p>\n<p><\/p>\n<h2 id=\"glubina\">Profundidad<\/h2>\n<p><\/p>\n<p>Tambi\u00e9n se puede calcular la profundidad del \u00e1rbol en funci\u00f3n del peso. Necesaria para el balanceo.<br \/>\nPara ello, el peso del nodo actual debe redondearse al primer n\u00famero en potencia de 2 que sea mayor o igual al peso dado y tomar el logaritmo binario de este n\u00famero. De esta manera, obtendremos la profundidad del \u00e1rbol, bajo la condici\u00f3n de que est\u00e9 balanceado. El \u00e1rbol se balancea despu\u00e9s de insertar un nuevo elemento. No entrar\u00e9 en la teor\u00eda de c\u00f3mo balancear \u00e1rboles. La funci\u00f3n de balanceo se presenta en los c\u00f3digos fuente.<\/p>\n<p><\/p>\n<p>C\u00f3digo para ajustar el peso a la profundidad.<\/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>La inserci\u00f3n de un nuevo elemento ocurre en <strong>O(log n)<\/strong><\/li>\n<li>la eliminaci\u00f3n de un elemento por n\u00famero ordinal ocurre en <strong>O(log n)<\/strong><\/li>\n<li>la obtenci\u00f3n de un elemento por n\u00famero ordinal ocurre en <strong>O(log n)<\/strong><\/li>\n<\/ul>\n<p><\/p>\n<p>Velocidad <strong>O(log n)<\/strong> pagamos por el hecho de que todos los datos se almacenan en orden. <\/p>\n<p><\/p>\n<p>No s\u00e9 d\u00f3nde puede ser \u00fatil tal estructura. Solo es un ejercicio para entender mejor c\u00f3mo funcionan los \u00e1rboles. Gracias por su atenci\u00f3n.<\/p>\n<p><\/p>\n<h2 id=\"ssylki\">Enlaces<\/h2>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dvjdjvu\/bntree\">C\u00f3digo fuente del \u00e1rbol<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<p>El proyecto contiene datos de prueba para comprobar la velocidad de operaci\u00f3n. El \u00e1rbol se llena <strong>1000000<\/strong> de elementos. Y se llevan a cabo eliminaciones, inserciones y obtenciones de elementos de manera secuencial. <strong>1000000<\/strong> veces. Es decir, <strong>3000000<\/strong> operaciones. El resultado fue bastante bueno, aproximadamente 8 segundos.<\/p>\n<p>Fuente: <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\/es\/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=\"es_ES\" \/>\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\/es\/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\u00c1rbol binario indexado | ProHoster","description":"Me encontr\u00e9 con un problema de este tipo.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/indeksiruemoe-binarnoe-derevo","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/54389","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=54389"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/54389\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=54389"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=54389"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=54389"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}