{"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\/no\/blog\/administrirovanie\/indeksiruemoe-binarnoe-derevo","title":{"rendered":"Indeksert bin\u00e6rt tre","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Indeksert bin\u00e6rt tre\" src=\"\/wp-content\/uploads\/2019\/12\/8ceb987e007db02de04d29f33185e8ec.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Jeg fikk en oppgave av f\u00f8lgende art. Det er n\u00f8dvendig \u00e5 implementere en datalagringsbeholder som tilbyr f\u00f8lgende funksjonalitet: <\/p>\n<p><\/p>\n<ul>\n<li>sette inn et nytt element<\/li>\n<li>fjerne et element etter rekkef\u00f8lgen<\/li>\n<li>hente et element etter rekkef\u00f8lgen<\/li>\n<li>dataene lagres i sortert rekkef\u00f8lge<\/li>\n<\/ul>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Dataene legges kontinuerlig til og fjernes, og strukturen m\u00e5 sikre rask drift. Jeg pr\u00f8vde f\u00f8rst \u00e5 implementere noe ved \u00e5 bruke standardbeholdere fra <strong>std<\/strong>. Denne veien f\u00f8rte ikke frem, og det ble klart at jeg m\u00e5tte implementere noe selv. Det eneste som kom opp i tankene mine, var \u00e5 bruke et bin\u00e6rt s\u00f8ketre, ettersom det oppfyller kravet om rask innsetting, fjerning og lagring av data i sortert rekkef\u00f8lge. Det gjensto bare \u00e5 finne ut hvordan man skulle indeksere alle elementene og omberegne indeksene n\u00e5r treet endres.<\/p>\n<p><\/p>\n<pre><code class=\"cpp\">struct node_s {    \n    data_t data;\n\n    uint64_t weight; \/\/ vekten til noden\n\n    node_t *left;\n    node_t *right;\n\n    node_t *parent;\n};<\/code><\/pre>\n<p><\/p>\n<p>I artikkelen vil det v\u00e6re flere bilder og teori enn kode. Koden kan sees ved lenken nedenfor.<\/p>\n<p><\/p>\n<h2 id=\"ves\">Vekt<\/h2>\n<p><\/p>\n<p>For dette form\u00e5let ble treet utsatt for en liten modifikasjon, ekstra informasjon om <strong>vekten<\/strong> til noden. Vekten til noden er <strong>antall etterkommere av denne noden<\/strong> + <strong>1<\/strong> (vekten til et enkelt element).<\/p>\n<p><\/p>\n<p>Funksjonen for \u00e5 hente vekten til noden:<\/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>For et blad er vekten tilsvarende lik <strong>0<\/strong>.<\/p>\n<p><\/p>\n<p>Deretter g\u00e5r vi videre til en visuell fremstilling av et eksempel p\u00e5 et slikt tre. <strong>I svart<\/strong> farge vil n\u00f8kkelen til noden bli vist (verdien vil ikke bli vist, da det ikke er n\u00f8dvendig), <strong>i r\u00f8dt<\/strong> \u2014 vekten til noden, <strong>i gr\u00f8nt<\/strong> \u2014 indeksen til noden.<\/p>\n<p><\/p>\n<p>N\u00e5r treet v\u00e5rt er tomt, er vekten lik 0. La oss legge til rot-elementet:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Indeksert bin\u00e6rt tre\" src=\"\/wp-content\/uploads\/2019\/12\/2d4145039daee26582910556a40d2a5c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Vekten til treet blir 1, vekten til rot-elementet er 1. Vekten til rot-elementet er vekten av treet.<\/p>\n<p><\/p>\n<p>La oss legge til noen flere elementer:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Indeksert bin\u00e6rt tre\" src=\"\/wp-content\/uploads\/2019\/12\/803cc4a65aa3d8a2fcb20fe325351cfa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Indeksert bin\u00e6rt tre\" src=\"\/wp-content\/uploads\/2019\/12\/0aa12f41b822b4bb1e9fadb7564dc461.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Indeksert bin\u00e6rt tre\" src=\"\/wp-content\/uploads\/2019\/12\/8566df9404037e92f53b315bc3304016.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<img decoding=\"async\" alt=\"Indeksert bin\u00e6rt tre\" src=\"\/wp-content\/uploads\/2019\/12\/1847e6ddffdb28d0a6d9a4949ebb5f80.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Hver gang et nytt element legges til, g\u00e5r vi nedover nodene og \u00f8ker vekt-telleren for hver node vi passerer. N\u00e5r vi lager en ny node, settes vekten til ham <strong>1<\/strong>. Hvis noden med en slik n\u00f8kkel allerede eksisterer, overskriver vi verdien og g\u00e5r tilbake opp til roten, mens vi annullerer vekten til alle nodene vi har g\u00e5tt forbi.<br \/>\nHvis en node fjernes, g\u00e5r vi nedover og dekrementerer vekten til de noder vi passerer. <\/p>\n<p><\/p>\n<h2 id=\"indeksy\">Indexes<\/h2>\n<p><\/p>\n<p>La oss n\u00e5 g\u00e5 videre til hvordan man indekserer noder. Noder lagrer ikke sin indeks, den beregnes basert p\u00e5 vekten av nodene. Hadde de lagret sin indeks, ville det v\u00e6rt n\u00f8dvendig <strong>O(n)<\/strong> med tid for \u00e5 oppdatere indekser for alle noder etter hver endring i treet.<br \/>\nLa oss g\u00e5 videre til en visuell fremstilling. V\u00e5rt tre er tomt, la oss legge til den f\u00f8rste noden:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Indeksert bin\u00e6rt tre\" src=\"\/wp-content\/uploads\/2019\/12\/8a3b176f318cd077b1cf50ddf232e0da.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Den f\u00f8rste noden har indeks <strong>0<\/strong>, og n\u00e5 er det to mulige tilfeller. I det f\u00f8rste tilfellet endres roten sin indeks, i det andre tilfellet endres den ikke.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Indeksert bin\u00e6rt tre\" src=\"\/wp-content\/uploads\/2019\/12\/cb863be8f42385d3bbb2f46700a8cff3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Rots treet har venstre deltre som veier 1.<\/p>\n<p><\/p>\n<p>Andre tilfelle:<\/p>\n<p>\n<img decoding=\"async\" alt=\"Indeksert bin\u00e6rt tre\" src=\"\/wp-content\/uploads\/2019\/12\/35eec59a81fc8b056c7e91daa3ee508e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Indeksen til roten har ikke endret seg, ettersom vekten av venstre deltre forblir 0.<\/p>\n<p><\/p>\n<p>Hvordan indeksen til en node beregnes, er vekten av venstre deltre + tallet som er sendt fra forelderen. Hva er dette tallet? Det er indeks-telleren, som opprinnelig er <strong>0<\/strong>, siden roten ikke har noen forelder. Videre avhenger alt av hvilken vei vi g\u00e5r, til venstre barn eller h\u00f8yre. Hvis vi g\u00e5r til venstre, legges det ikke til noe til telleren. Hvis vi g\u00e5r til h\u00f8yre, legges indeksen til den n\u00e5v\u00e6rende noden til.<\/p>\n<p>\n<img decoding=\"async\" alt=\"Indeksert bin\u00e6rt tre\" src=\"\/wp-content\/uploads\/2019\/12\/d328174370ef52c646d8689cce977302.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>For example, how is the index of the element with the key 8 (the right child of the root) calculated? It is the \"Root index\" + \"weight of the left subtree of the node with key 8\" + \"1\" == 3 + 2 + 1 == <strong>6<\/strong><br \/>\nThe index of the element with the key 6 will be \"Root index\" + 1 == 3 + 1 == <strong>4<\/strong><\/p>\n<p><\/p>\n<p>Dermed, for \u00e5 f\u00e5, slette et element ved indeks, kreves det tid <strong>O(log n)<\/strong>, fordi for \u00e5 f\u00e5 det \u00f8nskede elementet, m\u00e5 vi f\u00f8rst finne det (g\u00e5 fra roten til dette elementet).<\/p>\n<p><\/p>\n<h2 id=\"glubina\">Dybde<\/h2>\n<p><\/p>\n<p>B\u00e5de vekten kan brukes til \u00e5 beregne dybden av treet. N\u00f8dvendig for balansering.<br \/>\nFor dette m\u00e5 vekten av den n\u00e5v\u00e6rende noden avrundes til det f\u00f8rste tallet med eksponent 2 som er st\u00f8rre enn eller lik den gitte vekten, og vi tar den bin\u00e6re logaritmen av det. Dermed f\u00e5r vi dybden av treet, under forutsetning av at det er balansert. Treet balanseres etter innsetting av et nytt element. Jeg vil ikke g\u00e5 inn p\u00e5 teorien om hvordan man balanserer tr\u00e6r. I kildekodene er det presentert en balanseringsfunksjon.<\/p>\n<p><\/p>\n<p>Koden for \u00e5 konvertere vekt til dybde.<\/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\">Resultater<\/h2>\n<p><\/p>\n<ul>\n<li>innsetting av et nytt element skjer p\u00e5 <strong>O(log n)<\/strong><\/li>\n<li>fjerning av elementet etter rekkef\u00f8lge skjer p\u00e5 <strong>O(log n)<\/strong><\/li>\n<li>henting av elementet etter rekkef\u00f8lge skjer p\u00e5 <strong>O(log n)<\/strong><\/li>\n<\/ul>\n<p><\/p>\n<p>Hastigheten <strong>O(log n)<\/strong> betaler for at alle dataene lagres i sortert form. <\/p>\n<p><\/p>\n<p>Hvor en slik struktur kan v\u00e6re nyttig \u2014 vet jeg ikke. Bare en oppgave for \u00e5 forst\u00e5 hvordan tr\u00e6r fungerer. Takk for oppmerksomheten.<\/p>\n<p><\/p>\n<h2 id=\"ssylki\">Lenker<\/h2>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/dvjdjvu\/bntree\">Kildekoden til treet<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<p>Prosjektet inneholder testdata for \u00e5 sjekke hastigheten. Treet fylles med <strong>1000000<\/strong> elementer. Og det skjer sekvensiell fjerning, innsetting og henting av elementer <strong>1000000<\/strong> ganger. Det vil si <strong>3000000<\/strong> operasjoner. Resultatet var ganske bra ~ 8 sekunder.<\/p>\n<p>Kilde: <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.5 - 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\/no\/blog\/administrirovanie\/indeksiruemoe-binarnoe-derevo\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"nn_NO\" \/>\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\/no\/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\udd47Indeksert bin\u00e6rt tre | ProHoster","description":"Jeg fikk en oppgave av f\u00f8lgende type.","canonical_url":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/indeksiruemoe-binarnoe-derevo","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nn_NO","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\/no\/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\/no\/wp-json\/wp\/v2\/posts\/54389","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/comments?post=54389"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/54389\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media?parent=54389"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/categories?post=54389"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/tags?post=54389"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}